183 votes

Comment fusionner un commit spécifique d'une branche vers une autre dans Git ?

J'ai BranchA qui est en avance de 113 commits par rapport à BranchB.

Mais je veux seulement les 10 derniers commits environ de BranchA fusionnés dans BranchB.

Y a-t-il un moyen de faire cela?

6 votes

268voto

ewall Points 10676

La commande git cherry-pick vous permet de prendre un seul commit (de n'importe quelle branche) et, essentiellement, de le rebaser dans votre branche de travail.

Le chapitre 5 du livre Pro Git l'explique mieux que je ne pourrais le faire, avec des diagrammes et autres. (Le chapitre sur le rebasage est également une bonne lecture.)

Enfin, il y a quelques bons commentaires sur le cherry-picking par rapport au merging et rebasing dans une autre question SO.

2 votes

Question: dire que le commit A est basé sur la branche master et que vous travaillez dessus, créant des commits enfants B à travers E. Disons que E n'a qu'une seule ligne ajoutée depuis D. Si vous faites un git cherry-pick E dans la branche master, est-ce qu'il applique tous les changements de A à E dans la branche master, ou est-ce qu'il n'applique que le changement de D à E, c'est-à-dire, il ajoute seulement cette 1 ligne à master? Si c'est le premier cas, comment puis-je obtenir le second? (à part en copiant et collant manuellement)

9 votes

Git cherry-pick -n Si vous ne voulez pas que le cherry pick soit automatiquement commité.

13voto

artamonovdev Points 1990

SOURCE: https://git-scm.com/book/fr/v2/Distributed-Git-Maintaining-a-Project#Integrating-Contributed-Work

L'autre façon de déplacer le travail introduit d'une branche à une autre est de faire un cherry-pick. Un cherry-pick dans Git est comme un rebase pour un seul commit. Il prend le patch qui a été introduit dans un commit et essaie de le réappliquer sur la branche sur laquelle vous vous trouvez actuellement. Cela est utile si vous avez un certain nombre de commits sur une branche de sujet et que vous voulez intégrer un seul d'entre eux, ou si vous n'avez qu'un seul commit sur une branche de sujet et que vous préféreriez le cherry-pick plutôt que de lancer un rebase. Par exemple, supposez que vous avez un projet qui ressemble à ceci:

enter image description here

Si vous voulez extraire le commit e43a6 dans votre branche master, vous pouvez exécuter

$ git cherry-pick e43a6
Terminé un cherry-pick.
[master]: créé a0a41a9: "Message plus convivial lorsque le verrouillage de l'index échoue."
 3 fichiers modifiés, 17 insertions(+), 3 suppressions(-)

Cela extrait le même changement introduit dans e43a6, mais vous obtenez une nouvelle valeur de hachage SHA-1 de commit, car la date d'application est différente. Maintenant votre historique ressemble à ceci:

enter image description here

Maintenant vous pouvez supprimer votre branche de sujet et abandonner les commits que vous ne vouliez pas extraire.

8voto

hvgotcodes Points 55375

Vous pourriez choisir les commits souhaités.

J'ai trouvé ce Comment choisir plusieurs commits

Je ferais la réponse acceptée.

7voto

Seth Reno Points 2221

Si BranchA n'a pas été poussé vers un distant, vous pouvez réorganiser les commits en utilisant rebase puis simplement merge. Il est préférable d'utiliser merge plutôt que rebase lorsque c'est possible car cela ne crée pas de commits en double.

git checkout BranchA
git rebase -i HEAD~113
... réorganisez les commits pour mettre en premier ceux que vous souhaitez ...
git checkout BranchB
git merge [le 10ème commit]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X