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

我只想从第一个中获取更改并完全忽略另一个。

那是 hg push -f 的作用吗?

我怎么能告诉 mercurial 忽略第二个头?

最佳答案

This page 提供了三种不同的去除 Twig 的方法,但也适用于头部。当 Branch 有多个 child 时,就会创建一个 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 Part II 一样的替代宇宙!

好吧,不是真的。我们真的刚刚创建了一个分支。然而,它是一个未命名的分支,因为我们没有使用 hg branch 命令创建它(因此不会出现在 `hg 分支中)。它还创建了一个新的 head 。 Heads 只是没有子节点的变更集,因此任何尚未合并或关闭的命名或未命名分支都将具有一个 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 并检查代码以确定您要关闭哪一个。

关于mercurial - 在 mercurial 中强制或覆盖合并?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5506928/

10-15 02:57