Mercurial和合并工具?

ang*_*son 8 svn merge mercurial branch

当两个合并的分支对同一个文件进行更改时,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
Run Code Online (Sandbox Code Playgroud)

首先创建一个包含以下内容的文件:

1
2
3
4
5
Run Code Online (Sandbox Code Playgroud)

然后它将其更改为:

1
2 v1
3
4
5
Run Code Online (Sandbox Code Playgroud)

然后它返回到初始版本(changeset),并将其更改为:

1
2
3
4 v2
5
Run Code Online (Sandbox Code Playgroud)

然后它试图将两者合并.

现在,根据(目前)单一答案,这不应该成为一个问题,因为这些变化没有冲突.

但是,此时,将调用Beyond Compare(我的外部合并工具).

Ry4*_*ase 6

mercurial合并和svn合并之间的最大区别在于mercurial合并算法可以访问合并的两个修订版之间的最后共同祖先.如果你的历史是这样的

A--B
 \-C
Run Code Online (Sandbox Code Playgroud)

svn将使你的合并工具在B和C上失败.Mercurial将使用A,B和C启动你的工具,一些工具可以做得更好.

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

你的测试没有给出很好的结果,因为你正在将它与自己的祖先合并.如果您hg update 0在创建变更集2之前执行了操作,那么您有一个实际的分支历史记录,如下所示:

@  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
Run Code Online (Sandbox Code Playgroud)

然后,当你hg merge得到:

1
2 v1
3
4 v2
5
Run Code Online (Sandbox Code Playgroud)

没有您的合并工具启动.


Joh*_*lph 3

仅当存在需要解决的冲突时才会调用合并工具。在不同分支中对同一文件的更改构成了此类冲突。

除此之外,实际的合并算法不是基于变更集的,而是基于文件的,以实现最佳合并结果。请参阅Mercurial Wiki了解更多详细信息。

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