2012-03-22 37 views
2

我很困惑this repo history。在该页面上,您将看到一个小分支file-content,即使一个头是另一个头的祖先,它也会合并回分支default为什么Mercurial有时允许与祖先合并?

当我试图做类似的事情,我得到一个中止消息,除非

  1. 侧分支被关闭,
  2. 我从祖先合并到关闭分公司负责人(而不是其他各地的方式)。 (在此抢回购,该file-content分支标记为非活动状态,而不是关闭。)

编辑:下,你可以用一个祖先合并的实际情况在我的答案中描述。

那么这里发生了什么?

回答

3

没有技术上的原因说明你无法与祖先合并:正如你发现的,Mercurial在某些情况下确实支持它。所以这完全是一个GUI限制。这背后的原因是,当hg update会给你与hg merge相同的结果,那么你应该使用它来代替简单。

A 合并只是三种存储库状态的组合:共同祖先和两个正在合并的变更集。三方合并是在一个大块的基础上完成的。对于合并本地和远程表看起来是这样的:

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

+0

请求发表本主题也 – 2012-03-22 13:30:03

+1

那么在这个例子中使用了哪些命令来获取这个变更集历史?我不能在命令行重新创建它。 – Jegschemesch 2012-03-22 21:01:22

3

这很奇怪,记录不准确,但如果您按照https://www.mercurial-scm.org/wiki/Merge底部的链接进行操作,您会看到反对与祖先合并的规则有一个例外。它并不要求我的后代是一个封闭的分支,我最初猜测。相反:

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

这是什么让我们的话,是开始一个新的分支,并把它合并即使我们在对原分公司没有工作的能力临时。