Git cherry-pick : La précision chirurgicale

Git cherry-pick : La précision chirurgicale

Appliquez uniquement les commits dont vous avez besoin, sans merger toute la branche

Vous en avez marre de fusionner des branches entières alors que vous ne voulez parfois qu'un seul changement ? Vous avez oublié un commit dans une pull request et vous ne voulez pas tout re-merger ? La solution existe : git cherry-pick !

Cette commande Git permet d'appliquer un commit spécifique depuis une branche vers une autre, sans avoir à merger l'intégralité de la branche source. C'est comme cueillir une cerise 🍒 dans un arbre Git 🌳 sans prendre tout l'arbre !

Qu'est-ce que git cherry-pick ?

git cherry-pick est une commande Git qui permet de copier un ou plusieurs commits d'une branche vers une autre. Contrairement à git merge qui fusionne l'historique complet de deux branches, cherry-pick applique uniquement les modifications introduites par un commit précis.

Analogie

Imaginez un arbre fruitier (votre branche feature) avec des cerises (vos commits). Au lieu de cueillir toutes les cerises d'un coup (git merge), vous pouvez choisir de cueillir uniquement les cerises mûres que vous souhaitez (git cherry-pick).

Syntaxe de base

# Récupérer les derniers commits du remote
git fetch origin

# Visualiser les modifications d'un commit avant de l'appliquer
git show abc123d

# Appliquer un commit spécifique sur la branche actuelle
git cherry-pick abc123d

# Appliquer plusieurs commits en une seule commande
git cherry-pick abc123d def456e ghi789f

# Appliquer une plage de commits (abc123d jusqu'à def456e)
git cherry-pick abc123d^..def456e

Note : abc123d représente le hash du commit (identifiant unique). Vous pouvez le trouver avec git log ou git log --oneline.

Pourquoi git cherry-pick est génial ?

1. 🚑 Hotfix express

Vous avez corrigé un bug critique sur la branche develop, mais vous devez l'appliquer d'urgence sur main sans merger tout le reste ? Cherry-pick à la rescousse !

git checkout main
git cherry-pick abc123d  # Applique uniquement le correctif
git push origin main

2. 🎯 Petites features isolées

Une branche contient 10 commits, mais vous ne voulez en intégrer qu'un seul car les autres ne sont pas encore prêts ? Cherry-pick permet cette précision chirurgicale.

3. 😅 "Oups, j'ai oublié ce commit"

Vous avez mergé une pull request, puis vous réalisez qu'un commit important de la branche feature-xyz a été oublié ? Pas besoin de re-merger toute la branche :

git checkout main
git cherry-pick def456e  # Applique le commit oublié

4. ✨ Moins de conflits

Contrairement à git merge, cherry-pick évite les commits de merge inutiles et réduit les risques de conflits complexes. Vous n'appliquez que ce qui est nécessaire.

5. 📜 Historique propre

Fini les commits de merge parasites (Merge branch 'xyz' into main). L'historique Git reste linéaire et lisible.

6. 🎯 Précision chirurgicale

"Je veux juste CE correctif", "Je veux juste CETTE feature". Cherry-pick vous donne le contrôle total sur ce qui entre dans votre branche.

Workflow complet : Exemple concret

Contexte : Vous travaillez sur une branche feature/new-api. Un collègue a corrigé un bug critique sur develop (commit a1b2c3d), et vous avez besoin de ce correctif dans votre branche sans merger tout develop.

# 1. Récupérer les derniers commits du remote
git fetch origin

# 2. Visualiser le commit avant de l'appliquer (optionnel mais recommandé)
git show a1b2c3d

# 3. Se placer sur votre branche de travail
git checkout feature/new-api

# 4. Appliquer le commit spécifique
git cherry-pick a1b2c3d

# 5. Si tout se passe bien, le commit est appliqué !
# Vous pouvez vérifier avec :
git log --oneline -5

# 6. Pousser votre branche avec le nouveau commit
git push origin feature/new-api

Gérer les conflits avec cherry-pick

Parfois, le commit que vous cherry-pickez entre en conflit avec votre branche actuelle (modifications sur les mêmes lignes de code). Git vous prévient et met le processus en pause.

1. Git signale le conflit

$ git cherry-pick a1b2c3d
error: could not apply a1b2c3d... Fix bug in API
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git cherry-pick --continue'

2. Identifier les fichiers en conflit

git status

# Résultat :
# Unmerged paths:
#   both modified:   src/api.js

3. Résoudre les conflits manuellement

Ouvrez le fichier src/api.js dans votre éditeur. Git marque les conflits avec des marqueurs :

<<<<<<< HEAD
// Votre code actuel
function fetchData() {
  return axios.get('/api/v1/data')
}
=======
// Code du commit cherry-pické
function fetchData() {
  return axios.get('/api/v2/data')
}
>>>>>>> a1b2c3d... Fix bug in API

Choisissez la version correcte (ou combinez les deux), puis supprimez les marqueurs <<<<<<<, =======, >>>>>>>.

4. Continuer le cherry-pick

# Marquer les fichiers comme résolus
git add src/api.js

# Continuer le cherry-pick
git cherry-pick --continue

# Git ouvrira votre éditeur pour confirmer le message de commit
# Sauvegardez et fermez pour finaliser

