Benutzt Mercurial immer die externen Merge-Tools, wenn zwei Zweige, die zusammengeführt werden, Änderungen an derselben Datei haben?
Oder sieht es zuerst, ob es die Datei selbst verschmelzen kann, und wenn es nur zum externen Werkzeug stochert, wenn nicht?
Der Grund, warum ich frage, ist, dass ich das Tutorial von Joel Spolsky auf Mercurial noch einmal durchgelesen habe und eine Sache sagt er, wenn man vergleicht, wie Subversion und Mercurial verschmelzen:
Im Gegensatz dazu war Mercurial, während wir getrennt in Mercurial arbeiteten, damit beschäftigt, eine Reihe von Changesets beizubehalten. Wenn wir also unseren Code zusammenführen wollen, hat Mercurial tatsächlich viel mehr Informationen: Er weiß, was jeder von uns geändert hat, und kann diese Änderungen erneut anwenden, anstatt nur das Endprodukt zu betrachten und zu erraten, wie es formuliert wird zusammen.
Nur, meine Erfahrung sagt mir, dass es scheint, das externe Merge-Tool zu involvieren, wenn zwei Zweige Änderungen an den gleichen Dateien haben. Und macht das obige Argument nicht falsch?
Oder soll ich das wie folgt interpretieren:
Kann jemand etwas Licht darauf werfen?
Bearbeiten : Lassen Sie mich ein Beispiel geben:
%Vor%Dies erstellt zuerst eine Datei mit folgendem Inhalt:
%Vor%Dann ändert es sich zu:
%Vor%Dann geht es zurück zur ursprünglichen Version (changeset) und ändert es in:
%Vor%Dann versucht es die beiden zusammenzuführen.
Nun, nach der (momentan) einzigen Antwort sollte dies kein Problem darstellen, da die Änderungen nicht in Konflikt stehen.
An diesem Punkt wird jedoch Beyond Compare (mein externes Merge-Tool) aufgerufen.
Das mergtool wird nur für den Fall aufgerufen, dass ein Konflikt gelöst werden muss. Änderungen an derselben Datei in verschiedenen Zweigen stellen einen solchen Konflikt dar.
Abgesehen davon ist der eigentliche Merge-Algorithmus nicht change-set-basiert, sondern dateibasiert, um die besten Zusammenführungsergebnisse zu ermöglichen. Weitere Informationen finden Sie im Mercurial Wiki .
Mercurial lässt Ihre Zusammenführung unkompiliert, so dass Sie die Möglichkeit haben, Ihren Code zu überprüfen, bevor Sie den Zusammenführungs-Änderungssatz ausführen.
Der große Unterschied zwischen mercurial merging und svn merging besteht darin, dass der mercurial merge-Algorithmus Zugriff auf den last-common-ancestor zwischen den beiden Revisionen hat, die zusammengeführt werden. Wenn Ihr Verlauf aussieht wie
%Vor%svn wird Ihre Merge-Tools auf B und C verlieren. Mercurial wird Ihr Tool mit A, B und C starten und einige Tools machen das besser.
Mercurial macht seine eigene interne Zusammenführung, bevor es Ihr Werkzeug startet, wo es A, B und C verwendet, um einige der offensichtlichen Entscheidungen selbst zu treffen. Sie können dies ausschalten, indem Sie die Einstellung premerge
für ein Werkzeug ändern.
Ihr Test liefert keine großartigen Ergebnisse, weil Sie 2 mit seinem eigenen Vorfahren zusammenführen. Wenn Sie stattdessen ein hg update 0
vor dem Erstellen von Änderungsmenge 2 erstellen, haben Sie eine tatsächliche Verzweigungshistorie wie folgt:
Wenn du hg merge
hast, bekommst du:
ohne Ihr Merge-Tool zu starten.