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