Aller au contenu
Développement medium
🔐 Alerte sécurité — Incident supply chain Trivy : lire mon analyse de l'attaque

Cherry-pick : récupérer un commit précis

6 min de lecture

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.

  • 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

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.

  1. Identifiez le hash du commit à récupérer :

    Fenêtre de terminal
    git log feature --oneline
    b3d7f2a (feature) Ajouter la validation email
    a1c4e5f Corriger le timeout API ← celui-ci
  2. Basculez sur la branche cible :

    Fenêtre de terminal
    git switch main
  3. Cherry-pickez le commit :

    Fenêtre de terminal
    git cherry-pick a1c4e5f

    Git applique les modifications et crée un nouveau commit sur main.

  4. Vérifiez le résultat :

    Fenêtre de terminal
    git log --oneline -3
Fenêtre de terminal
# 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^..D
Fenêtre de terminal
git cherry-pick a1c4e5f b3d7f2a e8f9a0b

Git les applique dans l’ordre donné, un par un.

OptionEffet
--no-commit (-n)Applique les modifications sans commiter (staging)
--edit (-e)Ouvre l’éditeur pour modifier le message
-xAjoute (cherry picked from commit ...) au message
--signoff (-s)Ajoute votre Signed-off-by au message

--no-commit applique les modifications dans le staging sans créer de commit. Utile pour combiner plusieurs cherry-picks en un seul commit :

Fenêtre de terminal
git cherry-pick --no-commit a1c4e5f
git cherry-pick --no-commit b3d7f2a
git commit -m "Backport: timeout API + validation email"

L’option -x ajoute automatiquement la référence du commit source dans le message :

Corriger le timeout API
(cherry picked from commit a1c4e5f7d8b9c0e1f2a3b4c5d6e7f8a9b0c1d2e3)

Si le cherry-pick entre en conflit, Git s’arrête (comme pour un merge) :

  1. Éditez les fichiers en conflit — mêmes marqueurs <<<<<<<, =======, >>>>>>> qu’un merge

  2. Marquez comme résolu :

    Fenêtre de terminal
    git add fichier-en-conflit.txt
  3. Continuez le cherry-pick :

    Fenêtre de terminal
    git cherry-pick --continue

Pour abandonner le cherry-pick :

Fenêtre de terminal
git cherry-pick --abort

Le scénario le plus fréquent est le backport : appliquer un correctif de main vers une branche de release antérieure.

Fenêtre de terminal
# Correctif mergé sur main
git switch release/2.x
git cherry-pick -x abc1234
git push

Le correctif est maintenant sur la release 2.x sans intégrer toutes les nouveautés de main.

CritèreCherry-pickMergeRebase
Granularité1 commit précisBranche entièreBranche entière
Crée un nouveau commitOui (nouveau hash)Oui (commit de merge)Oui (hash réécrits)
HistoriqueCommit dupliquéPréservé avec losangeLinéaire
Cas d’usageBackport, hotfixIntégration standardMise à jour de branche

Quand choisir ?

SituationCommande recommandée
Intégrer une branche feature complètegit merge
Mettre à jour votre branche sur maingit rebase
Backporter un correctif vers une ancienne branchegit cherry-pick
Appliquer un hotfix de main sur release/1.xgit cherry-pick
Récupérer un seul commit depuis une branche parallèlegit cherry-pick
SymptômeCause probableSolution
CONFLICT pendant le cherry-pickMême zone modifiée sur la branche cibleRésolvez comme un merge, puis --continue
empty commit (rien à appliquer)Le changement existe déjà sur la brancheVérifiez avec git log, utilisez --allow-empty si voulu
bad revisionHash de commit incorrectVérifiez le hash avec git log branche --oneline
Historique pollué de doublonsCherry-pick + merge ensuiteUtilisez -x pour tracer, préférez merge quand possible
  • git cherry-pick <hash> copie un commit sur la branche courante
  • Le commit créé a un hash différent mais le même contenu
  • -x ajoute une référence au commit source (traçabilité)
  • --no-commit applique sans commiter (pour combiner)
  • Cas d’usage principal : backporter un correctif sans merger toute la branche
  • En cas de conflit : résoudre → git addgit cherry-pick --continue

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracing. Aujourd'hui, ce site ne couvre même pas mes frais d'hébergement, d'électricité, de matériel, de logiciels, mais surtout de cafés.

Un soutien régulier, même symbolique, m'aide à garder ces ressources gratuites et à continuer de produire des guides de qualité. Merci pour votre appui.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn