web-dev-qa-db-fra.com

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

J'ai BranchA qui est 113 commets devant BranchB.

Mais je veux seulement que les 10 derniers commits de BranchA soient intégrés à BranchB.

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

149
NullVoxPopuli

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

Le chapitre 5 du livre de Pro Git l'explique mieux que moi , complet avec des diagrammes et autres. ( Le chapitre sur la modification de la base est également une bonne lecture.)

Enfin, il y a quelques bons commentaires sur le tri sélectif vs la fusion vs la modification de la base dans une autre question SO .

221
ewall

vous pouvez sélectionner les commits désirés.

J'ai trouvé ceci Comment sélectionner plusieurs commits

Je ferais la réponse acceptée.

8
hvgotcodes

Si BranchA n'a pas été poussé vers une télécommande, vous pouvez réorganiser les commits en utilisant rebase, puis simplement merge. Il est préférable d'utiliser merge sur rebase lorsque cela est possible car cela ne crée pas de validations en double.

git checkout BranchA
git rebase -i HEAD~113
... reorder the commits so the 10 you want are first ...
git checkout BranchB
git merge [the 10th commit]
6
Seth Reno

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

L'autre façon de déplacer les travaux introduits d'une branche à une autre est de les sélectionner. Une sélection dans Git est comme une rebase pour un seul commit. Il prend le correctif qui a été introduit dans un commit et essaie de le réappliquer sur la branche sur laquelle vous vous trouvez. Ceci est utile si vous avez plusieurs commits sur une branche de sujet et que vous souhaitez en intégrer un seul, ou si vous n’avez qu’un seul commit sur une branche de sujet et que vous préférez le sélectionner à la place plutôt que d’exécuter rebase. Par exemple, supposons que vous ayez 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
Finished one cherry-pick.
[master]: created a0a41a9: "More friendly message when locking the index fails."
 3 files changed, 17 insertions(+), 3 deletions(-)

La modification apportée est identique à celle introduite dans e43a6, mais vous obtenez une nouvelle valeur SHA-1 de validation, car la date appliquée est différente. Maintenant, votre histoire ressemble à ceci:

enter image description here

Vous pouvez maintenant supprimer votre branche de sujet et supprimer les commits que vous ne souhaitiez pas intégrer.

2
artamonovdev