Copier-coller des commits avec cherry-pick
Par Maxime Bréhin • Publié le 8 mai 2023
• 2 min
Le cherry-pick ça n’est pas quand ton amour a oublié de se raser (#BlagueÀ2Balle
) mais la possibilité que nous offre Git d’effectuer du report de commit d’un endroit à un autre dans l’historique d’un même projet. Il s’agit donc de copier-coller un ou plusieurs commits.
Quand l’utiliser ?
Tout dépend des workflows en place sur tes projets. On trouve généralement deux grands cas de figure :
- le report de correctif d’une branche à une autre ;
- la reprise de fonctionnalité d’une branche à une autre.
Il est donc très rare qu’on vienne dupliquer un commit sur une même branche. On est plus souvent confrontés à une logique du « tiens, ce truc là, j’en ai besoin là aussi ! ».
Procédure
La procédure est simple et se fait en deux étapes :
- Comme pour une fusion, on se place sur la branche qui va évoluer / recevoir le commit :
git swith <la-branche>
- On réplique le commit :
git cherry-pick -x <commit-1>
On peut en repliquer plusieurs à la fois, auquel cas Git nous les appliquera à la chaîne, mais on préférera généralement une application unitaire.
# On peut passer plusieurs identifiants de commits
git cherry-pick -x <commit-1> <commit-2>
# Ou carrément un intervalle, ici les commit 1, 2, 3 et 4
git cherry-pick -x <commit-1>~1..<commit-4>
Chaque commit répliqué produira donc un nouveau commit avec une nouvelle identité.
L’option -x
Contrairement aux fusions, le cherry-picking n’offre pas la possibilité de visualiser dans l’historique la provenance du contenu intégré/reporté. Ça n’est pas franchement grave puisqu’on garde toutes le infos réellement utiles (contenu + méta-données, dont l’auteur du commit). On peut néanmoins demander l’intégration dans le message du commit de la référence au commit copié grâce à l’option -x
. On obtiendra alors une ligne supplémentaire en fin de message de commit qui ressemblera à ceci :
(cherry picked from commit 72bb9f9cf4bbb6bbb11da9cda4499c55c44e87b9)
Visuellement, ça donne quoi ?
Si on devait visualiser l’opération dans notre historique, on verrait ça :