1

2 つのブランチAB.

これらは同じコードであることを意図していますが、依存するライブラリの異なるバージョンを対象としています。

したがってA/file1.js、次のようなスニペットが含まれる場合があります。

this.actor.bar();

一方、次のB/file1.js可能性があります。

// `bar` had its name changed to `foo` in version X.Y of library Z
this.actor.foo();

次にA、ライブラリの両方のバージョンと互換性がありZB.

*.bar()Mercurialに「マージを行いますが、「になる行を無視する」と伝える方法はあります*.foo()か?

基本的に、ブランチ間で異なるコード ブロックがいくつかありABそれらが依存するライブラリのバージョンが原因で、コードを記述して、それらの行を除いて、コードの残りの部分が同一になるようにしました。

マージするたびにこれらのコード ブロックを処理する必要がないようにしたいだけです。

私が想像できる唯一のことは、各ファイルにカスタムである各ファイルに対して異なる差分プリセットを何らかの方法で作成することdiff --ignore-matching-lines [impressively_long_argument]です-これは間違った方法のようです!

(git でこれを行うことはできますか? これはバージョン管理システムを切り替える機能ですが、実装方法はわかりません。または、洗練されたdiffツールを見つけることが解決策になるかもしれません)。

4

1 に答える 1

2

Git と Mercurial はどちらも、想像しているよりも簡単にこれを処理します (さらに、svn や CVS よりも簡単です)。これは、git と Mercurial のマージが相違点ではなく変更点であるためです。

A と B の 2 つのブランチがあり、これを行うときにブランチ A に変更barした場合:foo

hg update B
hg merge A

現在 A にあり、まだ B にマージされていないすべての変更セットbarがマージされます。これには変更が含まれfoo、その特定の変更を手動で除外する必要がありますが、その 1 回だけです

次回は:

hg update B
hg merge A

A にマージされていない、現在 A にあるすべての変更セットを再度マージしますが、変更セットが既にマージされているため、A がs を持ち、B がsbarを持っていることはまったく問題ではありません。現在マージされている変更セットで違いが作成されていない場合、その変更は B に適用されず、手動で再度拒否する必要はありません。foofoobars

これは、完全なグラフ履歴を持つ CVS がもたらす重要な利点の 1 つです。2 つのスナップショットをマージするのではなく、ブランチ A の新しい相違点をブランチ B に適用しているので、相違点が新しいものではない場合、それを再拒否する必要はありません。システムは「ああ、私は覚えています、あなたはそれを望んでいませんでした」 .

于 2012-06-04T15:28:49.650 に答える