プルされた変更を優先して git マージの競合を解決するにはどうすればよいですか?
基本的に、競合のないすべての変更を保持しながら、すべての競合を実行することなく、作業ツリーから競合するすべての変更を削除する必要がありgit mergetool
ます。後でではなく、引っ張っている間にこれを行うことをお勧めします。
プルされた変更を優先して git マージの競合を解決するにはどうすればよいですか?
基本的に、競合のないすべての変更を保持しながら、すべての競合を実行することなく、作業ツリーから競合するすべての変更を削除する必要がありgit mergetool
ます。後でではなく、引っ張っている間にこれを行うことをお勧めします。
git pull -s recursive -X theirs <remoterepo or other repo>
または、単純に、デフォルトのリポジトリの場合:
git pull -X theirs
git checkout --theirs path/to/file
再帰的な「theirs」戦略オプションを使用できます。
git merge --strategy-option theirs
男より:
ours
This option forces conflicting hunks to be auto-resolved cleanly by
favoring our version. Changes from the other tree that do not
conflict with our side are reflected to the merge result.
This should not be confused with the ours merge strategy, which does
not even look at what the other tree contains at all. It discards
everything the other tree did, declaring our history contains all that
happened in it.
theirs
This is opposite of ours.
注: man ページにあるように、"ours" マージstrategy-optionは "ours" マージstrategyとは大きく異なります。
If you're already in conflicted state, and you want to just accept all of theirs:
git checkout --theirs .
git add .
If you want to do the opposite:
git checkout --ours .
git add .
This is pretty drastic, so make sure you really want to wipe everything out like this before doing it.
さて、私が今いたシナリオを想像してください:
merge
、または多分 aを試みて、でcherry-pick
止められました
$ git cherry-pick 1023e24
error: could not apply 1023e24... [Commit Message]
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'
ここで、競合するファイルを表示し、変更を保存したくありません。上記の私の場合、IDE が自動追加した改行だけでファイルが競合していました。自分の変更を元に戻し、相手の変更を受け入れる最も簡単な方法は次のとおりです。
git checkout --theirs path/to/the/conflicted_file.php
git add path/to/the/conflicted_file.php
これの逆(着信バージョンをあなたのバージョンで上書きする)は
git checkout --ours path/to/the/conflicted_file.php
git add path/to/the/conflicted_file.php
驚いたことに、私はこの答えをネット上で簡単に見つけることができませんでした。
特定のブランチのバージョンとのすべての競合を解決するには:
git diff --name-only --diff-filter=U | xargs git checkout ${branchName}
したがって、すでにマージ状態にあり、競合するファイルのマスター バージョンを保持したい場合は、次のようにします。
git diff --name-only --diff-filter=U | xargs git checkout master
git checkout --ours/theirs
競合を排他的に解決するわけではありません。いずれかからチェックアウト (ファイル全体を取得) しますours/theirs
。
foo
2 つのコミット/ブランチ/ツリーなどに変更が加えられたファイルがあるとします。変更だけでなく、それらによって導入された競合があり、使用して競合を解決したいours
場合、使用すると、競合をcheckout --ours foo
導入する変更だけでなく、変更も破棄されます。
sed -i -e '/^<<<<<<</,/^=======/d' -e '/^>>>>>>>/d' foo
-i
その場でファイルを変更し、/^<<<<<<</,/^=======/d
<<<<<<<
and =======
(ours)を含むすべてを削除/^>>>>>>>/d
残りの競合マーカーを削除します-e
複数のパターンを SED に指定するfoo
ファイルsed -i -e '/^<<<<<<</d' -e '/^=======/,/^>>>>>>>/d' foo
を呼び出すことができるスクリプトgit resolve -o/-t/-b
を作成しました。
カスタム マージ ツールを作成できます。上記のスクリプトに基づいて構築すると、次のsed
ようなものを に配置できますgit-config
。
[mergetool "ours"]
cmd = "sed -i -e '/^<<<<<<</d' -e '/^=======/,/^>>>>>>>/d' -- $MERGED"
そしてそれを呼び出しますgit mergetool --tool=ours