最近有幾個關於在Mercurial中維護髮布分支時跳過變化的問題。例如:在Mercurial中使用移植的後果
- Mercurial: Branch specific changes keep coming back after dummy merge
- Why are Mercurial backouts in one branch affecting other branches?
因爲它是在2.0中引入的,我想知道使用graft
來避免這個問題。給定一個版本樹是這樣的:
A---B---C---D---E---F---G---H---I---J
假設我們需要創建一個版本分支跳過惡變E
。
hg update -r D
hg graft "F::J"
給我們:
A---B---C---D---E---F---G---H---I---J
\
--F'--G'--H'--I'--J'
- Q1:這裏只是發生了什麼?我可以理解
transplant
將生成F::J
中的補丁,然後將它們應用到D
上,但graft
據說使用3路合併而不是補丁。所以.......這是如何工作的?爲什麼它更好?
可以說,我現在修復E
,併合併到這一點我發佈分支。
--E2-----------------
/ \
A---B---C---D---E---F---G---H---I---J---M1
\ \
--F'--G'--H'--I'--J'---------M2--
M1是直接合並;沒有什麼特別的。 M2正在合併具有「相同」(或至少等效)更改的分支。
- Q2:這是合併只用
D
,J'
和M1
正常的3路合併? - 問題3:mercurial存儲/使用了有關移植操作的額外信息以幫助它進行合併嗎?
最後...
- Q4:什麼是與這樣的流動潛在的問題?
偉大的問題,很好的回答:)。 +1兩者! – 2012-03-08 10:02:41
謝謝馬丁。無論是誰提出這個想法都是非常時髦的想法。我有這個想法,但需要解決一般情況。無論你嫁接到/從哪個節點之間的路徑,我猜它都有。 – 2012-03-08 13:20:40
@PaulS:我認爲你需要知道的一點是,嫁接可以以比移植更強大的方式複製變更集。在重命名被處理並且您可以解決合併工具中的衝突的意義上強大。細節處於奇怪的合併過程,但希望對於日常使用移植過程的理解來說不是必需的! :-) – 2012-03-08 13:27:28