为什么Mercurial有时允许与祖先合并?

时间:2012-03-22 11:11:01

标签: mercurial merge branch dvcs

我对this repo history感到困惑。在该页面上,您将看到一个小分支file-content,它被合并回分支default,即使一个头是另一个的祖先。

<击> 当我尝试做类似的事情时,除非

,否则我会收到中止消息
    <击>
  1. 侧枝已关闭
  2. 我从祖先合并到封闭的分支头(但不是相反)。 (在此抓取仓库中,file-content分支标记为非活动状态,未关闭。)
  3. 编辑:我可以在回答中描述您可以与祖先合并的真实条件。

    那么这里发生了什么?

2 个答案:

答案 0 :(得分:4)

这个文档很难记录,但是如果你按照https://www.mercurial-scm.org/wiki/Merge底部的链接进行操作,你就会看到规则与一个祖先合并的例外。正如我最初推测的那样,它不需要后代是一个封闭的分支。代替:

  1. 您必须从祖先合并(即工作目录必须更新为祖先,而不是其他变更集)
  2. 工作目录的父级和您要合并的变更集的分支名称必须不同。例如。一个具有分支名称default,另一个具有分支名称-X
  3. 这使我们能够开始一个新的分支并将其合并回来,即使我们在过渡期间没有在原始分支上工作。

答案 1 :(得分:3)

没有技术上的理由说明为什么你不能与祖先合并:正如你所知,Mercurial在某些情况下确实支持它。所以这纯粹是一个GUI限制。这背后的原因是当hg update给出与hg merge相同的结果时,为了简单起见,您应该使用它。

merge 只是三种存储库状态的混合:共同的祖先和你正在合并的两个变更集。三方合并是以大块为基础进行的。用于将本地与远程合并的表格如下所示:

ancestor  local  remote -> merge
old       old    old       old (nobody changed the hunk)
old       new    old       new (I changed the hunk)
old       old    new       new (you changed the hunk)
old       new    new       new (hunk was cherry picked onto both branches)
old       foo    bar       <!> (conflict, both changed hunk but differently)

如果localremote的祖先,那么ancestor == local。因此表格变为:

ancestor  local  remote -> merge
old       old    old       old (nobody changed the hunk)
old       old    new       new (you changed the hunk)

在这两种情况下,merge列都包含remote列中的内容。在您的示例中,localdefaultremotefile-content

$ hg update default
$ hg merge file-content

结果是合并变更集,看起来就像file-content