我对这个回购历史感到困惑。在该页面上,您将看到一个小分支file-content
,它被合并回分支default
,即使其中一个头是另一个头的祖先。
当我尝试做类似的事情时,我会收到一条中止消息,除非
- 侧分支关闭
- 我从祖先融合到封闭的分支头(但不是相反)。(在此抓取回购中,
file-content
分支标记为非活动,而非关闭。)
编辑:我的回答中描述了你可以与祖先合并的真实条件。
这是怎么回事?
奇怪的是,这篇文章记录得很差,但如果您按照https://www.mercurial-scm.org/wiki/Merge,您将看到反对与祖先合并的规则有一个例外。它不需要像我最初推测的那样,后代是一个封闭的分支。相反:
- 您必须从祖先合并(即工作目录必须更新到祖先,而不是其他变更集)
- 工作目录的父目录和要合并的变更集的分支名称必须不同。例如,一个默认为分支名称,另一个具有分支名称功能-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)
如果local
是remote
的祖先,则ancestor == local
。因此表格变成:
ancestor local remote -> merge
old old old old (nobody changed the hunk)
old old new new (you changed the hunk)
在这两种情况下,merge
列都包含remote
列中的内容。在您的示例中,local
是default
,remote
是file-content
:
$ hg update default
$ hg merge file-content
结果是一个看起来像file-content
的合并变更集。