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



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

当我尝试做类似的事情时,我会收到一条中止消息,除非

  1. 侧分支关闭
  2. 我从祖先融合到封闭的分支头(但不是相反)。(在此抓取回购中,file-content分支标记为非活动,而非关闭。)

编辑:我的回答中描述了你可以与祖先合并的真实条件。

这是怎么回事?

奇怪的是,这篇文章记录得很差,但如果您按照https://www.mercurial-scm.org/wiki/Merge,您将看到反对与祖先合并的规则有一个例外。它不需要像我最初推测的那样,后代是一个封闭的分支。相反:

  1. 您必须从祖先合并(即工作目录必须更新到祖先,而不是其他变更集)
  2. 工作目录的父目录和要合并的变更集的分支名称必须不同。例如,一个默认为分支名称,另一个具有分支名称功能-X

因此,这使我们能够启动一个新分支并将其合并回来,即使在此期间我们不处理原始分支。

没有技术原因不能与祖先合并:正如您所发现的,Mercurial在某些情况下确实支持它。所以这纯粹是一个GUI限制。这背后的原因是,当hg update会给你与hg 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的合并变更集。

最新更新