2012-03-07 72 views
97

最近有幾個關於在Mercurial中維護髮布分支時跳過變化的問題。例如:在Mercurial中使用移植的後果

因爲它是在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:這是合併只用DJ'M1正常的3路合併?
  • 問題3:mercurial存儲/使用了有關移植操作的額外信息以幫助它進行合併嗎?

最後...

  • Q4:什麼是與這樣的流動潛在的問題?

回答

118

當您更新到D和graft F::J時,Mercurial會運行一些合併。它將與本次合併開始:

M = three_way_merge(local=D, other=F, base=E) 

如果我們寫+d的狀態CD之間的增量,那麼我們先從:

 +d  +e  +f 
---- C ---- D ---- E ---- F ---- 

打開圖順時針旋轉90度以上三個往來港澳的合併看起來是這樣的:

-e 
    .---- D 
/
E 
\ 
    '---- F 
    +f 

也就是說,我們假裝我們開始E和應用日e與-e相反以得到D。我認爲是+e的反向修補程序。從E開始,我們也去了F與普通的delta +f。這裏沒有什麼奇怪的 - 我們已經在存儲庫中擁有所有狀態(D,EF)。所以看到這樣,很明顯我們可以合併DF

合併是一個「完成鑽石」的問題。因此,我們找到新的狀態M那就是DF並在從DM的區別類似於+fFM不同的是類似於-e組合。它看起來像這樣:

-e  +f' 
    .---- D ----. 
/   \ 
E    M 
\   /
    '---- F ----' 
    +f  -e' 

+f三角洲成爲+f'-e三角洲成爲-e'。這只是一個普通的三路合併,但效果很有趣:我們已應用FD而不是E

合併後,MF第二父被丟棄:

-e  +f' 
    .---- D ----. 
/   \ 
E    M 
\ 
    '---- F 
    +f 

要重申:我們已經複製的F「效果」到D,那就是,我們已經找到了三角洲(+f' )適用於D的效果與+f應用於E時的效果相同。我們可以拉直曲線一點得到:

 +f' 
--- D ---- M 
    \ 
     '---- E ---- F 
     +e  +f 

結果是F使用全三通機械嫁接到D

  • Q1:這裏剛剛發生了什麼?所以.......這是如何工作的?爲什麼它更好?

    A1:使用合併比補丁更好,因爲合併機器將重命名考慮在內。

  • Q2:這是合併使用D,J'和M1的正常3路合併嗎?

    A2:是的,嫁接不會改變圖的拓撲結構。

  • Q3: mercurial存儲/使用有關移植操作的額外信息以幫助它合併?

    A3:

  • Q4:什麼是與這樣的流動潛在的問題?

    A4:從合併的角度來看,它應該可以正常工作。它會複製一些可能讓人困惑的歷史。

+4

偉大的問題,很好的回答:)。 +1兩者! – 2012-03-08 10:02:41

+0

謝謝馬丁。無論是誰提出這個想法都是非常時髦的想法。我有這個想法,但需要解決一般情況。無論你嫁接到/從哪個節點之間的路徑,我猜它都有。 – 2012-03-08 13:20:40

+3

@PaulS:我認爲你需要知道的一點是,嫁接可以以比移植更強大的方式複製變更集。在重命名被處理並且您可以解決合併工具中的衝突的意義上強大。細節處於奇怪的合併過程,但希望對於日常使用移植過程的理解來說不是必需的! :-) – 2012-03-08 13:27:28

6

問題1:有衝突時有幫助。您可以使用通常的合併工具(對我來說,它是內聯衝突標記,我使用Emacs的合併模式進行編輯)。第二季度:這是一個正常的合併。

Q3:第

Q4:我認爲這是醜陋的有兩個幾乎相同的分支。