web-dev-qa-db-ja.com

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

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

91
exe163

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

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

または

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

仕組み:grepは、現在のディレクトリ(.)のすべてのファイルとサブディレクトリ(-rフラグ)を再帰的に検索して、競合マーカー(文字列 '<<<<<<<')を探します

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

一致したファイル名は、 piped から xargs になります。これは、パイプ入力ストリームをgit checkout --oursまたは--theirsの個々の引数に分割するユーティリティです

もっと このリンクで

コマンドラインで毎回これを入力しなければならないのは非常に不便であるため、頻繁に使用することに気付いた場合、シェルの alias を作成するのは悪い考えではないかもしれません選択肢: Bash は通常のものです。

このメソッドは少なくともGitバージョンで動作するはずです 2.4.x

79
Dmitri

-Xoursまたは-Xtheirsgit mergeと一緒に使用することもできます。そう:

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

免責事項:もちろん、-Xoursまたは-Xtheirsのいずれか1つのオプションのみを選択できます。もちろん、ファイルごとに異なる戦略を使用してください。

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

43

すべての競合のルートにいる限り、git checkout --[ours/theirs] .は必要な処理を行います。 ours/theirsはマージされていないファイルにのみ影響するため、grep/find/etcの競合を明確に行う必要はありません。

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

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

17
Peter

他の誰かが1つのブランチ(マスターなど)のすべてを別のブランチのコンテンツで単純に上書きしようとしている場合、より簡単な方法があります。

git merge master --strategy=ours

https://stackoverflow.com/a/1295232/560114 に感謝

または、他の方法については、 「git merge -s ours」の「theirs」バージョンはありますか? を参照してください。

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

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

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

0
iWheelBuy