W3docs

git cherry-pick

Apprenez la commande git cherry-pick pour copier des commits individuels d'une branche vers une autre. Options, conflits et exemples.

Ce que fait git cherry-pick

La commande git cherry-pick prend la modification introduite par un ou plusieurs commits existants et la réapplique sur votre branche courante sous forme de nouveau commit. Là où git merge et git rebase déplacent des lignes entières d'historique d'un coup, cherry-pick vous permet de saisir un seul commit et de le déposer exactement là où vous en avez besoin.

Cette page explique comment cherry-pick fonctionne en interne, comment sélectionner un commit ou une plage de commits, les options que vous utiliserez réellement, comment résoudre les conflits, et quand préférer cherry-pick plutôt qu'un merge ou git revert.

git cherry-pick copiant un commit d'une branche feature vers main

Comment ça fonctionne

Un commit est un instantané, mais cherry-pick le traite comme un patch : il calcule le diff entre le commit et son parent, puis applique ce diff à l'extrémité de votre branche courante et enregistre un nouveau commit. Le nouveau commit conserve le message, l'auteur et la date d'origine, mais obtient un nouveau hash et un nouveau parent car il se trouve désormais à un endroit différent dans l'historique.

Cette différence est le modèle mental essentiel : cherry-pick copie une modification, il ne la déplace pas. Le commit source reste exactement là où il était sur sa branche d'origine.

git switch main
git cherry-pick a1b2c3d

La modification du commit a1b2c3d est maintenant sur main sous la forme d'un nouveau commit.

Un exemple concret

Supposons qu'un correctif a été commité sur feature mais qu'il appartient vraiment à main. Commencez par trouver le hash du commit avec git log :

git switch feature
git log --oneline
# d9ae654 fix login redirect
# 7c1a902 work in progress
# fa42ab5 base

Basculez ensuite sur main et copiez uniquement ce commit :

git switch main
git cherry-pick d9ae654
[main 02bbf3e] fix login redirect
 1 file changed, 1 insertion(+)

Remarquez le nouveau hash 02bbf3e — le correctif est maintenant sur main en tant que tout nouveau commit, tandis que d9ae654 existe toujours intact sur feature.

Sélectionner une plage de commits

Vous pouvez appliquer plusieurs commits en une seule opération. Une plage copie chaque commit après le premier, jusqu'au dernier inclus :

git cherry-pick a1b2c3d..f4e5d6c

Cela exclut a1b2c3d lui-même. Pour rendre la plage inclusive du commit de départ, ajoutez le suffixe ^ afin que la plage commence au parent de ce commit :

git cherry-pick a1b2c3d^..f4e5d6c

Les commits sont appliqués un à un, dans l'ordre ; si l'un d'eux génère un conflit, cherry-pick s'interrompt sur ce commit pour vous permettre de le résoudre avant de continuer.

Options courantes

CommandeDescription
git cherry-pick <commit>Applique la modification de <commit> sous forme de nouveau commit sur la branche courante.
git cherry-pick -n <commit>Applique la modification mais ne crée pas de commit, laissant les changements indexés pour que vous puissiez les vérifier ou les modifier avant de commiter.
git cherry-pick -x <commit>Ajoute une ligne (cherry picked from commit …) au message — pratique sur les branches publiques pour que les autres puissent retracer l'origine.
git cherry-pick -e <commit>Ouvre votre éditeur pour vous permettre de modifier le message du commit avant qu'il soit enregistré.
git cherry-pick --continueReprend l'opération après que vous avez résolu les conflits.
git cherry-pick --skipIgnore le commit courant (par exemple, quand sa modification est déjà présente) et passe au suivant.
git cherry-pick --abortAnnule l'opération et restaure la branche dans son état d'origine.

Avec -x, le message enregistré ressemble à ceci :

fix login redirect

(cherry picked from commit d9ae65426adbde425c3e386a32297e9e833d8816)

Gestion des conflits

Si la modification ne s'applique pas proprement, cherry-pick s'interrompt comme le fait un merge et laisse des marqueurs de conflit dans les fichiers concernés. Vous verrez :

CONFLICT (content): Merge conflict in app.js
error: could not apply d9ae654... fix login redirect
hint: ... fix conflicts and then run "git cherry-pick --continue".

Résolvez manuellement les fichiers en conflit, indexez-les avec git add, puis continuez :

git add app.js
git cherry-pick --continue

Trois options de sortie sont disponibles à ce stade :

  • git cherry-pick --continue — terminer après avoir résolu les conflits.
  • git cherry-pick --skip — ignorer le commit courant et passer au suivant dans la plage.
  • git cherry-pick --abort — abandonner entièrement et ramener la branche à son état initial.

Utilisez git status à tout moment pour voir quels fichiers sont encore en conflit.

Quand l'utiliser

Cherry-pick est particulièrement utile quand :

  • Un correctif a atterri sur la mauvaise branche et vous en avez besoin ailleurs.
  • Vous effectuez un backport d'un patch isolé vers une branche de release ou de maintenance.
  • Vous voulez un seul commit d'une branche feature sans merger l'ensemble.

Cherry-pick vs. merge, rebase et revert

ObjectifUtiliser
Copier un (ou quelques) commits spécifiques vers une autre branchegit cherry-pick
Intégrer l'intégralité de l'historique d'une branchegit merge
Déplacer les commits d'une branche sur une nouvelle basegit rebase
Annuler un commit en enregistrant un commit inversegit revert

Pièges à éviter

  • Doublons sur un historique partagé. Effectuer un cherry-pick vers une branche qui fusionnera plus tard avec la source crée deux commits avec la même modification. Git est généralement assez intelligent pour ignorer le doublon au moment du merge, mais cela peut complexifier l'historique — préférez merge ou rebase quand vous voulez intégrer toute la branche.
  • Résultats vides. Si la modification est déjà présente sur la cible, cherry-pick s'arrête avec The previous cherry-pick is now empty. Utilisez git cherry-pick --skip pour continuer, ou --abort pour annuler.
  • Nouveau hash, pas l'original. Parce que le commit est recréé, son hash change. Ajoutez -x pour que le message indique d'où il vient.

Pratique

Pratique
Que fait 'git cherry-pick' avec le commit qu'il copie ?
Que fait 'git cherry-pick' avec le commit qu'il copie ?
Was this page helpful?