最近、Mercurialでリリースブランチを維持する際に変更をスキップすることに関するいくつかの質問がありました。たとえば、次のようにMercurialでグラフトを使用した場合の結果
- Mercurial: Branch specific changes keep coming back after dummy merge
- Why are Mercurial backouts in one branch affecting other branches?
それは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:このマージが
D
、J'
とM1
使用して普通の3ウェイマージですか? - Q3:水銀はマージに役立つグラフト操作に関する追加情報を保存/使用しましたか?
そして最後に...
- Q4:このような流れに潜在的な問題は何ですか?
偉大な質問、素晴らしい答え:)。両方に+1! –
Martinに感謝します。誰かがそれを思いついた、かなりファンキーな考え方です。私は考えを持っていますが、一般的なケースを解決する必要があります。私はあなたが/から移植しているノード間のパスに関係なくそれを保持していると思いますか? –
@PaulS:あなたが知る必要があるのは、移植片が移植缶よりも堅牢な方法でチェンジセットをコピーできることです。名前の変更が処理され、マージツールの競合を解決できるという意味では堅牢です。詳細は奇妙なマージにありますが、それはうまくいけば移植の日常的な使用を理解するために不可欠ではありません! :-) –