Mercurial/TortoiseHgで、次の例を考えると、D、E、Fを使用せずにリビジョン「G」をレポAにマージする最も簡単な方法は何ですか(GはD、E、Fに依存しないと仮定)。
Repo A: A - B - C
Repo B (Clone of A) A - B - C - D - E - F - G
パッチが最善策ですか?
トンファは正しい。あなたが説明しているのは、「マージ」(または「プッシュ」または「プル」)ではありません。それは「チェリーピッキング」です。プッシュまたはプルは、すべての変更セットをあるリポジトリからまだそのリポジトリにない別のリポジトリに移動します。 「マージ」は2つの「ヘッド」を取り、それらを両方の組み合わせである新しいチェンジセットにマージします。
Gを実際に移動する必要があるが、D、E、Fを保持できない場合は、リポジトリAからGを「hg export」し、次にリポジトリAで「hg import」する必要があります。 Transplant extension は、同じ変更セットが複数回移動するのを避けるのに役立ついくつかの機能を備えたエクスポート/インポートのラッパーです。
ただし、、一般的にインポート/エクスポート、移植、チェリーピッキングを使用することの欠点は、祖先なしではGを実際に移動できないことです。 Mercurialでは、チェンジセットのnameは、その親のハッシュIDを含む 'hashid'であるためです。異なる親(Gの新しい親はCであり、Fではない)は異なるハッシュIDを意味するため、それはもうGではなく、Gの作業ですが、名前による新しいチェンジセットです。
Gを新しいものとして移動して、G '(ジープライム)と呼びましょう。一部の用途では大したことではありませんが、他の用途では大きなピタです。すぐにリポジトリBが新しいチェンジセットHを取得し、それを親の上に移動すると、ハッシュが異なるGからG 'に変更されます。これは、HがH 'として移動することを意味します-100個のチェンジセットが行の下にあり、レポAにD、E、Fを置くことができなかったため、すべてに対して異なるハッシュIDがあります。
物をレポAからレポBに移動する場合(以前の移動とは逆の方向)に、物事をさらに激しくすることができます。 AからBへの単純な 'hg Push'を行おうとすると、G(およびH 'および後続の子孫)を取得します。これは、レポBに既にあるチェンジセットの複製になります。
それでは、あなたの選択肢は何ですか?
hg update C
。 GがチェンジセットD、E、およびFに依存していない、または必要としない場合、それは彼らの子供ではありません。代わりに最初にCに更新すると、次のようなグラフが表示されます。
A - B - C - D - E - F
\
G
その場合、この質問に対する全体の答えはhg Push -r G ../repoA
とGは同じハッシュIDを維持したままきれいに移動し、D、E、およびFはそれと一緒に行きません。
UPDATE:
コメントで指摘したように。最新のMercurialでは、hg graft
コマンドはこれを行うのに最適な方法です。
一般的にチェリーピッキングを扱っているタイトルを参照して、インターネット検索エンジンが一般的にチェリーピッキングのために人々をここに連れてくるかもしれないので、1つのレポで作業する例を示します。 1つのリポジトリで作業する場合、 hg graft
を使用して実行します。
hg update C
hg graft G
結果は次のとおりです。
G'
/
A - B - C - D - E - F - G
追加の警告:2つの変更セットは同じファイルに対する独立した並行コミットとして扱われ、マージの競合が発生する可能性があるため、ブランチ管理では一般にチェリーピッキングを避ける必要があります。たとえば、G
が1.0.1
としてブックマークされた安定バージョンのブランチに適用されるバグ修正である場合は、mergefreeze
ブランチを使用し、master
ブランチをfreeze
ブランチのバグ修正と時々マージします。