Revert et cherry-pick : réparer et récupérer en équipe
Le gain du jour : deux outils pour les situations où
restoreet--amend(leçon 3) ne suffisent plus, parce que le commit est déjà partagé avec l’équipe.git revertannule un commit publié sans réécrire l’historique ;git cherry-pickré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 »).
| Commande | Effet |
|---|---|
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
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)
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.
| Commande | Effet |
|---|---|
git cherry-pick <commit> | Rejoue un commit précis sur la branche courante, comme un nouveau 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)
À toi de jouer — dans ton vrai dépôt
cd ~/Workspaces/pythons/git-entrainement
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à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 branchesNettoie :
git branch -d correctif-urgentGit peut refuser (
not fully merged) puisque le WIP n’a jamais rejointmain— c’est normal et voulu.git branch -D correctif-urgentforce la suppression si tu es sûr de vouloir jeter ce travail inachevé.Boucle d’entraînement (2 fois, de mémoire) : un commit buggé →
revert; une branche avec un bon commit et un WIP →cherry-pickdu 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.