Mercurial和合并工具?

8
当两个合并的分支有对同一个文件进行更改时,Mercurial是否总是使用外部合并工具?
还是说它首先尝试自己合并文件,只有在无法合并时才会使用外部工具?
我之所以问这个问题,是因为我又一次重新阅读了Joel Spolsky关于Mercurial的教程,其中他在比较Subversion和Mercurial的合并方式时说:
相比之下,当我们在Mercurial中单独工作时,Mercurial忙于保持一系列变更集。因此,当我们想要将代码合并在一起时,Mercurial实际上拥有更多信息:它知道我们每个人都做了什么更改,并可以重新应用这些更改,而不仅仅是查看最终产品并尝试猜测如何组合它们。
只是,我的经验告诉我,当两个分支对同一文件进行更改时,它似乎涉及到外部合并工具。那么,这不会使上述论点不正确吗?
还是我应该这样解释:
  • Subversion仅合并两个分支的最终状态,并且在单个单元中需要更多的工作
  • 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(我的外部合并工具)被调用。
2个回答

6

Mercurial合并和SVN合并的主要区别在于Mercurial合并算法可以访问被合并的两个版本之间的最后共同祖先。如果您的历史记录看起来像:

A--B
 \-C

SVN会在B和C上使用合并工具,而Mercurial会在A、B和C上启动您的工具,某些工具可以更好地处理此类情况。

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

您的测试结果不佳,因为您正在将2与其自身的祖先进行合并。如果您改为在创建第2个changeset之前执行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

没有你的合并工具启动。

3

只有在需要解决冲突时,才会调用mergetool。在不同分支中对同一文件的更改构成了这样的冲突。

除此之外,实际合并算法并非基于变更集,而是基于文件,以获得最佳合并结果。有关更多详细信息,请参见Mercurial Wiki

Mercurial保留您的合并未提交,因此您有机会在提交合并变更集之前检查代码。


抱歉,当你在编辑时我也在编辑。现在应该更清楚了。mergetool调用的条件是对同一文件的更改,这是完全合理的。 - Johannes Rudolph

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接