Options de résolution

  • git cherry-pick --continue : Continue après résolution des conflits
  • git cherry-pick --abort : Annule complètement le cherry-pick et revient à l'état initial
  • git cherry-pick --skip : Ignore ce commit et passe au suivant (si vous cherry-pickez plusieurs commits)

Options avancées de cherry-pick

1. --no-commit (ou -n)

Applique les modifications sans créer automatiquement un commit. Utile si vous voulez modifier le code avant de committer ou combiner plusieurs cherry-picks en un seul commit.

git cherry-pick -n a1b2c3d
# Modifications appliquées, mais pas encore committées
# Vous pouvez maintenant éditer les fichiers
git add .
git commit -m "Combined changes"

2. --edit (ou -e)

Permet de modifier le message de commit avant de finaliser le cherry-pick.

git cherry-pick -e a1b2c3d
# Git ouvrira votre éditeur pour éditer le message

3. --signoff (ou -s)

Ajoute une ligne Signed-off-by au message de commit, utile pour la traçabilité dans les projets open source.

git cherry-pick -s a1b2c3d
# Le commit aura une ligne : Signed-off-by: Votre Nom <email@example.com>

4. --mainline (ou -m)

Utilisé pour cherry-pick un commit de merge. Vous devez spécifier quelle branche parent utiliser (1 = première branche, 2 = deuxième branche).

git cherry-pick -m 1 abc123d
# Applique le commit de merge en utilisant la première branche parent

Cas d'usage réels chez VOID

Cas 1 : Hotfix production urgent

Un bug critique est découvert en production sur notre plateforme Drupal pour une banque. Le correctif a été développé et testé sur develop, mais nous ne pouvons pas merger toute la branche car elle contient des features non finalisées.

git checkout main
git cherry-pick abc123d  # Commit du correctif uniquement
git push origin main
# Déploiement immédiat en production

Résultat : Bug corrigé en 10 minutes, sans risque d'introduire du code non testé.

Cas 2 : Backport de feature

Une feature développée sur main (Next.js 15) doit être backportée vers la version LTS (lts/14.x).

git checkout lts/14.x
git cherry-pick def456e ghi789j  # Les 2 commits de la feature
# Adaptation manuelle si nécessaire
git push origin lts/14.x

Cas 3 : Réorganisation de l'historique

Une branche feature/refactoring contient 20 commits, mais seulement 3 concernent une refactorisation critique nécessaire maintenant. Les 17 autres concernent des optimisations à intégrer plus tard.

git checkout develop
git cherry-pick abc123 def456 ghi789  # Les 3 commits critiques
git push origin develop

Bonnes pratiques et conseils

  • Toujours visualiser avant : Utilisez git show <hash> pour voir les modifications avant de cherry-picker
  • Préférez les commits atomiques : Un commit = une modification logique. Cela facilite le cherry-pick
  • Attention aux dépendances : Si un commit dépend d'un autre, cherry-pickez les deux dans l'ordre
  • Documentez vos cherry-picks : Ajoutez une note dans le message de commit (ex : (cherry picked from commit abc123))
  • Ne cherry-pickez pas trop : Si vous devez cherry-picker plus de 5-10 commits, envisagez un merge ou un rebase
  • Testez après cherry-pick : Le commit peut fonctionner sur la branche source mais pas sur la cible (contexte différent)
  • Communiquez avec l'équipe : Informez vos collègues quand vous cherry-pickez des commits pour éviter les confusions

Cherry-pick vs Merge vs Rebase

CommandeUsageAvantagesInconvénients
cherry-pickAppliquer un ou quelques commits spécifiquesPrécision, pas de commit de merge, historique propreDuplication de commits (même changement, hash différent)
mergeFusionner l'historique complet de deux branchesConserve l'historique complet, traçabilitéCommits de merge, historique moins linéaire
rebaseRéappliquer des commits sur une nouvelle baseHistorique linéaire, pas de commit de mergeRéécrit l'historique, dangereux sur branches partagées

Pièges courants à éviter

❌ Cherry-picker trop de commits

Si vous devez cherry-picker plus de 10 commits, c'est souvent le signe qu'un git merge ou git rebase serait plus approprié.

❌ Oublier les dépendances

Un commit B dépend d'un commit A. Si vous cherry-pickez seulement B, votre code risque de ne pas fonctionner. Vérifiez toujours les dépendances.

❌ Ne pas tester après cherry-pick

Le contexte de la branche cible peut être différent de la source. Testez toujours après un cherry-pick, même s'il n'y a pas de conflits.

❌ Cherry-picker depuis une branche non à jour

Faites toujours git fetch origin avant de cherry-picker pour être sûr de travailler avec les derniers commits.

Ressources pour approfondir

Besoin d'aide avec Git ?

Nos experts DevOps peuvent vous accompagner dans l'optimisation de votre workflow Git, la mise en place de bonnes pratiques, et l'automatisation de vos processus CI/CD. Formez vos équipes aux commandes Git avancées !

Contacter nos experts DevOps

Cet article présente git cherry-pick, une commande native de Git. Les exemples sont basés sur notre expérience quotidienne chez VOID avec des projets Drupal, Next.js et applications web complexes. Informations à jour en 2025.