このテーマには数千のバリエーションがあり、多くの質問がありましたが、私にとっては適切な解決策を見つけることができません。git:checkoutとmerge vs ??私たちに有利な葛藤を解決するため
私は2つの開発ラインを持っています.1つは "私"によって行われた "マスター"と "their_new_stuff"というブランチに1つあります。両方とも、かなりの数のファイルを変更し、同じ場所にある多くのファイルに触れ、矛盾を作り出しています。
私は自分の仕事を私たちの仕事に統合し、次のようなやり方で対立を処理する必要があります。これらの競合の99%に対して、私は単に私たちを受け入れることができます。しかし、私はまた、競合しないすべての変更を必要とし、いくつかの重要な争いの中で、私はそれらを受け入れるか手で合併する必要があります。手動でのマージが必要なファイル、またはマージでの "マージ"を必要としていることを知るには、手動による検査が必要です。
私は次のことを試してみました:
は1をお試しください:
まずgit merge their_new_stuff
# for each file with conflicts:
# if requires manual merge:
# do manual merge
# else:
git checkout --ours all/files/not/merged/by/hand.cc
私はこれは私が欲しかったものだと思ったが、これは「私たちは」フルファイルであるとチェックアウトのために動作しません。チェックアウトし、矛盾している部分をチェックアウト/解決するだけではありません。だから、私は自分たちが望んでいるものと相反しない変化を失う。
は2を試してみてください。それは、単一のファイルをマージすることはできませんので
git merge -s recursive -Xours their_new_stuff
これは動作しません。私は矛盾がどこにあるか知る必要があり、マニュアルマージをするのに役立つ紛争マーカー付きのファイルバージョンを見たいので、理想的には失敗したマージの後に何かをやるでしょう。
3を試してみてください。そして、私は私のような何かを行うことができるかもしれないと思った:
git merge their_new_stuff
# for each file with conflict:
# if file needs manual merge:
cp file file2
git merge --abort
git merge -s recursive -Xours their_new_stuff
# for each file with manual merge:
cp file2 file
# merge by hand
私は、これは動作するはずだと思うが、それは非常にklugy感じています。これを行う「正しい」方法はありますか?理想的には、私は次のようなことをしたいと思っています:
git merge their_new_stuff
# for each file with conflict
# if needs manual merge
# do manual merge
# else
# is there any command that does something like?:
git remerge -s recursive -Xours file
効果的に私はマージを行い、衝突マーカーを取得したいと思います。手動マージを調べ、手動マージが必要ない場合は、 "-Xours"を使ってマージをやり直してください。これは可能ですか?
Gitはあなたがファイルごとに使用することができ、 'gitのマージ-file'を、持っていません。 *使用するためには、ベース(ステージ1)、ローカル( '--ours')、および他の(' --theirs')ファイルを(通常はインデックスの3つのステージから)抽出しなければならないことに注意してください通常のファイルシステムファイル。 'merge-file' *は' -X'スタイルの意味を持つ '--ours'と' --theirs'を取ります。 – torek
@torekありがとう、それについては知らなかった。これは興味深いことです。私は '' merge''を使って衝突を見てから中止してから、 "keep ours"ファイルと '' merge-file''に '' merge-file --ours''を使うことができると思います"--ours"を使わずに、 "手動マージ"ファイルに衝突マーカーを付けることができます。すぐにうまくいかないものがあれば、それを答えてみてください。 –
ファイルの3つのインデックスバージョンを一時ファイルに解凍し、ファイルが未解決のままである間だけインデックスに残ります*。マージを中止する必要はありません。 ( 'git ls-files --stage'、' git ls-files --unmerged'も参照してください。) – torek