web-dev-qa-db-ja.com

現在のブランチのバージョンを使用してGitの競合を自動的に解決するにはどうすればよいですか?

これを実行すると、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を維持したい。

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

20
pts

これを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はunix trueコマンドにすぎません。成功すると、ローカルバージョンが正しく表示されます。この場合は何もしないことになります。もちろん、マージを使用してさらに洗練させることができますコマンド。)

私はあなたが欲しくないと思うmerge --strategy=oursまたは--strategy-option=ours、それらはマージ全体に適用されます。

12
jthill

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

git checkout A
git merge -Xours B
12
knittl