← Git & GitHub : du premier commit au travail en équipe

Revert et cherry-pick : réparer et récupérer en équipe

≈ 20 minutes · Jalon M7 · Prérequis : Les conflits de merge, sans paniquer

Le gain du jour : deux outils pour les situations où restore et --amend (leçon 3) ne suffisent plus, parce que le commit est déjà partagé avec l’équipe. git revert annule un commit publié sans réécrire l’historique ; git cherry-pick récupère un commit précis sur une autre branche, sans tout fusionner.

Échauffement — de mémoire, sans tricher

0. Pourquoi ne doit-on jamais réécrire (--amend, ou plus tard rebase) un commit déjà poussé sur GitHub ?

Le problème : réparer sans réécrire

Ton commit buggé est déjà sur GitHub, un coéquipier l’a peut-être déjà récupéré. --amend est interdit ici (leçon 3). Pourtant il faut bien annuler ce commit. Solution : au lieu d’effacer ou de remplacer le commit fautif, on en ajoute un nouveau qui fait exactement l’inverse (Pro Git, « Annuler des actions »).

CommandeEffet
git revert <commit>Crée un nouveau commit qui annule les changements d’un commit passé
A───B───C            avant : C introduit un bug
A───B───C───D  ◀ D = "Revert C" — annule C, mais C reste visible dans l'historique
revert n’est pas restore, ni amend

restore et --amend agissent avant publication, sur des commits encore locaux — ils peuvent se permettre de faire disparaître une erreur. revert agit après publication : il ne supprime rien, il ajoute une correction honnête. C’est la seule commande d’annulation sûre une fois que le commit est parti sur GitHub.

Entraîne-toi ici — terminal simulé (revert)

🖥️ Terminal d'entraînement Objectif : annuler un commit déjà partagé, sans réécrire l’historique.
(main) $

Récupérer un seul commit : cherry-pick

Autre situation : une branche correctif-urgent contient plusieurs commits, mais un seul d’entre eux — un correctif — est prêt pour main. Pas question de merger toute la branche, qui contient aussi du travail inachevé. git cherry-pick rejoue un seul commit précis sur la branche où tu es, sous la forme d’un nouveau commit.

CommandeEffet
git cherry-pick <commit>Rejoue un commit précis sur la branche courante, comme un nouveau commit
Retrouver le hash d’un commit

cherry-pick (comme revert) a besoin d’un identifiant de commit. git log --oneline en affiche un raccourci à gauche de chaque ligne ; git log --all --oneline les montre pour toutes les branches, même celle où tu n’es pas — pratique pour repérer le commit à récupérer avant de basculer dessus.

Entraîne-toi ici — terminal simulé (cherry-pick)

🖥️ Terminal d'entraînement Objectif : récupérer UN SEUL commit d’une autre branche, pas toute la branche.
(main) $

À toi de jouer — dans ton vrai dépôt

cd ~/Workspaces/pythons/git-entrainement
  1. Revert. Commite un bug exprès, puis annule-le proprement :

    echo "seuil = 1 / 0  # calcul cassé" >> analyse.py
    git add analyse.py
    git commit -m "Ajoute un calcul (buggé par erreur)"
    git log --oneline               # repère le hash du commit buggé
    git revert <hash>                # un éditeur s'ouvre sur le message : garde-le, quitte (:wq ou Ctrl+X)
    git log --oneline               # le bug ET son annulation sont visibles, rien n'a disparu
    cat analyse.py                  # la ligne buggée n'est plus là
  2. Cherry-pick. Crée une branche avec un correctif utile et un WIP à ne pas emporter :

    git switch -c correctif-urgent
    echo "TIMEOUT = 30" > config_reseau.py
    git add config_reseau.py
    git commit -m "Corrige le timeout réseau"
    
    echo "en cours de reflexion..." > idee.py
    git add idee.py
    git commit -m "WIP : ne pas emporter celui-ci"
    
    git log --oneline               # note le hash du commit de correctif (le premier, pas le WIP)
    git switch main
    git cherry-pick <hash-du-correctif>
    ls                               # config_reseau.py est là, idee.py n'y est jamais arrivé
    git log --oneline --all --graph # visualise : le correctif existe maintenant sur les deux branches
  3. Nettoie :

    git branch -d correctif-urgent

    Git peut refuser (not fully merged) puisque le WIP n’a jamais rejoint main — c’est normal et voulu. git branch -D correctif-urgent force la suppression si tu es sûr de vouloir jeter ce travail inachevé.

  4. Boucle d’entraînement (2 fois, de mémoire) : un commit buggé → revert ; une branche avec un bon commit et un WIP → cherry-pick du seul bon commit.

Vérifie ta compréhension

1. Un commit buggé a été poussé hier sur GitHub. Que fais-tu pour le corriger ?

2. Après un git revert, que devient le commit fautif dans git log ?

3. Une branche a 3 commits, un seul t'intéresse pour main. Quelle commande ?

Pour aller plus loin

📖 Sources principales : Pro Git (fr) — « Annuler des actions » (section git revert) et la documentation officielle git-cherry-pick. En secours au quotidien : Oh Shit, Git!?! (fr).

🗂 Fiche mise à jour : Commandes Git — antisèche.