DEV Community

Cover image for Git par l'exemple - Cherie, ça va cherry-picker !
Aurélie Vache
Aurélie Vache

Posted on • Updated on

Git par l'exemple - Cherie, ça va cherry-picker !

Git par l'exemple - cherry pick

Git par l'exemple - cherry pick

Je penses que cette situation nous est tous arrivé ...

Je suis sur une branche Git, ma branche de travail. Je fais mes modifications, je commit, je push sur ma branche, impec.

A un moment, en montrant quelque chose a un collegue, je change de branche.

Plus tard, je reviens sur mon travail, je fais mes modifications de fichier, je commit et là ... je m'apperçois que je ne suis plus sur MA branche, mais sur la branche master/main qui est protégée en ecriture par exemple.

Que faire dans ce cas là ?

C'est là que le pouvoir du Git cherry-pick entre en jeu !

Git Cherry Pick

Le Git Cherry Pick permet de copier un commit d'une branche à une autre et c'est ce qui va nous aider, voir nous sauver, dans cette situation ! :-)

Les logs

En premier, nous allons regarder les logs dans la mauvaise branche, afin de récupérer l'ID du commit que nous voulons copier.

$ git log --oneline --decorate

db6f662 (HEAD -> mauvaise-branche, origin/mauvaise-branche) commit sur mauvaise branche
7643233 (origin/ma-branche, ma-branche) premier commit good
17217a7 (origin/main, origin/HEAD, main) Initial commit
...

Enter fullscreen mode Exit fullscreen mode

On voit bien notre commit, il s'agit du db6f662.

Astuce :

Vous pouvez ajouter en alias cette ligne de commande à rallonge :

alias glo='git log --oneline --decorate'
Enter fullscreen mode Exit fullscreen mode

Placez-vous dans votre branche de travail (la bonne !)

A présent, on se place dans la bonne branche de travail :

$ git switch ma-branche
Switched to branch 'ma-branche'
Enter fullscreen mode Exit fullscreen mode

Comme vous pouvez voir, votre commit n'apparait pas encore :

$ glo

7643233 (HEAD -> ma-branche, origin/ma-branche) premier commit good
17217a7 (origin/main, origin/HEAD, main) Initial commit
(END)
Enter fullscreen mode Exit fullscreen mode

Cherry-pick du commit

Maintenant, nous allons utiliser la commande git cherry-pick pour copier le commit dans notre branche :

$ git cherry-pick db6f662
[ma-branche 46f048d] commit sur mauvaise branche
 Date: Mon Oct 30 18:13:05 2023 +0100
 1 file changed, 1 insertion(+)
Enter fullscreen mode Exit fullscreen mode

Regardons l'historique Git/les logs de votre branche Git afin de vérifier que le commit a été ajouté :

$ glo

46f048d (HEAD -> ma-branche) commit sur mauvaise branche
7643233 (origin/ma-branche) premier commit good
17217a7 (origin/main, origin/HEAD, main) Initial commit
(END)
Enter fullscreen mode Exit fullscreen mode

Super, le commit apparait bien maintenant dans la bonne branche !

Parfait :-)

Git cherry pick

A noter que l'on peut "cherry-picker" plusieurs commits à la fois :

$ git cherry-pick <COMMIT_ID1> <COMMIT_ID2> <COMMIT_ID3>
Enter fullscreen mode Exit fullscreen mode

Conclusion

Git est un gestionnaire de version (SCM) utilisé en masse, mais comme de nombreux outils que l'on utilise au quotidien, il regorge de nombreuses fonctionnalités super pratique mais pas super simple à comprendre.

J'espère que cet exemple vous sera utile.

Top comments (7)

Collapse
 
lomalarch profile image
Noé Cendrier

Bonjour,
Si je peux me permettre d’ajouter mon grain de sel, il y a le cas où in peut avoir besoin de récupérer un commit de merge, auquel cas on va utilise l’option -m

glo mauvaise-branche
db6f662 (HEAD -> mauvaise-branche, origin/mauvaise-branche) merge develop-2 sur mauvaise branche
735gd98 un commit sur develop-2 à récupérer sur ma branche
7643233 (origin/ma-branche, ma-branche) premier commit good
17217a7 (origin/main, origin/HEAD, main) Initial commit
Enter fullscreen mode Exit fullscreen mode

et, du coup :

git checkout ma-branche
git cherry-pick -m 1 db6f662
Enter fullscreen mode Exit fullscreen mode

permettra de récupérer tous les commits du merge (y compris celui de fusion) dans ma-branche !

(oui, mes collègues aussi trouvent que j’ai l’esprit tordu…)

Collapse
 
aurelievache profile image
Aurélie Vache

Yes je connaissais l'option -m et oui effectivement cela eput aider dans certains cas.
Je pense qu'on a tous des histoires, tordues ou pas, avec Git :-D

merci :)

Collapse
 
bcouetil profile image
Benoit COUETIL 💫

Un bon moyen d'éviter ça, c'est d'afficher la branche systématiquement dans le prompt 😉

Collapse
 
aurelievache profile image
Aurélie Vache

Cette astuce je l'ai, mais à force de l'avoir tout le temps on peut ne plus la lire à un certain moment. Ou bien en devant switcher sur 3-4 branches dans la meme matinée il se peut qu'a un moment on se trompe :).

Collapse
 
bcouetil profile image
Benoit COUETIL 💫

J'avoue que ça m'est déjà arrivé aussi, mais pas sur 2 commits successifs, car par automatisme je jette un oeil à la branche présentée par le prompt !

Et dans ce cas d'erreur tu n'as pas seulement à cherry-pick, tu as également à nettoyer la branche initiale, c'est donc plus coûteux que ce que tu indiques en opérations.

Du coup je préfère :

git reset origin/mauvaise-branche
git stash
git switch ma-branche
git stash pop
git commit -am"same message"
Enter fullscreen mode Exit fullscreen mode

Plus concis, non ?

Collapse
 
virginiel profile image
VirginieLemaire

Super, c'est vraiment très clair 👍
Merci

Collapse
 
aurelievache profile image
Aurélie Vache

Merci ! :)