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.