git cherry-pick copie un commit précis sur votre branche actuelle.
Au lieu de fusionner toute une branche, vous sélectionnez uniquement les
commits dont vous avez besoin. C’est l’outil de prédilection pour les
backports de correctifs et les hotfixes ciblés.
Prérequis : Les branches en bref et Merge et conflits.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »- Comprendre le mécanisme du cherry-pick et pourquoi les hashes changent
- Appliquer un ou plusieurs commits d’une branche vers une autre
- Résoudre les conflits qui surviennent lors d’un cherry-pick
- Utiliser les options clés :
-n,-x,--continue,--abort
Le principe
Section intitulée « Le principe »Imaginons que feature contient un correctif (commit C6) dont vous
avez besoin sur main, mais la feature n’est pas encore terminée :
Avant cherry-pick : C4 ← C5 (main ← HEAD) /C1 ← C2 ← C3 \ C6 ← C7 (feature)
Après git cherry-pick C6 : C4 ← C5 ← C6' (main ← HEAD) /C1 ← C2 ← C3 \ C6 ← C7 (feature)C6' est un nouveau commit avec un hash différent mais le même
contenu que C6. Le commit original reste intact sur feature.
Cherry-pick en pratique
Section intitulée « Cherry-pick en pratique »-
Identifiez le hash du commit à récupérer :
Fenêtre de terminal git log feature --onelineb3d7f2a (feature) Ajouter la validation emaila1c4e5f Corriger le timeout API ← celui-ci -
Basculez sur la branche cible :
Fenêtre de terminal git switch main -
Cherry-pickez le commit :
Fenêtre de terminal git cherry-pick a1c4e5fGit applique les modifications et crée un nouveau commit sur
main. -
Vérifiez le résultat :
Fenêtre de terminal git log --oneline -3
Cherry-pick de plusieurs commits
Section intitulée « Cherry-pick de plusieurs commits »Commits consécutifs (plage)
Section intitulée « Commits consécutifs (plage) »# Du commit A (exclu) au commit D (inclus)git cherry-pick A..D
# Ou du commit A (inclus) au commit D (inclus)git cherry-pick A^..DCommits non consécutifs
Section intitulée « Commits non consécutifs »git cherry-pick a1c4e5f b3d7f2a e8f9a0bGit les applique dans l’ordre donné, un par un.
Options utiles
Section intitulée « Options utiles »| Option | Effet |
|---|---|
--no-commit (-n) | Applique les modifications sans commiter (staging) |
--edit (-e) | Ouvre l’éditeur pour modifier le message |
-x | Ajoute (cherry picked from commit ...) au message |
--signoff (-s) | Ajoute votre Signed-off-by au message |
--no-commit : combiner plusieurs cherry-picks
Section intitulée « --no-commit : combiner plusieurs cherry-picks »--no-commit applique les modifications dans le staging sans créer de
commit. Utile pour combiner plusieurs cherry-picks en un seul commit :
git cherry-pick --no-commit a1c4e5fgit cherry-pick --no-commit b3d7f2agit commit -m "Backport: timeout API + validation email"-x : traçabilité
Section intitulée « -x : traçabilité »L’option -x ajoute automatiquement la référence du commit source
dans le message :
Corriger le timeout API
(cherry picked from commit a1c4e5f7d8b9c0e1f2a3b4c5d6e7f8a9b0c1d2e3)Résoudre un conflit en cherry-pick
Section intitulée « Résoudre un conflit en cherry-pick »Si le cherry-pick entre en conflit, Git s’arrête (comme pour un merge) :
-
Éditez les fichiers en conflit — mêmes marqueurs
<<<<<<<,=======,>>>>>>>qu’un merge -
Marquez comme résolu :
Fenêtre de terminal git add fichier-en-conflit.txt -
Continuez le cherry-pick :
Fenêtre de terminal git cherry-pick --continue
Pour abandonner le cherry-pick :
git cherry-pick --abortCas d’usage : le backport
Section intitulée « Cas d’usage : le backport »Le scénario le plus fréquent est le backport : appliquer un
correctif de main vers une branche de release antérieure.
# Correctif mergé sur maingit switch release/2.xgit cherry-pick -x abc1234git pushLe correctif est maintenant sur la release 2.x sans intégrer toutes
les nouveautés de main.
Cherry-pick vs merge vs rebase
Section intitulée « Cherry-pick vs merge vs rebase »| Critère | Cherry-pick | Merge | Rebase |
|---|---|---|---|
| Granularité | 1 commit précis | Branche entière | Branche entière |
| Crée un nouveau commit | Oui (nouveau hash) | Oui (commit de merge) | Oui (hash réécrits) |
| Historique | Commit dupliqué | Préservé avec losange | Linéaire |
| Cas d’usage | Backport, hotfix | Intégration standard | Mise à jour de branche |
Quand choisir ?
| Situation | Commande recommandée |
|---|---|
| Intégrer une branche feature complète | git merge |
Mettre à jour votre branche sur main | git rebase |
| Backporter un correctif vers une ancienne branche | git cherry-pick |
Appliquer un hotfix de main sur release/1.x | git cherry-pick |
| Récupérer un seul commit depuis une branche parallèle | git cherry-pick |
Dépannage : problèmes courants
Section intitulée « Dépannage : problèmes courants »| Symptôme | Cause probable | Solution |
|---|---|---|
CONFLICT pendant le cherry-pick | Même zone modifiée sur la branche cible | Résolvez comme un merge, puis --continue |
empty commit (rien à appliquer) | Le changement existe déjà sur la branche | Vérifiez avec git log, utilisez --allow-empty si voulu |
bad revision | Hash de commit incorrect | Vérifiez le hash avec git log branche --oneline |
| Historique pollué de doublons | Cherry-pick + merge ensuite | Utilisez -x pour tracer, préférez merge quand possible |
À retenir
Section intitulée « À retenir »git cherry-pick <hash>copie un commit sur la branche courante- Le commit créé a un hash différent mais le même contenu
-xajoute une référence au commit source (traçabilité)--no-commitapplique sans commiter (pour combiner)- Cas d’usage principal : backporter un correctif sans merger toute la branche
- En cas de conflit : résoudre →
git add→git cherry-pick --continue