1

在下图中,我发现了 Mozilla 的 mercurial 存储库图,其中出现了我认为不可能的情况。他们有两个提交具有相同的父级,其中一个是合并。我一直想这样做,但找不到答案。

@ merge pull request from foo polish text
|\
| o bug 1 - add text ...
|/
o merge pull request from bar bug 2

他们是如何做到这一点的?通常,当您将该添加中的更改拉到头部时,如果您尝试合并,您将得到“没有可合并的内容”。

4

1 回答 1

4

实现此目的的一种方法是使用 Mercurials 内置的“调试”命令。它们实际上是你永远不需要使用的命令,除非你知道,调试 Mercurial。理论上使用它们可能会破坏您的存储库,因此如果您确实需要,请使用克隆。

$ hg help --debug
...
 debugsetparents
           manually set the parents of the current working directory

如您所见,此命令的作用是允许我们手动设置工作目录的父级 - 使用它我们可以伪造合并。

因此,有了这些知识,并在一定程度上谨慎,我们可以做到:

$ hg log --graph
  @  1[tip]  Change by A.N.Other
  |
  o  0  Local Change
$ hg debugsetparents 0 1
$ hg log --graph
  @  1[tip]  Change by A.N.Other
  |
  @  0  Local Change
$ hg commit -m "Merged"
$ hg log --graph
  @  2[tip] Merged
  |\
  | o 1  Change by A.N.Other
  |/
  o 0  Local Change

这不是我通常建议的事情,但它可以让您说明您正在从“另一个分支”中提取一些更改,而该分支实际上是您更改的尖端,我猜这是目标。

另外,请注意下面 shambulator 的评论 - 为了将更改包含在 中1,您需要在执行 时将其作为您的工作目录debugsetparents,否则您将丢失这些更改。当然,除非您的计划是放弃这些更改,在这种情况下,您应该update更改集0,然后伪造合并。

于 2013-04-16T10:02:32.913 回答