我正在尝试将其他DVCS转换为Mercurial。我发现Mercurial不会让我做其他DVCS认为完全合理的事情。
似乎在回购中,其中一个用户习惯于这样工作:
这一切看起来都很合理。除非在用户测试时如果trunk 尚未提前,hg拒绝执行最终合并,使用'abort:nothing to merge'。 --force
无效。
我可以使用以下测试用例复制这个:
echo "Test data" > file
hg add file
hg commit file -m "Ancestor"
# rev 0
echo "Trunk" > file
hg commit file -m "Trunk"
# rev 1
hg checkout 0
echo "Branch" > file
hg commit file -m "Branch"
# rev 2
hg merge --tool internal:local 1
hg commit -m "Merge trunk to branch"
# rev 3
hg checkout 1
hg merge --tool internal:local 3 # <--- fails
hg commit -m "Merge branch to trunk"
如果我修改测试以使trunk在两个合并之间前进,那么在最终合并主干现在是一个新版本4并且版本3合并到它中,一切正常。
这显然都是完全标准的工作流程---我自己这样做。那么为什么这不起作用呢?
更新
此测试用例有效:
echo "Test data" > file
hg add file
hg commit file -m "Ancestor"
hg branch trunk
# rev 0
echo "Trunk" > file
hg commit file -m "Trunk"
# rev 1
hg checkout 0
hg branch branch
echo "Branch" > file
hg commit file -m "Branch"
# rev 2
hg merge --tool internal:local 1
hg commit -m "Merge trunk to branch"
# rev 3
hg checkout 1
hg merge --tool internal:local 3
hg commit -m "Merge branch to trunk"
这是与第一个测试用例完全相同的代码,除了trunk和fork现在是明确分支的,而不仅仅是使用ad-hoc头。所有合并和签出都使用与以前相同的修订版本。显然,分支是神奇的。
不幸的是我不能在实际代码中使用分支,因为其他DVCS 使用ad-hoc头,其中没有任何分支信息。我不想为每个叉子假一个分支。
如何在不使用显式分支的情况下说服Mercurial让我这样做?
答案 0 :(得分:1)
修订版3是修订版1的直接祖先。此处没有并发更改。您需要做的只是hg update 3
。
如果您有两个不同的分支,并且您希望在新的通用版本中收集双方的更改,则应用合并。在这种情况下,您需要在两个不同版本之间进行三向合并(使用来自更多共同祖先的信息)
在你的情况下,有两个不同的版本,没有共同的祖先,只是你的文件的旧版本和新版本。您只想使用hg update
(update
是移动的官方命令,checkout
是其别名)
我不知道为什么这个其他DVCS通过调用“合并”不涉及任何合并的东西而使你感到困惑。
(注意:考虑使用hg log -G
来获取图表的图形输出)
(其他说明:永远不要使用合并--force这是一个旧的弃用标志做傻事。它有充分理由隐藏hg help merge