2009-08-31 11 views
5

Habituellement, je travaille sur la branche maître, et je fais quelques commits, et le pousser.Comment fusionner la tête commet d'une autre branche?

Ensuite, j'ai également besoin de pousser ces commits à une autre branche.

Donc, en général, je ferai:

$ git checkout another-branch 
$ git cherry-pick commit1 
$ git cherry-pick commit2 
... 
$ git cherry-pick commitn 
$ git push 

Une sorte de stupide, est là de toute façon je peux fusionner certains commits de la tête de la branche principale, donc je n'a pas besoin la peine de écrémer un par un.

Répondre

9

On dirait que vous pouvez faire ces commits sur une branche autre que maître, puis fusionner cette branche à la fois maître et votre deuxième branche:

git checkout working-branch 
<do some work> 
git commit 
git checkout master 
git merge working-branch 
git checkout second-branch 
git merge working-branch 

Cela est beaucoup, beaucoup mieux que cerise choisir parce qu'il n'implique pas de doublons commits dans l'histoire, se débarrasse de tous les problèmes de sélection d'un commit deux fois (que vous devez actuellement éviter manuellement) ... et est juste la façon dont git est conçu pour fonctionner. Je ne sais pas ce qu'est votre deuxième branche, mais ce que je décris est essentiellement le flux de travail commun de fusionner périodiquement les branches de maintenance et de sujet dans le maître ainsi que dans toutes les autres branches de maintenance ou de modification modifiées appropriées.

Je vous recommande fortement d'adopter un flux de travail où cela se fait en fusionnant comme décrit ci-dessus, mais pour répondre à la question que vous avez posée, si vous devez absolument travailler sur master et picker, vous pourriez écrire petit script, quelque chose comme:

#!/bin/bash 
# take two arguments: 
# 1. other branch to put commits on 
# 2. number of commits to cherry-pick from master  

if ! git checkout $1; then 
    exit 
fi 
git rev-list --reverse -n $2 master | 
while read commit; do 
    if ! git cherry-pick $commit; then 
     exit 
    fi 
done 

De toute évidence, il existe des moyens de rendre le script plus robuste, par exemple Ajout de la possibilité de reprendre après des sélections de cerises dont les correctifs ne s'appliquent pas correctement, mais c'est un début.

Vous pouvez vous amuser avec la façon dont vous utilisez git-rev-list pour sélectionner les commits, bien sûr. Vous pouvez même passer tout sauf le premier argument à git-rev-list, de sorte que vous pouvez faire cherries-pick <branch> -n 5 master ou cherries-pick <branch> release_tag..master ou tout ce que vous voulez. Jetez un oeil à son man page!

Vous pouvez également utiliser git-rebase comme cela a été suggéré ailleurs, mais parce que vous ne voulez pas vraiment à se déplacer maître, vous allez finir par faire quelque chose comme ceci:

git branch master-copy master 
git rebase --onto <branch> master~5 master 
git checkout <branch> 
git merge master-copy 
git branch -d master-copy 
+0

Beaucoup impressionnant, merci! –

0

Si vous voulez juste de mettre à jour votre branche avec le maître, faites:

git checkout branch; git merge master 
git rebase origin 

Si vous ne voulez pas tirer tout de maître, vous pouvez révisions de manière sélective diff (boo) ou branches d'utilisation pour les fonctions individuelles - alors vous pouvez juste fusionner la branche de caractéristique dans le maître et votre autre branche.

+0

Je veux juste le n commet de la tête dans le maître à fusionner, pas d'autres commits qui diffèrent entre la branche et le maître. –

+1

git rebase -i origine; il ouvre un éditeur de texte pour vous avec un commit en une ligne, vous devez supprimer les lignes avec les commits que vous ne voulez pas –

1

git cherry-pick commit1..commitn

Questions connexes