31

foo/bar.txtこれを実行すると、マージの競合が発生するとします。

$ git checkout A
$ git merge B

ブランチAから取得して、競合を自動的に解決したいと思いますfoo/bar.txt(私は自分が何をしているのかを知っているので、これが必要です。ブランチBのバージョンが間違っているので、作業中の変更が失われることはありません。この場合はツリーです。)次のコマンドを実行することで実行できるようです。

$ git reset    foo/bar.txt
$ git checkout foo/bar.txt

より単純な単一コマンドソリューションはありますか?

残念ながら、これらのコマンドfoo/bar.txtは競合がなくても変更されるので、私はそれを望んでいません。foo/bar.txt衝突がなければ、どんな状態でも残したいですgit merge B

したがって、に競合があるかどうかを検出するUnixシェルコマンドが必要です。競合がある場合は、現在のブランチからのfoo/bar.txtバージョンを取得することで競合を解決します。foo/bar.txtそれ以外のことは何もしません。つまり、他のファイルを変更したり、変更をコミットしたりfoo/bar.txt、そのファイルに競合がない場合は変更されたりしません。

4

2 に答える 2

24

マージ戦略オプションoursrecursive(デフォルトの)マージ戦略に指定できます。通常のマージを実行しますが、ハンクが競合する場合は、現在のブランチのバージョンを選択します。

git checkout A
git merge -Xours B
于 2013-01-06T12:51:28.153 に答える
19

1回限りで実行する場合、1行のコマンドは次のとおりです。

$ git checkout --ours foo/bar.txt  # <-- resets it only if the merge found conflicts in this file
$ git checkout HEAD -- foo/bar.txt # <-- resets it to that specific version no matter what

ローカルで変更されたファイルへのすべてのアップストリーム変更を永続的に無視するようにgitのマージを構成するには:

$ git config merge.pin.driver true
$ echo foo/bar.txt merge=pin >> .git/info/attributes

true上記は単にunixtrueコマンドであり、その成功は、ローカルバージョンが正しく見えるようにしたことを示しています。この場合は何もしません。もちろん、マージコマンドを使用してより洗練されたものにすることができます。)

私はあなたが望んでいないと思います、merge --strategy=oursまたは--strategy-option=ours、それらは全体のマージに適用されます。

于 2013-01-06T19:38:59.580 に答える