Mercurialで移植片を使用した結果


98

最近、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:このマージは、通常の3ウェイマージ使用しているDJ'M1
  • Q3:mercurialは、マージ操作に役立つ移植操作に関する追加情報を保存/使用していますか?

そして最後に...

  • Q4:このようなフローの潜在的な問題は何ですか?

回答:


119

に更新しD、graft するとF::J、Mercurialはいくつかのマージを実行します。それはこのマージから始まります:

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

+d状態Cとの間のデルタを記述する場合D、次のことから始めます。

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

グラフを時計回りに90度回転すると、上記の3者間マージは次のようになります。

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

つまり、から始めてE、その逆を適用して-eに到達するふりをしDます。の逆パッチと思います+e。当初は、通常のデルタE状態にも移行Fしました+f。ここで奇妙なものは何もありません-私たちはすべての状態を(持っているDEと、Fすでにリポジトリ内)。したがって、このように見て、それは我々がマージできることは明らかだDF

マージは「ダイヤモンドを完成させる」ことです。私たちは、新しい状態を見つけるようMのミックスですDF、どこから違いDにはMに似ている+fとの違いFとはMに似ているが-e。次のようになります。

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

+fデルタはなった+f'-eデルタとなりました-e'。これは通常の3者間マージですが、効果は興味深いものです。代わりに!を適用Fしました。DE

マージ後、Mto の2番目の親Fが削除されます。

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

繰り返しに:私たちは、の「効果」をコピーしているFの上にDあることを、我々はデルタ(発見した+f'ために適用される)Dときと同じ効果を与える+fに適用されたがE。グラフを少しまっすぐにして、次のようにします。

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

結果は、完全な3方向機械FD使用して移植されます。

  • Q1:ここで何が起こったのですか?それで……それはどのように機能しますか?なぜそれが良いのですか?

    A1:マージ機構は名前の変更などを考慮に入れるため、マージを使用する方がパッチよりも優れています。

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

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

  • Q3: mercurialは、マージ操作に役立つ移植操作に関する追加情報を保存/使用していますか?

    A3:いいえ。

  • Q4:このようなフローの潜在的な問題は何ですか?

    A4:マージの観点からは、問題なく動作するはずです。それは人々を混乱させるかもしれないいくつかの歴史を複製します。


4
すばらしい質問、すばらしい答え:)。両方に+1!
Laurens Holst 2012年

マーティン、ありがとう。それはそれを思いついた人によるかなりファンキーな考え方です。私はアイデアを持っていますが、一般的なケースを解決する必要があります。接ぎ木しているノード間のパスに関係なく保持されていると思いますか?
Paul S

3
@PaulS:知っておく必要があるのは、graftが移植よりも強力な方法でチェンジセットをコピーできることです。名前の変更が処理され、マージツールで競合を解決できるという意味で堅牢です。詳細は奇妙なマージにありますが、graftを日常的に使用するために理解することは必須ではありません。:-)
マーティンガイスラー、2012年

3
いいえ、でも私は必要のないものを理解しようとするのがうんざりです;-)とにかく、あなたの例をベースとして使用して、より一般的な例に取り組みました。
Paul S

@PaulSもしそうなら、私はあなたにこれを言及することをほとんど恐れています...しかし、あなたはDarcsとそのパッチ理論を調べることができます。グラフを90度回転する上記のトリックは、マージ時に通勤パッチについて彼らがどのように話すかを私に多く思い出させます。かなり毛むくじゃらのもの:-)
マーティン・ガイスラー

6

Q1:競合がある場合に役立ちます。次に、通常のマージツールを使用できます(私にとっては、インライン競合マーカーです。これは、Emacsのsmerge-modeで編集します)。

Q2:通常のマージです。

Q3:いいえ。

Q4:ほぼ同じ2つのブランチがあるのは醜いと思います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.