2014-09-02 10 views
6

Als Entwickler auf php-src in der folgenden Situation vorhanden ich mich vor kurzem finden:Rebase auf Upstream-Änderungen mit nicht-trivialer Zusammenführung verpflichtet lokal

A B C 
o---o---o   version1 
     \ 
o---o-----o---o master 
x y  D E 

o---o---o   upstream/master 
x y z 

Also, wenn ich git push --dry-run upstream master version1 bekomme ich die typisch:

! [rejected]  master -> master (fetch first) 

Meine natürliche Reaktion ist die betroffene Filiale rebase und bewahren merge verpflichtet:

git fetch upstream 
git rebase -p upstream/master 

Es ist wichtig zu beachten, dass das ursprüngliche Merge-Commit nicht trivial war, da es so viele Änderungen zwischen dem Versionszweig und dem Master gibt; Es bedarf einer Anstrengung, um eine solche Zusammenführung zu lösen.

Die obige Rebase-Operation verursacht einen Zusammenführungskonflikt und ich muss es erneut lösen; Das ist fast genau der gleiche Job, den ich bereits gemacht habe.

Gibt es einen besseren Weg, dies zu tun? Oder habe ich eine offensichtliche Rebase-Option vergessen?

+0

Haben Sie * Rebase? Ich rebase normalerweise auch, aber ich war auch in deiner Situation wo es einfach nicht machbar war und ging dann mit einem Standard fusionieren. – musiKk

+0

Sicher, ich kann einfach 'D, E, M (z)' anstelle von 'D ', E'' drücken, aber ich ziehe es vor, die Geschichte so sauber wie möglich zu halten :) –

+1

Ich höre dich. Es hängt von Ihrem Fall ab. Ich arbeitete an Zusammenführungen, die Stunden brauchten. Meine Liebe für eine saubere Geschichte reicht nur so weit. :) – musiKk

Antwort

3

Im Idealfall würden Sie mit rerere „die aufgezeichneten Auflösung wiederverwenden“:

in einem Workflow relativ lange gelebt Thema Zweige verwendet wird, muss der Entwickler manchmal die gleichen Konflikte immer und immer wieder lösen, bis das Thema Zweige entweder mit dem Zweig "release" zusammengeführt oder gesendet und stromaufwärts akzeptiert.

Dieser Befehl unterstützt den Entwickler bei diesem Prozess, indem er widersprüchliche Automerge-Ergebnisse und entsprechende Handauflösungsergebnisse bei der ersten manuellen Zusammenführung aufzeichnet und zuvor aufgezeichnete Handauflösungen auf die entsprechenden Automergeergebnisse anwendet.

Leider ist diese Funktion aktiviert werden muss, bevor Sie zuerst die Zusammenführung tun:

Hinweis: Sie müssen die Konfigurationsvariable setzen, um rerere.enabled diesen Befehl zu aktivieren.

Soweit ich weiß, gibt es keine Abkürzung, um so etwas nach der Tat zu tun. Ich empfehle rerere global aktivieren und dann nochmal die Zusammenführung:

git config --global rerere.enabled true 

In Zukunft könnte diese Einstellung Ihnen viel Zeit sparen!

+0

ich * denke * das kann genau das sein, was ich brauche, netter Fund! :) –

+2

Der Shortcut zur rückwirkenden Aktivierung von Rerere sollte einfach 'git config sein rerere.enabled true; git Kasse y; Git merge -s uns --no-commit C; git read-tree -um KOPF D; git commit; git checkout master'. – jthill

+0

@jthill das sieht nicht einfach für mich aus, aber wenn es funktioniert, wäre es eine nette Ergänzung zu entweder dieser Antwort oder eine separate :) –