Gitはすべてのファイルに対して--ours /-theirsを使用して競合を解決します


111

チェックアウト--oursとを使用してすべてのファイルの競合を解決する方法はあります--theirsか?私はあなたが個々のファイルに対してそれをすることができることを知っています、しかしすべてのためにそれをする方法を見つけることができませんでした。


7
DOESのgit checkout --ours -- .作品?これ.は、作業ディレクトリのルートから適用した場合の現在のディレクトリを意味するため、基本的には作業ディレクトリ全体を意味します。--oursフラグで動作するかどうかはわかりませんが、削除または名前が変更されたファイルの競合をどのように処理するかはわかりません。

@Cupcakeうまく使いました。多分それは答えになるはずですか?
Pedro Gimeno、2015年

回答:


90

作業ディレクトリをgrepし、xargsコマンドで出力を送信するだけです。

grep -lr '<<<<<<<' . | xargs git checkout --ours

または

grep -lr '<<<<<<<' . | xargs git checkout --theirs

これがどのように機能するか:競合マーカー(文字列 '<<<<<<<')を探してgrep、現在のディレクトリ(.)およびサブディレクトリ(-rフラグ)内のすべてのファイルを再帰的に検索します

-lまたは--files-with-matchesフラグを出力する文字列が見つかったファイル名のみをgrepの原因となります。スキャンは最初の一致後に停止するため、一致した各ファイルは1回だけ出力されます。

マッチしたファイル名が、その後されているパイプxargsのために、個々の引数に、パイプで連結された入力ストリームアップそれは休憩ユーティリティgit checkout --oursまたは--theirs

このリンクの詳細。

これをコマンドラインで毎回入力する必要があるのは非常に不便なので、頻繁に使用している場合は、選択したシェルのエイリアスを作成することは悪くないかもしれません。Bashが通常のものです。

この方法は、少なくともGitバージョン2.4.xで機能するはずです。


14
greppingの代わりに、を使用することも可能だと思いますgit diff --name-only --diff-filter=U
タイの

10
またgit status | grep both | awk '{print $3}' | xargs git checkout --[theirs|ours]。大規模なプロジェクトの場合は、greppingよりも高速です。
joshbodily 2015

1
@joshbodilyいいね。私には違いに気付くほど大きなプロジェクトはありませんが、特にディレクトリ内の総数と比較して変更されたファイルが少ない場合、それがはるかに速くなることがわかります-これ通常のケースですコミット。
Dmitri

1
これは、名前の変更/名前の変更の競合には機能しないことに注意してください。たとえば、CONFLICT (rename/rename): Rename "a.txt"->"c.txt" in branch "HEAD" rename "a.txt"->"b.txt" in "master"
Borek Bernard '29

1
さらに別のオプション:git status --porcelain | egrep '^UU' | cut -d ' ' -f 2 |xargs git checkout --[theirs|ours]
Zitrax 2017年

52

次のことができ-Xoursたり-Xtheirsgit merge同様。そう:

  1. 現在のマージを中止します(たとえばgit reset --hard HEAD
  2. 好みの戦略を使用してマージ(git merge -Xoursまたはgit merge -Xtheirs

免責事項:もちろん、1つだけオプションを選択できます。-Xoursまたは-Xtheirs、ファイルごとに異なる戦略を使用する必要があります。

のための方法があるかどうかはわかりませんが、checkout正直に言ってそれが非常に役立つとは思いません。ファイルごとに異なるソリューションが必要な場合は、checkoutコマンドで戦略を選択すると便利です。


おかげで、マージのための「--ours」と「--theirs」があることを知りませんでした。マージの場合、それらは実際には「-s」戦略の一部ではなく、「-X」再帰オプションの一部のようです。'-s'バージョンは実際にはマージせずにすべてのファイルを置き換えるだけで、それらのファイルは存在しません。
exe163 2014

何もありません--theirs--ours-Optionのgit v1.9.4へ。アプローチはでしょうgit merge -s recursive -Xtheirs BRANCH
fbmd 2015年

--theirsまた--ours、gitでは使用できません2.2.0。私の答えは正確ではなかったか、古いgitバージョンで利用可能でした(この答えはITエポックではかなり古い)。右のアプローチがです-X。私はそれに応じて更新します
ThanksForAllTheFish

バージョン2.4.0以降、
Dmitri

これを試して、「自動マージが失敗し、競合を修正」した。このコマンドは明らかに意図したとおりに機能しないため、回避することをお勧めします。バグが多すぎます。
アダム

37

git checkout --[ours/theirs] .あなたがすべての紛争の根源にいる限り、あなたが望むことをします。私たち/彼らはマージされていないファイルにのみ影響するので、grep / find / etcの競合を明確に行う必要はありません。


5
私にとって、これはサブディレクトリに再帰するようには見えません。
Daniel Baughman、2016年

5
わかりますerror: path 'foo/bar/blah' does not have our version
ロビングリーン

私はgitバージョン2.16.2.windows.1を使用していますが、これは完全に機能します。ありがとう!
パンクウッド2018年

30
git diff --name-only --diff-filter=U | xargs git checkout --theirs

仕事をするようです。これを行うには、gitリポジトリのルートディレクトリにcdする必要があることに注意してください。


3
(1)作業ディレクトリだけでなく、すべてのファイルに適用されるため、これは上位投票の回答よりも良い回答だと思います。(2)競合マーカーのgreppingに関する脆弱性はありません。ここの「git diff」コマンドは、マージされていないすべてのパスをリストします。これは、まさにチェックアウトしたいものです。
bchurchill 2018年

いいね!私は常に競合マーカーgrepの信頼性について心配していました
00-BBB


2
function gitcheckoutall() {
    git diff --name-only --diff-filter=U | sed 's/^/"/;s/$/"/' | xargs git checkout --$1
}

この関数を.zshrcに追加しましたファイルに。

次のように使用します: gitcheckoutall theirsまたはgitcheckoutall ours

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.