2010-07-09 94 views
8

Mercurial总是使用外部合并工具,当合并的两个分支对同一文件有更改时?Mercurial和合并工具?

或者首先看它是否可以合并文件本身,并且只有在外部工具无法合并的情况下才能进行合并?

的原因,我问的是,我(再次)重新读取tutorial written by Joel Spolsky on Mercurial一件事,他说,比较颠覆和Mercurial如何合并的时候是:

相比之下,而我们在Mercurial分开工作,Mercurial正在忙于保存一系列变更集。所以,当我们想要将我们的代码合并在一起时,Mercurial实际上拥有更多的信息:它知道我们每个人都改变了什么,并且可以重新应用这些改变,而不仅仅是看最终产品,并试图猜测如何把它们一起。

只是,我的经验告诉我,当两个分支对同一个文件进行更改时,似乎涉及外部合并工具。因此,这不会导致上述观点不正确吗?

或者我应该解释为如下:

  • 颠覆仅合并这两个分支的最终状态,并有更多的工作在一个单元
  • 水银合并每个单独变更,这使得做它与更小的变化单位一起工作,合并成功的可能性更高

有人可以对此有所了解吗?


编辑:我举一个例子:

@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 

这首先创建具有下列内容的文件:

1 
2 
3 
4 
5 

然后它更改为:

1 
2 v1 
3 
4 
5 

然后,它返回到初始版本(变更),它改变为:

1 
2 
3 
4 v2 
5 

然后,它试图将二者合并。

现在,根据(当前)单个答案,这应该不会造成问题,因为这些更改没有冲突。

但是,在这一点上,Beyond Compare(我的外部合并工具)被调用。

回答

3

只有在需要解决冲突的情况下,才会调用mergetool。对不同分支中相同文件的更改构成了这种冲突。

除此之外,实际的合并算法不基于变更集,它基于文件以允许最佳合并结果。有关更多详细信息,请参阅Mercurial Wiki

Mercurial使您的合并不成功,因此您有机会在合并变更集之前检查您的代码。

+0

请看我编辑的问题 – 2010-07-09 19:50:05

+0

对不起,我在编辑,你也是。现在应该更清楚了。 mergetool调用的标准是对同一个文件的更改,这是非常合理的。 – 2010-07-09 19:54:15

6

mercurial merge和svn merge的最大区别在于mercurial merge算法可以访问被合并的两个版本之间的最后一个共同祖先。如果你的历史看起来像

A--B 
\-C 

SVN会变成你的合并工具失去对B和C.水银将推出与A,B和C的工具和一些工具,做的更好的东西这一点。

在使用A,B和C自己做出一些明显的选择之前,Mercurial会在启动工具之前进行自己的内部合并。您可以通过更改工具的premerge设置来关闭该功能。

由于您将2与自己的祖先合并,所以您的测试没有给出好的结果。相反,如果你在创建变更2之前做hg update 0,让你有一个实际的分支历史是这样的:

@ 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 

然后当你你会得到hg merge

1 
2 v1 
3 
4 v2 
5 

没有你的合并工具启动。