在mercurial强制或覆盖合并?

时间:2011-03-31 22:09:31

标签: mercurial

当我做“hg head”时,我看到两个脑袋。

我想从第一个开始进行更改,完全忽略另一个。

那是什么hg push -f呢?

我如何告诉mercurial忽略第二个头?

2 个答案:

答案 0 :(得分:5)

这篇技巧很好地涵盖了它:

https://www.mercurial-scm.org/wiki/TipsAndTricks#Keep_.22My.22_or_.22Their.22_files_when_doing_a_merge

如果您已更新为所需的那个,那么您将运行:

hg --config ui.merge=internal:local merge  #keep my files

想要hg push -f

答案 1 :(得分:3)

This page提供了三种不同的方法来摆脱分支,但也适用于头部。当Branch有多个孩子时,会创建changeset。可以使用hg branch命令创建命名分支,但是可以通过将两个更改集提交给同一父代来创建未命名的分支(无论是意外还是故意)。

例如,如果我创建一个新的存储库,向其添加一个文件,然后提交,那么该提交将被更改为0.

hg init     # create repo
# edit file myfile.txt
hg add myfile.txt 
hg ci -m 'added myfile.txt' # creates changeset 0

然后我做了一些更改并再次提交,创建了变更集1,其父级是变更集0。

# more edits to myfile.txt
hg ci -m 'changed myfile.txt' # creates changest 1, with parent changeset 0

现在,由于某些未知原因,我回到更改集0,对myfile.txt进行一些更改并提交它们。

hg up -C 0    # update to changeset 0
# more edits to myfile.txt
hg ci -m 'edited myfile.txt' # creates changeset 2, who's parent is also changest 0

现在我们做了一些奇怪的事情。我们在变更集1之前回过头来做了不同的改变。我们已经在我们的代码中回过头来,改变了创建像BttF第二部分中的替代宇宙的东西!

好吧,不是真的。我们真的只是创建了一个分支。然而,它是一个未命名的分支,因为我们没有使用hg branch命令创建它(因此不会显示在`hg分支中)。它还创建了一个新的head。头部只是没有子节点的变更集,因此任何尚未合并或关闭的已命名或未命名的分支都将具有头部。

这是一个人为的例子,可能不是你做的。更常见的是,如果您在两个地方工作而忘记在一个地方完成工作,或在另一个地点再次开始工作时拉动。如果您在一个位置完成时没有按下,当您在第二个位置开始工作时,您可能正在处理较旧的变更集,因此任何提交都将创建第二个头。当你忘记拉扯时会发生类似的事情。

正如我之前所说,这会创建一个未命名的分支。但是,您可以将此分支视为与任何其他分支相同。命令hg update branch_name只是将您更新为该分支的头部,因此对于未命名的分支,您只需使用hg update head_revision更新到该未命名分支的头部,hg heads将列出你(或hg heads -v如果你想了解更多关于每个头的信息。)

我建议只关闭你不再需要的头部(上面第一个链接的第一个选项)。这样它仍然存在以防万一你以后需要它,但它不会出现在hg heads中。为此,请运行以下命令:

hg up -C head_to_close
hg commit --close-branch -m 'Closing un-wanted head'
hg up -C head_to_keep

你必须弄明白你要关闭哪个头。 hg heads -v将为您提供有关头部的扩展信息。您还可以更新每个hg up head_changeset并检查代码以确定要关闭的代码。