与hg合并“没有任何合并”

时间:2013-12-21 21:52:06

标签: version-control mercurial merge

我正在尝试将其他DVCS转换为Mercurial。我发现Mercurial不会让我做其他DVCS认为完全合理的事情。

似乎在回购中,其中一个用户习惯于这样工作:

  • 在fork工作
  • 合并主干 - >叉
  • 测试
  • 合并分叉 - >躯干

这一切看起来都很合理。除非在用户测试时如果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让我这样做?

1 个答案:

答案 0 :(得分:1)

修订版3是修订版1的直接祖先。此处没有并发更改。您需要做的只是hg update 3

如果您有两个不同的分支,并且您希望在新的通用版本中收集双方的更改,则应用合并。在这种情况下,您需要在两个不同版本之间进行三向合并(使用来自更多共同祖先的信息)

在你的情况下,有两个不同的版本,没有共同的祖先,只是你的文件的旧版本和新版本。您只想使用hg updateupdate是移动的官方命令,checkout是其别名)

我不知道为什么这个其他DVCS通过调用“合并”不涉及任何合并的东西而使你感到困惑。

(注意:考虑使用hg log -G来获取图表的图形输出)

(其他说明:永远不要使用合并--force这是一个旧的弃用标志做傻事。它有充分理由隐藏hg help merge