“没有啥可以合并”与 hg 合并

Posted

技术标签:

【中文标题】“没有啥可以合并”与 hg 合并【英文标题】:"nothing to merge" with hg merge“没有什么可以合并”与 hg 合并 【发布时间】:2014-01-10 12:20:46 【问题描述】:

我正在尝试从不同的 DVCS 转换为 Mercurial。我发现 Mercurial 不允许我做其他 DVCS 认为完全合理的事情。

似乎在 repo 中,其中一位用户习惯于这样工作:

分叉 在 fork 中工作 合并主干->分叉 测试 合并前叉 -> 主干

这一切似乎都很合理。除了如果用户在测试时主干没有前进,hg 拒绝进行最终合并,与

中止:没有可合并的内容

--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"

如果我修改测试以使主干在两个合并之间前进,那么在最后的合并中主干现在是一个新的修订版 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】:

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

当你有两个不同的分支并且你想在一个新的通用版本中收集双方的变化时,合并适用。在这种情况下,您需要在两个不同版本之间进行三向合并(使用来自他们更大共同祖先的信息)

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

我不知道为什么这个其他 DVCS 将不涉及任何合并的东西称为“合并”而让您感到困惑。

(注意:考虑使用hg log -G 作为图形的图形输出)

(其他注意事项:永远不要使用 merge --force 这是一个旧的不推荐使用的标志做愚蠢的事情。它对hg help merge 隐藏是有充分理由的)

【讨论】:

恐怕我不同意 --- 我认为它合并,我可以证明这一点:查看更新。通过将每个分叉放入一个明确的分支,Mercurial 非常乐意进行合并,即使 DAG 的形状与以前完全相同。不幸的是,由于上述原因,我不能为此使用显式分支... 如果添加分支信息有多个行为变化(包括上面提到的更新行为)。在这种情况下,合并会进行一个新的提交,其中包含一个新的分支信息。在您最初描述的情况下,新提交没有意义(没有文件更改,没有元数据更改等)您到底想在这里做什么?

以上是关于“没有啥可以合并”与 hg 合并的主要内容,如果未能解决你的问题,请参考以下文章

“没有要合并的内容,与hg merge

Hg合并后提交消息,最佳做法?

如何只推送到 Hg 中的一个分支?

合并df:没有错误,但只输出标题行

如何找到hg的gitk工具类型

想法提交失败与 hg