98

Mercurial でリリース ブランチを維持する際に変更をスキップすることについて、最近いくつか質問がありました。例えば:

2.0 で導入されたので、graftこの問題を回避するために使用することを考えていました。次のようなリビジョン ツリーがあるとします。

A---B---C---D---E---F---G---H---I---J

Evil change をスキップするリリース ブランチを作成する必要があるとします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適用したことは理解できますが、パッチではなく 3 方向マージを使用すると言われています。それで.......それはどのように機能しますか?なぜそれが良いのですか?Dgraft

を修正Eして、それを私のリリース ブランチにマージするとしましょう。

                  --E2-----------------
                 /                     \
A---B---C---D---E---F---G---H---I---J---M1
             \                            \
              --F'--G'--H'--I'--J'---------M2--

M1 はストレート マージです。特別なことは何もありません。M2は、「同じ」(または少なくとも同等の)変更がオンになっているブランチをマージしています。

  • DQ2: このマージは、J'とを使用した通常の 3 方向マージM1ですか?
  • Q3: Mercurial は、マージを支援するために移植操作に関する追加情報を保存/使用しましたか?

そして最後に...

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

2 に答える 2

119

Dおよび接ぎ木に更新するとF::J、Mercurial は多数のマージを実行します。次のマージで開始します。

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

状態と+dの間のデルタを書くと、次のようになります。CD

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

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

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

つまり、 から始めてEの反対を適用したふりを-eして に到達しDます。の逆パッチだと思います+e。から始めて、通常の delta のE状態にも行きました。ここで奇妙なことは何もありません — リポジトリにはすべての状態 ( 、、および) が既にあります。このように見ると、とをマージできることが明らかです。F+fDEFDF

マージは「ダイヤモンドを完成させる」問題です。したがって、ととMの混合である新しい状態を見つけます。ここで、 からとの違いは に似ており、 からとの違いはに似ています。次のようになります。DFDM+fFM-e

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

+fデルタは に+f'なり、デルタ-eは になりまし-e'た。これは単なる通常の 3 方向マージですが、その効果は興味深いFものDですE

マージ後、to の 2 番目の親MF削除されます。

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

繰り返しになりますが、 の「効果」を にコピーしFました。つまり、 にが適用されたときと同じ効果を与えるために適用されるDデルタ ( +f')が見つかりました。グラフを少しまっすぐにすると、次のようになります。D+fE

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

その結果、完全な三方機械を使用してF移植されます。D

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

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

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

    A2:はい、移植によってグラフのトポロジが変更されることはありません。

  • Q3: Mercurial は、マージを支援するために移植操作に関する追加情報を保存/使用しましたか?

    A3:いいえ。

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

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

于 2012-03-07T16:24:43.000 に答える