これを実行すると、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
を変更しません。
これを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
、それらはマージ全体に適用されます。
マージ戦略オプションours
をrecursive
(デフォルト)マージ戦略に指定できます。通常のマージを行いますが、ハンクが競合する場合は、現在のブランチのバージョンを選択します。
git checkout A
git merge -Xours B