ang*_*son 8 svn merge mercurial branch
当两个合并的分支对同一个文件进行更改时,Mercurial是否始终使用外部合并工具?
或者它是否首先看到它是否可以合并文件本身,并且如果它不能,只能向外部工具发送?
我问的原因是我(再一次)重读了Joel Spolsky在Mercurial上写的教程,他说,在比较Subversion和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
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(我的外部合并工具).
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)
没有您的合并工具启动.
仅当存在需要解决的冲突时才会调用合并工具。在不同分支中对同一文件的更改构成了此类冲突。
除此之外,实际的合并算法不是基于变更集的,而是基于文件的,以实现最佳合并结果。请参阅Mercurial Wiki了解更多详细信息。
Mercurial 会让您的合并保持未提交状态,因此您有机会在提交合并变更集之前检查您的代码。
| 归档时间: |
|
| 查看次数: |
1695 次 |
| 最近记录: |