1687

プルされた変更を優先して git マージの競合を解決するにはどうすればよいですか?

基本的に、競合のないすべての変更を保持しながら、すべての競合を実行することなく、作業ツリーから競合するすべての変更を削除する必要がありgit mergetoolます。後でではなく、引っ張っている間にこれを行うことをお勧めします。

4

12 に答える 12

1832
git pull -s recursive -X theirs <remoterepo or other repo>

または、単純に、デフォルトのリポジトリの場合:

git pull -X theirs

すでに競合状態にある場合は...

git checkout --theirs path/to/file
于 2014-02-14T11:06:57.187 に答える
1196

再帰的な「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とは大きく異なります。

于 2012-05-22T07:24:00.177 に答える
665

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.

于 2015-11-06T15:18:44.943 に答える
239

さて、私が今いたシナリオを想像してください:

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

驚いたことに、私はこの答えをネット上で簡単に見つけることができませんでした。

于 2014-08-01T12:11:25.630 に答える
22

特定のブランチのバージョンとのすべての競合を解決するには:

git diff --name-only --diff-filter=U | xargs git checkout ${branchName}

したがって、すでにマージ状態にあり、競合するファイルのマスター バージョンを保持したい場合は、次のようにします。

git diff --name-only --diff-filter=U | xargs git checkout master
于 2015-07-14T17:43:32.530 に答える
8

git checkout --ours/theirs競合を排他的に解決するわけではありません。いずれかからチェックアウト (ファイル全体を取得) しますours/theirs

foo2 つのコミット/ブランチ/ツリーなどに変更が加えられたファイルがあるとします。変更だけでなく、それらによって導入された競合があり、使用して競合を解決したいours場合、使用すると、競合をcheckout --ours foo導入する変更だけでなく、変更も破棄されます。

SED の使用

それらを使用して解決します。

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

于 2021-07-23T10:58:00.270 に答える