git cherry-pick
Appliquer les modifications de commits précis sur la branche courante
La commande 'git cherry-pick' applique les modifications introduites par un ou plusieurs commits existants sur la branche courante, en créant un nouveau commit pour chacun. Contrairement à merge ou rebase, qui travaillent sur des branches entières, cherry-pick permet de copier des commits précis de façon sélective. C’est précieux pour reporter des hotfixes sur des branches de release, récupérer des commits perdus ou apporter certaines fonctionnalités d’une branche à une autre sans tout fusionner. Chaque commit cherry-pické reçoit un nouveau SHA - c’est une copie, pas un déplacement. Cherry-pick est chirurgical et précis : vous contrôlez finement quelles modifications arrivent sur votre branche.
Synopsis
git cherry-pick [--edit] [-n] [-m <parent-number>] [-s] [-x] [--ff] [-S[<keyid>]] <commit>...
git cherry-pick (--continue | --skip | --abort | --quit)Options
Choisir la bonne option
Comparer git cherry-pick aux commandes voisines
Savoir quand utiliser cherry-pick plutôt que merge, rebase ou revert
| Commande | Aspect | Cherry-pick | Autre commande |
|---|---|---|---|
Scope | Seulement certains commits | Merge : toute la branche / Rebase : toute la branche | |
Creates new commits | Oui - nouveau SHA, même contenu | Merge : commit de fusion / Rebase : réécrit tout | |
Original stays | Oui - l’original n’est pas touché | Merge : oui / Rebase : orphelin | |
Use case | Backport, report sélectif | Intégrer des branches complètes | |
History effect | Crée des modifications en double | Préserve ou rend linéaire | |
Conflicts | Par commit pendant le pick | Au point de fusion ou par commit du rebase |
Exemples de workflows
git checkout release-1.0Passer sur la branche de release
git log main --onelineTrouver le hash du commit du correctif
git cherry-pick -x abc123Appliquer le correctif avec la référence d’origine
git push origin release-1.0Pousser le correctif reporté
git checkout mainPasser sur la branche main
git log feature --onelineRelire les commits de la branche de fonctionnalité
git cherry-pick abc123 def456Ne prendre que les commits prêts
git push origin mainPousser les commits choisis
git reflogTrouver le hash du commit dans le reflog
git checkout mainPasser sur la branche cible
git cherry-pick abc123Appliquer le commit orphelin
git checkout target-branchPasser sur la branche de destination
git cherry-pick A^..CAppliquer les commits A à C (inclus)
git log --onelineVérifier que les commits ont été appliqués
Dépannage
"commit is a merge but no -m option was given"
Cause : Vous essayez de cherry-picker un commit de fusion sans préciser quel parent
Utilisez -m 1 ou -m 2 pour préciser le parent de la ligne principale
git cherry-pick -m 1 <merge-commit>Conflits pendant un cherry-pick
Cause : Les modifications entrent en conflit avec votre branche courante
Résolvez les conflits dans les fichiers, faites git add, puis git cherry-pick --continue. Ou abandonnez avec --abort
git add <resolved-files> && git cherry-pick --continue"The previous cherry-pick is now empty"
Cause : Les modifications du commit existent déjà dans votre branche
Lancez 'git commit --allow-empty' pour l’enregistrer quand même, ou 'git cherry-pick --skip' pour le sauter
git cherry-pick --skipLe cherry-pick a créé des commits en double
Cause : Les mêmes modifications existent maintenant sous forme de commits différents sur des branches différentes
C’est le comportement attendu. Utilisez l’option -x pour documenter le lien
git cherry-pick -x <commit>Le mauvais commit a été cherry-pické
Cause : Vous avez pris le mauvais SHA de commit
S’il n’est pas poussé : git reset --hard HEAD~1. S’il est poussé : git revert du commit cherry-pické
git reset --hard HEAD~1Le cherry-pick semble sans effet
Cause : Le commit est peut-être vide ou ses modifications déjà appliquées
Regardez git diff HEAD~1 pour voir les modifications réelles
git diff HEAD~1Astuces et pièges
Bonnes pratiques
- ✓Utilisez -x pour les backports afin d’ajouter la référence '(cherry picked from commit ...)' au message de commit
- ✓Faites les cherry-picks dans l’ordre chronologique - les commits dépendants doivent être appliqués du plus ancien au plus récent pour éviter les conflits
- ✓Préférez merge pour les branches partagées - cherry-pick crée des commits en double alors que merge préserve l’historique
- ✓Testez après un cherry-pick - le commit peut fonctionner dans son contexte d’origine mais échouer dans le nouveau
- ✓Documentez les cherry-picks dans les messages de commit avec l’option -e pour expliquer pourquoi le commit a été copié
- ✓Utilisez --no-commit pour regrouper des picks liés en un seul commit plus propre
- ✓Pensez à git cherry plutôt qu’à log pour trouver les commits pas encore appliqués
- ✓Lors d’un backport, incluez toujours le hash du commit d’origine dans le message pour la traçabilité
Erreurs fréquentes
- ✗Oublier -m pour les commits de fusion. Cherry-picker un commit de fusion sans '-m 1' ou '-m 2' échoue - il faut préciser par rapport à quel parent calculer le diff.
- ✗Ne pas indexer les fichiers résolus avant --continue. Il faut lancer 'git add' sur les fichiers résolus avant 'git cherry-pick --continue'.
- ✗S’attendre au même hash de commit. Cherry-pick crée de NOUVEAUX commits avec de nouveaux SHA - il copie des modifications, il ne déplace pas de commits.
- ✗Cherry-picker des commits déjà appliqués. Cela provoque des conflits ou des commits vides - vérifiez d’abord avec 'git log'.
- ✗Choisir les commits dans le mauvais ordre. Les commits dépendants doivent être pris du plus ancien au plus récent, sinon vous aurez des conflits.
- ✗Cherry-picker sur des branches publiques crée des commits en double quand d’autres ont l’original - préférez merge pour les branches partagées.
FAQ
Non. Cherry-pick crée un NOUVEAU commit avec les mêmes modifications mais un SHA différent. Le commit d’origine reste où il était.
Le hash d’un commit Git dépend du contenu, du parent, de l’auteur, de la date et du message. Cherry-pick garde l’auteur et la date d’auteur, mais le parent et la date du committer changent, donc le hash change même si les modifications sont identiques.
Oui ! Listez-les : git cherry-pick A B C, ou utilisez des plages : git cherry-pick A^..C (inclut A et C).
Utilisez l’option -m : git cherry-pick -m 1 <merge-commit>. Le nombre indique quel parent est la ligne principale (en général 1).
A..B exclut A (les commits après A jusqu’à B). A^..B inclut A (les commits de A à B inclus).
S’il n’est pas poussé : git reset --hard HEAD~1. S’il est poussé : git revert <commit> pour créer un commit d’annulation.
Cherry-pick pour des commits précis. Rebase pour déplacer des branches entières. Si vous avez besoin de la plupart des commits d’une branche, rebase est plus propre.