Cherry-pick est une commande Git qui applique les modifications d'un ou plusieurs commits existants à la branche courante. Contrairement à Merge (transfère toute la branche) et Rebase (transfère une séquence de commits), cherry-pick sélectionne uniquement les commits spécifiés. Selon git-scm.com, 2025, cherry-pick est le plus demandé dans les scénarios de transfert de correctifs entre branches de release.
Points clés
Cherry-pick est une commande Git qui copie les modifications d'un commit spécifié et les applique comme un nouveau commit dans la branche courante. Le nom vient de la métaphore du « cueillage de cerises » : le développeur sélectionne uniquement les commits dont il a besoin, ignorant le reste.
Contrairement à Merge, cherry-pick ne crée pas de commit de fusion et ne nécessite pas de fusion complète des branches. Contrairement à Rebase, cherry-pick ne transfère pas une séquence de commits — seulement ceux spécifiés. Cela fait de cherry-pick un outil idéal pour le transfert ciblé de correctifs.
Selon Atlassian, 2025, cherry-pick est utilisé par 47 % des équipes travaillant avec plusieurs branches de release simultanément. Cherry-pick est particulièrement demandé dans le développement mobile, où plusieurs versions d'une application (releases LTS) sont maintenues simultanément et nécessitent le transfert de correctifs entre elles.
Lors de l'exécution de cherry-pick, Git calcule le diff entre le commit spécifié et son parent, puis applique ce diff à la branche courante. Si les modifications sont appliquées sans conflit — Git crée un nouveau commit avec le même message mais un nouveau SHA. En cas de conflit — cherry-pick s'arrête pour résolution manuelle.
La syntaxe de cherry-pick est simple : spécifiez le hash du commit à transférer. Git copie les modifications dans la branche courante comme un nouveau commit. Le transfert de plusieurs commits à la fois et de plages entières est pris en charge.
# Transférer un commit individuel vers la branche courante
git cherry-pick a1b2c3d4
# Transférer plusieurs commits
git cherry-pick a1b2c3d4 e5f6g7h8
# Transférer une plage de commits (de a1b2 à f9e8, sans inclure a1b2)
git cherry-pick a1b2c3d4..f9e8d7c6
Après exécution de cherry-pick, la branche courante reçoit un nouveau commit avec les modifications de la source. Le message du commit est copié de la source par défaut, mais peut être modifié avec le flag -n (ne pas créer de commit) ou --edit (modifier le message).
Considérons un scénario typique : un bug critique est trouvé et corrigé dans develop, qui existe également dans la branche de release release/v2.0. Seul ce correctif doit être transféré, sans fusionner tout develop dans la branche de release.
# Trouver le hash du commit avec le correctif dans develop
git log --oneline develop
# a1b2c3d fix: null check in payment processing
# Basculer vers la branche de release
git checkout release/v2.0
# Appliquer le correctif
git cherry-pick a1b2c3d4
# En cas de conflit — résoudre et continuer
git add src/payment/PaymentProcessor.kt
git cherry-pick --continue
Le flag -x ajoute une référence au SHA original dans le message du commit : « (cherry picked from commit a1b2c3d4) ». Cela facilite le suivi de l'origine du commit transféré. Il est recommandé d'utiliser -x dans tous les scénarios sauf les brouillons temporaires.
En cas de conflit, cherry-pick se comporte comme merge : Git s'arrête et marque les fichiers en conflit. Le développeur résout le conflit, exécute git add puis git cherry-pick --continue. Pour annuler — git cherry-pick --abort. Le flag --strategy permet de spécifier une stratégie de fusion (par exemple, recursive avec options).
# Résolution d'un conflit lors de cherry-pick
# Git montre les fichiers en conflit
git status
# Résoudre manuellement, puis :
git add fichier_autorisé.kt
git cherry-pick --continue
# Ou annuler cherry-pick :
git cherry-pick --abort
Cherry-pick est optimal dans les scénarios où un transfert ciblé de modifications est nécessaire sans fusionner des branches entières. Examinons cinq cas principaux où cherry-pick devient le meilleur choix.
Pour le développement mobile, cherry-pick est crucial lors de la prise en charge de plusieurs versions d'une application. Par exemple, si un bug est trouvé dans la version 3.2 déjà publiée sur Google Play, et que develop contient le code pour la version 4.0 — cherry-pick permet de transférer le correctif vers la branche v3.x sans fusionner toutes les modifications cassantes. Ceci est particulièrement pertinent pour les projets où deux versions majeures ou plus avec des API et dépendances différentes sont maintenues simultanément.
Exemple pratique : dans une application mobile, un crash est détecté lors de l'authentification via Google Sign-In sur Android 12. Le correctif est effectué dans develop et passe la revue de code. Cependant, la branche de release actuelle v2.5 est déjà en phase de test bêta. Le cherry-pick du commit de correctif de develop vers release/v2.5 permet d'inclure le correctif dans la prochaine release sans transférer les autres modifications qui ne sont pas encore prêtes pour la publication.
Lors de l'utilisation de cherry-pick dans les projets mobiles, il est important de prendre en compte les dépendances : si le correctif affecte des fichiers qui ont été modifiés dans develop après le point de divergence de la branche de release, cherry-pick peut apporter un ensemble incomplet de modifications. Dans de tels cas, il est nécessaire de vérifier que toutes les modifications connexes ont également été transférées, sinon l'application pourrait ne pas compiler ou fonctionner incorrectement. Vérifiez toujours la compilation après cherry-pick avant de pousser les modifications vers la branche partagée.
Les trois outils principaux d'intégration des modifications dans Git — merge, rebase et cherry-pick — résolvent différentes tâches. Le choix dépend de la quantité de modifications à transférer et de l'aspect souhaité de l'historique.
| Critère | Merge | Rebase | Cherry-pick |
|---|---|---|---|
| Portée | Branche entière | Série de commits | Commits sélectionnés |
| Historique | Conserve les branches | Linéaire | Linéaire |
| Commit de fusion | Oui (sauf ff) | Non | Non |
| Automatisation | Complète | En chaîne | Uniquement spécifiés |
| Pour branches publiques | Sûr | Dangereux | Sûr |
Merge — lorsque vous devez fusionner deux branches entièrement et conserver les informations de branchement. Rebase — lorsque vous devez mettre à jour une branche personnelle à l'état le plus récent avec un historique propre. Cherry-pick — lorsque vous n'avez besoin que d'un seul commit ou de plusieurs commits sélectionnés.
En pratique, ces outils sont combinés : une fonctionnalité est développée avec un rebase périodique sur develop, puis fusionnée via --no-ff merge, et lorsqu'il est nécessaire de transférer un correctif vers une autre branche, cherry-pick est utilisé. Chaque outil résout sa propre tâche à sa propre étape.
Cherry-pick est un outil utile mais potentiellement dangereux lorsqu'il est utilisé incorrectement ou de manière excessive. Les principaux risques sont liés à la duplication de commits, à la perte de contexte et aux conflits lors de fusions ultérieures.
Recommandations pour minimiser les risques : utilisez toujours le flag -x pour indiquer le SHA original, documentez la raison du cherry-pick dans le message du commit, et lorsque c'est possible, utilisez merge au lieu de cherry-pick quand le contexte le permet. Si les cherry-picks deviennent nombreux — envisagez une restructuration des branches.
Les pipelines CI doivent considérer cherry-pick comme un scénario séparé. Il est recommandé de configurer une vérification automatisée : lorsqu'un commit cherry-pick est créé, le CI vérifie que les fichiers modifiés correspondent à l'ensemble attendu et exécute des tests pour les modules concernés. Cela réduit le risque de régression lors du transfert de modifications entre branches.
Foire aux questions
Cherry-pick transfère les modifications d'un commit vers une autre branche. Revert crée un nouveau commit qui annule les modifications du commit spécifié dans la même branche. Revert ne supprime pas l'historique — il ajoute une modification inverse.
Oui : git cherry-pick A B C — transfère les commits A, B et C dans l'ordre. Ou git cherry-pick A..C — transfère tous les commits de A à C (sans inclure A). L'ordre de transfert correspond à l'ordre dans la commande.
Par défaut, cherry-pick d'un commit de fusion ne fonctionne pas car un commit de fusion a deux parents. Utilisez le flag -m 1 pour spécifier avec quel parent comparer. -m 1 prend le diff relatif au premier parent.
Annulez cherry-pick via git reset --hard HEAD~1 si c'est le dernier commit. Si le commit a déjà été poussé — utilisez git revert <SHA> pour créer un commit d'annulation.
Pas de sens, mais techniquement possible. Si le commit existe déjà dans la branche, Git détectera que les modifications sont déjà appliquées et signalera : « The previous cherry-pick is now empty, possibly due to conflict resolution. » Le commit ne sera pas recréé.
Résumé
Nous développerons une application mobile clé en main
IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.
Lisez aussi