2012-03-22 51 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

這是什麼讓我們的話,是開始一個新的分支,並把它合併即使我們在對原分公司沒有工作的能力臨時。