2016-07-14 16 views
0

Ich habe mit Merge Commit, danach habe ich Backout in Hauptzweig, um die letzte Zusammenführung zurückgesetzt. Nach einiger Zeit muss ich Zweig zusammenführen, aber mercurial sagt, dass abbrechen: Zusammenführen mit einem Arbeitsverzeichnis Vorfahren hat keine WirkungWie merge nach Backout Mercurial

Aber in Zweig entwickeln sehe ich nicht meine Änderungen von anderen Branchen.

Antwort

0

Zusammenführen nimmt nur Dinge auf, die seit der letzten Zusammenführung neu sind. Zum Beispiel:

default: *------------? 
      \  /
develop:  o--o--o--o 

Jeder o stellt einige begehen. Wir begannen mit dem Standard-Zweig (default) mit nur einem Commit, dem hier markierten * anstelle von o. Dann haben wir einen develop-Zweig erstellt, der mit dem gleichen ersten Commit beginnt und etwas Arbeit geleistet hat.

Sobald die Arbeit fertig war, gingen wir zurück zum default Zweig und verwendeten hg merge. Dies schlug vor, ein neues Commit zu machen, ?. Dies geschah, indem wir auf * - das Commit, das wir gemeinsam hatten zwischen default und develop - zurückblickten und uns ansahen, was wir an den beiden Zweigen gemacht und kombiniert haben.

Wir haben nichts auf default, so dass die Kombination war einfach. Mercurial konnte einfach alles, was wir getan haben, auf develop nehmen und alles in default setzen. Lassen Sie uns in der Zusammenführung füllen, wie eine echte begehen jetzt:

default: o------------* 
      \  /
develop:  o--o--o--o 

Beachten Sie, dass ich die * verschoben haben. Es ist jetzt die neue Zusammenführung. Dies ist das letzte Commit, das die beiden Zweige verbindet.

In der Zwischenzeit macht hg backout einen neuen Commit, der einen vorherigen Commit rückgängig macht. Insbesondere möchten Sie die Zusammenführung zurücksetzen. Lassen Sie uns das Unentschieden:

default: o------------*--u 
      \  /
develop:  o--o--o--o 

Diese neue begehen ist so etwas wie der Anti-Materie-Version der Zusammenführung, machte in Bezug auf Änderungen sowieso. Alles in default geht zurück zu dem, was es vor der Zusammenführung war. Also habe ich den Buchstaben u (für "undo") anstelle des üblichen runden o Punktes für einen typischen Commit verwendet.

Wo ist der letzte gemeinsame Commit für die beiden Zweige? Die Antwort sollte offensichtlich sein: Es ist immer noch *.

Jetzt bitten Sie Mercurial, wieder zusammenzuführen. Es findet die Änderungen in develop seit der Zusammenführung und es gibt keine. Es gibt keine neue Arbeit zum Zusammenführen!

Angenommen, wir develop wieder auschecken und einige neue Commits machen:

default: o------------*--u 
      \  /
develop:  o--o--o--o------o--o 

Jetzt wir hg merge develop in default wieder können, die Änderungen aus den beiden neuen Commits abzuholen. Aber die Änderungen, die Sie undid, mit commit u (das Backout-Commit), sind immer noch nicht getan.Wir werden nur die Änderungen von den neuen abholen (da die Zusammenführung) auf develop verpflichtet, und wir die Änderungen halten gemacht (seit der Zusammenführung) auf default, das heißt, die u Änderungen rückgängig machen:

default: o------------o--u------* 
      \  /  /
develop:  o--o--o--o------o--o 

Wenn Sie alle diese Änderungen zurück möchten, können Sie einfach das Backout zurücksetzen. Das heißt, jederzeit vor oder nach dem Hinzufügen der neuen Commits unter develop und sogar vor oder nach dem Zusammenführen dieser neuen Commits können Sie das Rückgängigmachen rückgängig machen. Lassen Sie sich die u den Kopf in eine „Redo“ drehen und sehen, wie das aussieht, wenn wir es vor dem nächsten merge einfügen:

default: o------------o--u--n-----* 
      \  /  /
develop:  o--o--o--o--------o--o 

Mit anderen Worten, begehen u (die hg backout) un-haben die ändert aus der Zusammenführung. Es führt nicht dazu, dass die Zusammenführung nicht stattfinden kann. So zu wieder erhalten die Änderungen von der Zusammenführung, müssen Sie rückgängig machen, die unsere n hier ist.