我也一直在寻找这样一个案例,例如Subversion无法合并分支,而Mercurial(以及Git,Bazaar等)做正确的事情。
SVN手册描述了重命名文件的错误合并方法。这适用于颠覆1.5,1.6,1.7和1.8!我试图重新创建以下情况:
cd / tmp
RM - 射频SVN - 回购SVN - 结帐
svnadmin的创建SVN - 回购
svn签文件:/// tmp目录/ SVN - 回购SVN - 结帐
CD SVN - 结帐
mkdir树干分支
回声“再见,世界!” > 行李箱/ 您好。文本
svn添加主干分支
svn commit - m '初始导入'。
svn复制'^ / trunk' '^ / branches / rename' - m '创建分支。'
svn开关'^ / trunk' 。
回声“你好,世界!” > 你好。文本
svn commit - m '在主干上更新'。
svn开关'^ / branchches / rename' 。
svn重命名你好。txt你好。en 。文本
svn commit - m '在分支上重命名。
svn开关'^ / trunk' 。
SVN合并- 再集成'^ /分支机构/重命名'
根据这本书,合并应该完全完成,但是由于trunk
忘记了更新,因此重命名文件中的数据错误。相反,我遇到了树冲突(这是Subversion 1.6.17,这是撰写本文时Debian中的最新版本):
---将存储库URL之间的差异合并为“。”:
hello.en.txt
C hello.txt
冲突摘要:
树冲突:1
根本不应该有任何冲突-更新应合并到文件的新名称中。当Subversion失败时,Mercurial会正确处理此问题:
rm -rf /tmp/hg-repo
hg init /tmp/hg-repo
cd /tmp/hg-repo
echo 'Goodbye, World!' > hello.txt
hg add hello.txt
hg commit -m 'Initial import.'
echo 'Hello, World!' > hello.txt
hg commit -m 'Update.'
hg update 0
hg rename hello.txt hello.en.txt
hg commit -m 'Rename.'
hg merge
合并之前,存储库如下所示(来自hg glog
):
@变更集:2:6502899164cc
| 标签:小费
| 父母:0:d08bcebadd9e
| 使用者:Martin Geisler
| 日期:2010年4月1日星期四12:29:19 +0200
| 摘要:重命名。
|
| o变更集:1:9d06fa155634
| /用户:马丁·盖斯勒(Martin Geisler)
| 日期:2010年4月1日星期四12:29:18 +0200
| 摘要:更新。
|
o变更集:0:d08bcebadd9e
使用者:Martin Geisler
日期:2010年4月1日星期四12:29:18 +0200
摘要:初始导入。
合并的输出为:
将hello.en.txt和hello.txt合并到hello.en.txt
更新了0个文件,合并了1个文件,删除了0个文件,未解决0个文件
(分支合并,别忘了提交)
换句话说:Mercurial接受了版本1的更改,并将其合并到版本2(hello.en.txt
)的新文件名中。为了支持重构,处理这种情况当然是必不可少的,而重构正是您要在分支上执行的操作。