1. ホーム
  2. version-control

[解決済み] Mercurialでgraftを使用した場合の影響

2023-01-11 22:15:39

質問

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

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

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

Evilの変更をスキップしたリリースブランチを作成する必要があるとします。 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 ?
  • Q3: mercurial は移植作業に関する余分な情報を保存/使用して、マージに役立てましたか?

そして最後に...

  • Q4:このようなフローの場合、どのような問題が考えられるでしょうか?

どのように解決するのですか?

を更新すると D を更新し、グラフト 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 になるように D . の逆パッチとして考えています。 +e . で始まる E の状態にもなりました。 F で、通常のデルタ +f . ここでは何も不思議なことはありません。 D , E そして F ) がすでにリポジトリにあります。ですから、このように見てくると、明らかに DF .

マージは、"ダイヤモンドを完成させることです"。そこで、新しい状態を見つける M の混合である DF との差はどこにあるのでしょうか? D から M+f との違いは F から M-e . こんな感じです。

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

+f デルタは +f' となり -e となり、デルタは -e' . これは通常の 3 者間マージですが、その効果は興味深いものです。 F の上に D の代わりに E !

マージ後、2番目の親である M から F は削除されます。

    -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: マージの観点からは、それは問題なく動作するはずです。それは、人々を混乱させるかもしれないいくつかの履歴を重複させるでしょう。