2012-03-07 7 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:ちょうどここに何が起こりましたの?私はtransplantF::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ウェイマージですか?
  • Q3:水銀はマージに役立つグラフト操作に関する追加情報を保存/使用しましたか?

そして最後に...

  • Q4:このような流れに潜在的な問題は何ですか?

答えて

118

DとグラフトF::Jに更新すると、Mercurialは多数のマージを実行します。これは、このマージを開始します:

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

我々は状態CD間のデルタのため+dを記述する場合、我々はで始まる:

 +d  +e  +f 
---- C ---- D ---- E ---- F ---- 
時計回りに90度のグラフを回して、上記の3つの

-wayマージは次のようになります。

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

、我々は我々がEで開始し、目を適用することをふりeの反対に-eDに得るために。私は+eの逆パッチと思います。 Eで始まり、通常のデルタ+fで状態Fに行きました。ここには何も変わっていません。リポジトリにはすべての状態(DE、およびF)が既にあります。このように、DFをマージできることは明らかです。

マージングは​​「ダイヤモンドの完成」の問題です。だから我々はDF、どこMからDとの差が+fに似ているとMからFとの差が-eに似ているのミックスで新しい状態Mを見つけます。

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

+fデルタが+f'になったと-eデルタは-e'になった:それはこのようになります。これは単なる通常の3方向マージですが、効果は面白いです:EではなくDFを適用しました!マージ後

は、FからMの第二の親がドロップされます。

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

を繰り返すために:私たちは、つまり、我々はデルタ(+f'を発見した、DFの「効果」をコピーしました)は、Dに適用した場合、+fEに適用した場合と同じ効果を示します。当社は、取得するには、グラフを少し伸ばすことができます。

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

結果はFは完全な3ウェイの機械を使用してD上にグラフトされていることです。

  • Q1:ちょうどここに何が起こりましたか?だから.......どのように機能するのですか?なぜそれは良いですか?

    A1:マージ機械を使用すると、マージ機械では名前変更のようなことが考慮されるため、マージの使用はパッチより優れています。

  • Q2:このマージはD、J '、M1を使用した通常の3ウェイマージですか?

    A2:はい、グラフトはグラフのトポロジを変更しません。

  • Q3:水銀は、マージに役立つグラフト操作に関する追加情報を保存/使用しましたか?

    A3:

  • Q4:このような流れの潜在的な問題は何ですか?

    A4:マージの観点からはうまくいくはずです。それは人々のために混乱するかもしれないいくつかの歴史を複製します。

+4

偉大な質問、素晴らしい答え:)。両方に+1! –

+0

Martinに感謝します。誰かがそれを思いついた、かなりファンキーな考え方です。私は考えを持っていますが、一般的なケースを解決する必要があります。私はあなたが/から移植しているノード間のパスに関係なくそれを保持していると思いますか? –

+3

@PaulS:あなたが知る必要があるのは、移植片が移植缶よりも堅牢な方法でチェンジセットをコピーできることです。名前の変更が処理され、マージツールの競合を解決できるという意味では堅牢です。詳細は奇妙なマージにありますが、それはうまくいけば移植の日常的な使用を理解するために不可欠ではありません! :-) –

6

Q1:それは競合があるときに役立ちます。通常のマージツールを使用することができます(Emacsのスマートモードで編集するインラインコンフリクトマーカーです)。

Q2:それは通常のマージです。

Q3:第

Q4:私はそれが2本のほぼ同じ枝を持っている醜いだと思います。

関連する問題