2009-08-31 6 views
5

Normalerweise arbeite ich auf dem Master-Zweig, und ich mache einige Commits, und schieben Sie es.Wie Kopf Commits von einem anderen Zweig zusammenführen?

Dann muss ich auch diese Commits zu anderen Zweig drücken.

Also in der Regel, das will ich tun:

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

Irgendeine Art von dumm, ist es trotzdem, ich Zweig einige Commits aus dem Kopf des Master fusionieren kann, so brauche ich nicht zu stören kirsch ein Pick von ein.

Antwort

9

Es klingt wie Sie diese Commits auf einem Zweig andere als Master machen möchten, und verschmelzen dann diesen Zweig zu Master und Ihren zweiten Zweig:

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

Das ist viel, viel besser als Kirsch- Kommissionieren, weil es keine Duplizierung von Commits in der History beinhaltet, beseitigt alle Probleme, die sich ergeben, wenn man einen Commit zweimal wiederholt (was man derzeit manuell vermeiden muss) ... und genau so funktioniert Git. Ich weiß nicht, was Ihr zweiter Zweig ist, aber was ich beschreibe, ist im Wesentlichen der übliche Arbeitsablauf des periodischen Zusammenführens von Wartungs- und Themenzweigen zurück in den Master sowie alle anderen geeigneten Änderungsfreigabe- oder Wartungszweige.

Ich empfehle dringend, dass Sie einen Workflow übernehmen, wo dies durch Verschmelzung wie ich oben beschrieben getan wird, aber um die Frage zu beantworten, wenn Sie unbedingt auf Meister und Kirsche-Pick arbeiten müssen, möchten Sie vielleicht selbst schreiben kleines Skript, etwas wie:

#!/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 

Offensichtlich gibt es Möglichkeiten, das Skript robuster zu machen, z Hinzufügen der Fähigkeit, nach Cherry-Picks, deren Patches nicht richtig anwenden, aber es ist ein Anfang.

Sie können mit der Art und Weise, wie Sie git-rev-list verwenden, natürlich die Commits auswählen. Sie könnten sogar alle außer dem ersten Argument an git-rev-list übergeben, so dass Sie cherries-pick <branch> -n 5 master oder cherries-pick <branch> release_tag..master oder was auch immer Sie wollen. Werfen Sie einen Blick auf die man page!

Sie auch git-rebase verwenden können, wie an anderer Stelle vorgeschlagen wurde, sondern weil Sie eigentlich gar nicht Meister bewegen wollen, müssen Sie etwas am Ende wie folgt vorgehen:

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

Viel beeindruckend, danke! –

0

Wenn Sie nur Ihren Zweig mit Master zu aktualisieren, zu tun:

git checkout branch; git merge master 
git rebase origin 

Wenn Sie wollen nicht alles von Meister ziehen, können Sie selektiv diff Revisionen (boo) oder Verwendung Zweige für einzelne Merkmale - Dann können Sie den Feature-Zweig einfach sowohl in den Master als auch in Ihren anderen Zweig einfügen.

+0

Ich will nur Das n bindet vom Haupt in den Master, um es zusammenzuführen, nicht andere Commits, die sich zwischen dem Zweig und dem Master unterscheiden. –

+1

Git Rebase -i Herkunft; es öffnet einen Texteditor für Sie mit einem Commit in einer Zeile, Sie müssen die Zeilen mit den Commits entfernen, die Sie nicht wollen –

1

git cherry-pick commit1..commitn

Verwandte Themen