2010-07-09 12 views
8

Verwendet Mercurial immer die externen Zusammenführungstools, wenn zwei Zweige, die zusammengeführt werden, Änderungen an derselben Datei aufweisen?Mercurial- und Merge-Tools?

Oder sieht es zuerst, ob es die Datei selbst zusammenführen kann, und nur zum externen Werkzeug stochern, wenn es nicht kann?

Der Grund, warum ich gefragt habe, ist, dass ich (wieder einmal) Wieder Lesen der tutorial written by Joel Spolsky on Mercurial und eine Sache, sagt er, bei einem Vergleich, wie Subversion und Mercurial ist, dass verschmilzt:

dagegen während Wir arbeiteten separat in Mercurial, Mercurial war damit beschäftigt, eine Reihe von Changesets zu behalten. Wenn wir also unseren Code zusammenführen wollen, hat Mercurial tatsächlich eine ganze Menge 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 das externe Merge-Tool, wenn zwei Zweige Änderungen müssen die gleichen Dateien einzubinden scheint. Und macht das obige Argument nicht falsch?

Oder sollte ich interpretieren dies wie folgt:

  • Subversion nur den Endzustand der beiden Zweige verbindet, und mehr Arbeit hat in einer einzigen Einheit
  • Mercurial verschmilzt jede ChangeSet einzeln, was zu tun erlaubt es mit kleineren Einheiten von Änderungen zu arbeiten, mit einer höheren Chance auf Merge-Erfolg

Kann jemand etwas Licht darauf werfen?


bearbeiten: Lassen Sie mich ein Beispiel geben:

@echo off 

setlocal 

if exist repo rd /s /q repo 

md repo 
cd repo 
hg init . 

rem --- version 0 --- 
echo 1 >test.txt 
echo 2 >>test.txt 
echo 3 >>test.txt 
echo 4 >>test.txt 
echo 5 >>test.txt 
hg add test.txt 
hg commit -m "v0" 

rem --- version 1 --- 
echo 1 >test.txt 
echo 2 v1 >>test.txt 
echo 3 >>test.txt 
echo 4 >>test.txt 
echo 5 >>test.txt 
hg commit -m "v1" 

rem --- version 2 --- 
hg update 0 
echo 1 >test.txt 
echo 2 >>test.txt 
echo 3 >>test.txt 
echo 4 v2 >>test.txt 
echo 5 >>test.txt 
hg commit -m "v2" 

rem --- merge --- 
hg update 1 
hg merge 2 

Diese erste erstellt eine Datei mit folgendem Inhalt:

1 
2 
3 
4 
5 

Dann ändert er es an:

1 
2 v1 
3 
4 
5 

Dann geht es zurück in die erste Version (changeset) und ändert es an:

1 
2 
3 
4 v2 
5 

Dann versucht er, die beiden zu verschmelzen.

Jetzt, nach der (derzeit) 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.

Antwort

3

Das Mergetool 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.

Ansonsten ist der eigentliche Merge-Algorithmus nicht changeset basiert, es ist dateibasiert, um die besten Zusammenführungsergebnisse zu ermöglichen. Weitere Informationen finden Sie unter Mercurial Wiki.

Mercurial lässt Ihre Zusammenführung unkompiliert, so dass Sie eine Möglichkeit haben, Ihren Code zu überprüfen, bevor Sie die Zusammenführungsänderung durchführen.

+0

Bitte sehen Sie meine bearbeitete Frage –

+0

Entschuldigung, ich habe bearbeitet, während Sie auch waren. Sollte jetzt klarer sein. Die Kriterien für den Aufruf von mergetool sind Änderungen an derselben Datei, was völlig in Ordnung ist. –

6

Der große Unterschied zwischen mercurial merging und svn merging ist, dass der mercurial merge algorithm Zugriff auf den last-common-ancestor zwischen den beiden Revisionen hat, die zusammengeführt werden. Wenn Ihre Geschichte sieht aus wie

A--B 
\-C 

SVN Ihre merge Tools verlieren auf B und C. Mercurial drehen startet Ihr Werkzeug mit A, B und C und einige Werkzeuge besser Sachen damit.

Mercurial macht seine eigene interne Zusammenführung, bevor es Ihr Werkzeug startet, wo es A, B und C benutzt, um einige der offensichtlichen Wahlen selbst zu machen. Sie können dies ausschalten, indem Sie die Einstellung premerge für ein Werkzeug ändern.

Ihr Test liefert keine großartigen Ergebnisse, da Sie 2 mit seinem eigenen Vorfahren zusammenführen. Wenn stattdessen haben Sie eine hg update 0 vor changeset Erstellen von 2, so dass Sie eine tatsächliche Verzweigungs Geschichte wie folgt aus:

@ changeset: 2:790856e061f4 
| tag:   tip 
| parent:  0:bfba1d8f77af 
| user:  Ry4an Brase 
| date:  Fri Jul 09 16:50:34 2010 -0500 
| summary:  added v2 
| 
| @ changeset: 1:7a9c581561b6 
|/ user:  Ry4an Brase 
| date:  Fri Jul 09 16:50:16 2010 -0500 
| summary:  added v1 
| 
o changeset: 0:bfba1d8f77af 
    user:  Ry4an Brase 
    date:  Fri Jul 09 16:49:29 2010 -0500 
    summary:  first 

dann, wenn Sie hg merge Sie erhalten:

1 
2 v1 
3 
4 v2 
5 

ohne Ihre Merge-Tool Start.