2013-12-21 44 views
3

我試圖從一個不同的DVCS轉換爲Mercurial。我發現Mercurial不會讓我做其他DVCS發現完全合理的事情。「沒有合併」與汞合併

看來,在回購,其中一個用戶是這樣工作的習慣:

  • 做工作叉
  • 合併幹線 - >叉
  • 測試
  • 合併叉 - >幹線

這一切似乎完全reasonab樂。除非在用戶測試期間,如果主幹尚未提前,則hg拒絕執行最終合併,並以'abort:無法合併'進行最終合併。 --force沒有幫助。如果我修改了測試,使軀幹兩個合併之間的進步,所以在最終合併主幹現在是一個新的修訂4修訂3

echo "Test data" > file 
hg add file 
hg commit file -m "Ancestor" 
# rev 0 

echo "Trunk" > file 
hg commit file -m "Trunk" 
# rev 1 

hg checkout 0 
echo "Branch" > file 
hg commit file -m "Branch" 
# rev 2 

hg merge --tool internal:local 1 
hg commit -m "Merge trunk to branch" 
# rev 3 

hg checkout 1 
hg merge --tool internal:local 3 # <--- fails 
hg commit -m "Merge branch to trunk" 

我可以用下面的測試案例複製此被合併到它,一切工作正常。

這顯然是完全標準的工作流程---我自己做這個。那麼,爲什麼這不起作用呢?

更新:

這個測試用例工作:

echo "Test data" > file 
hg add file 
hg commit file -m "Ancestor" 
hg branch trunk 
# rev 0 

echo "Trunk" > file 
hg commit file -m "Trunk" 
# rev 1 

hg checkout 0 
hg branch branch 
echo "Branch" > file 

hg commit file -m "Branch" 
# rev 2 

hg merge --tool internal:local 1 
hg commit -m "Merge trunk to branch" 
# rev 3 

hg checkout 1 
hg merge --tool internal:local 3 
hg commit -m "Merge branch to trunk" 

這是完全相同的代碼在第一個測試的情況下,除了軀幹和叉,現在明確支,而不是僅僅使用特設頭部。所有合併和簽出使用與以前相同的修訂。顯然樹枝是魔法。

不幸的是,我不能在實際代碼中使用分支,因爲其他DVCS 使用ad-hoc頭,其中沒有任何分支信息。我不想爲每個叉子假分支。

我該如何說服Mercurial讓我在不使用顯式分支的情況下執行此操作?

回答

1

修訂版本3是修訂版本1的直接祖先。此處沒有併發的合併更改。你所需要做的就是hg update 3

當您有兩個分支分支並且想要在新的通用版本中收集雙方的更改時,適用合併。在這種情況下,你需要在兩種不同版本之間進行三種合併(使用來自他們更大的共同祖先的信息)

在你的情況下,有兩種不同的版本,沒有共同的祖先,只是你的文件的舊版本和新版本。你只是想用hg updateupdate是官方命令走動,checkout是一個別名它)

我不知道爲什麼會這樣其他DVCS混淆通過調用「合併」的東西,不涉及任何合併。

(注:考慮使用hg log -G你圖的圖形輸出)

(其他注:從來沒有使用合併--force這是一個老過時的標誌做愚蠢的事情它是由hg help merge有很好的理由隱藏)

+0

恐怕我不同意---我認爲它*是*合併,我可以證明它:看到更新。通過將每個分支放入明確的分支,Mercurial非常樂意進行合併,即使DAG的形狀與之前的形狀完全相同。不幸的是,由於上面解釋的原因,我不能使用顯式分支... ... –

+0

如果添加分支信息有多個行爲改變(包括上面引用的更新行爲)。在這種情況下,合併會創建一個新的提交,其中包含新的分支信息。在你最初描述的情況下,一個新的提交沒有意義(沒有文件更改,沒有元數據更改等) 你究竟想在這裏做什麼? – Marmoute