web-dev-qa-db-ja.com

プル中の変更を優先してGitマージ競合を解決する

どのように私は引っ張られた変更を支持してgit merge衝突を解決するのですか?

基本的に私はすべての衝突のない変更をgit mergetoolと衝突することなくすべての衝突のない変更を作業ツリーから削除する必要があります。できれば、引っ張っている間、後でしないでください。

935
sanmai

再帰的な "theirs"戦略 option を使うことができます。

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" merge strategyオプション は、 "ours" merge strategy とは大きく異なります。

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

あるいは、単純に、デフォルトのリポジトリの場合:

git pull -X theirs

すでに対立状態にあるなら...

git checkout --theirs path/to/file
871
Pascal Fares

すでに矛盾した状態にあり、彼らの all だけを受け入れたいのであれば:

git checkout --theirs .
git add .

反対のことをしたいのなら:

git checkout --ours .
git add .

これはかなり抜本的なことなので、それを実行する前に、本当にこのようにすべてを消去したいことを確認してください。

361
lots-to-learn

そうですね、私がちょうどいたシナリオを想像してみてください。

あなたはmerge、あるいはおそらく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

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

212

git pull -X theirsの答えは醜いマージコミットを作成するか、または

エラー:以下のファイルに対するローカルの変更は、マージによって上書きされます。

リポジトリからファイルへのローカルな変更を単に無視したい場合、例えば常にOriginのミラーであるべきクライアント上で、これを実行してください(masterを希望のブランチに置き換えてください)

git fetch && git reset --hard Origin/master

それはどのように機能しますか? git fetchgit pullを行いますが、マージはしません 。そして git reset --hard はあなたの作業ツリーを最後のコミットと一致させます。リポジトリ内のファイルに対するあなたのローカルな変更はすべて 破棄 されますが、新しいローカルファイルはそのままにされます。

25
Dan Dascalescu

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

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

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

git diff --name-only --diff-filter=U | xargs git checkout master
18
Ariel Alvarez

時にはこれが うまくいかないことを忘れないでください

git checkout - パス/ to/file

または

git checkout - 自分のパス/ to/file

HEADがours で、 MERGE_HEADがtheirs であると仮定して、代わりにこれを行いました。

git checkout HEAD -- path/to/file

または

git checkout MERGE_HEAD -- path/to/file

我々がこれをした後、そして我々は良い:

git add .

もっと理解したい場合は、ここtorekの素晴らしい投稿を見てください: git checkout --oursはマージされていないファイルのリストからファイルを削除しません

13
Nicolas D

VSコード(統合Git)IDEユーザー:

衝突ファイル に入ってくるすべての変更を受け入れたい場合は、次の手順を実行してください。

1. Go to command palette - Ctrl + Shift + P
2. Select the option - Merge Conflict: Accept All Incoming

同様に、 両方を受け入れる、現在を受け入れるなどのような他のオプションに対しても実行できます。

4
SridharKritha