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

159

J'ai BranchAce qui est 113 commits avant BranchB.

Mais je veux seulement que les 10 derniers commits soient BranchAfusionnés dans BranchB.

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

NullVoxPopuli
la source
6
duplication possible de Comment fusionner un commit spécifique dans git
chharvey

Réponses:

233

La git cherry-pick <commit>commande 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 moi , avec des diagrammes et autres. ( Le chapitre sur Rebasing est également une bonne lecture.)

Enfin, il y a quelques bons commentaires sur le choix de la cerise sur le gâteau vs fusion vs rebasage dans une autre question SO .

ewall
la source
1
Question: disons que commit Aest dérivé masteret que vous travaillez dessus, en créant des commits enfants Bvia E. Dites En'a qu'une ligne ajoutée à partir de D. Si vous êtes git cherry-pick Edans master, applique-t-il tous les changements de Aà Edans la masterbranche, ou n'applique-t-il que le changement de Dà E, à savoir, il ajoute seulement cette 1 ligne à master? Si le cas est le premier, comment puis-je réaliser le second? (à part copier et coller manuellement)
chharvey
7
git cherry-pick -n <commit> Si vous ne voulez pas que le cherry pick soit automatiquement engagé.
Ben Flynn
6

Si BranchA n'a pas été poussé vers une télécommande, vous pouvez réorganiser les commits en utilisant rebaseet ensuite simplement merge. Il est préférable d'utiliser mergeplus souvent rebaseque possible car il ne crée pas en double commits.

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]
Seth Reno
la source
2

SOURCE: https://git-scm.com/book/en/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 le sélectionner. 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. Ceci est utile si vous avez un certain nombre de 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 avec précaution plutôt que d'exécuter le rebase. Par exemple, supposons que vous ayez un projet qui ressemble à ceci:

entrez la description de l'image ici

Si vous souhaitez extraire le commit e43a6 dans votre branche principale, 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(-)

Cela extrait la même modification 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:

entrez la description de l'image ici

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

artamonovdev
la source