チェックアウト--ours
および--theirs
を使用してすべてのファイルの競合を解決する方法はありますか?私はあなたが個々のファイルに対してそれを行うことができることを知っていますが、すべてに対してそれを行う方法を見つけることができませんでした。
作業ディレクトリを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
-Xours
または-Xtheirs
をgit merge
と一緒に使用することもできます。そう:
git reset --hard HEAD
を使用)git merge -Xours
またはgit merge -Xtheirs
)を使用してマージします免責事項:もちろん、-Xours
または-Xtheirs
のいずれか1つのオプションのみを選択できます。もちろん、ファイルごとに異なる戦略を使用してください。
checkout
の方法があるかどうかはわかりませんが、正直なところ、それが非常に役立つとは思いません。異なるファイルに異なるソリューションが必要な場合はcheckoutコマンドで戦略を選択すると便利です。
すべての競合のルートにいる限り、git checkout --[ours/theirs] .
は必要な処理を行います。 ours/theirsはマージされていないファイルにのみ影響するため、grep/find/etcの競合を明確に行う必要はありません。
git diff --name-only --diff-filter=U | xargs git checkout --theirs
仕事をするようです。これを行うには、gitリポジトリのルートディレクトリにcdする必要があることに注意してください。
他の誰かが1つのブランチ(マスターなど)のすべてを別のブランチのコンテンツで単純に上書きしようとしている場合、より簡単な方法があります。
git merge master --strategy=ours
https://stackoverflow.com/a/1295232/560114 に感謝
または、他の方法については、 「git merge -s ours」の「theirs」バージョンはありますか? を参照してください。
function gitcheckoutall() {
git diff --name-only --diff-filter=U | sed 's/^/"/;s/$/"/' | xargs git checkout --$1
}
この関数を。zshrcファイルに追加しました。
次のように使用します:gitcheckoutall theirs
またはgitcheckoutall ours