どのように私は引っ張られた変更を支持してgit merge衝突を解決するのですか?
基本的に私はすべての衝突のない変更をgit mergetool
と衝突することなくすべての衝突のない変更を作業ツリーから削除する必要があります。できれば、引っ張っている間、後でしないでください。
再帰的な "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 とは大きく異なります。
git pull -s recursive -X theirs <remoterepo or other repo>
あるいは、単純に、デフォルトのリポジトリの場合:
git pull -X theirs
git checkout --theirs path/to/file
すでに矛盾した状態にあり、彼らの all だけを受け入れたいのであれば:
git checkout --theirs .
git add .
反対のことをしたいのなら:
git checkout --ours .
git add .
これはかなり抜本的なことなので、それを実行する前に、本当にこのようにすべてを消去したいことを確認してください。
そうですね、私がちょうどいたシナリオを想像してみてください。
あなたは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
驚いたことに、私はネット上でこの答えを簡単に見つけることができませんでした。
git pull -X theirs
の答えは醜いマージコミットを作成するか、または
エラー:以下のファイルに対するローカルの変更は、マージによって上書きされます。
リポジトリからファイルへのローカルな変更を単に無視したい場合、例えば常にOriginのミラーであるべきクライアント上で、これを実行してください(master
を希望のブランチに置き換えてください)
git fetch && git reset --hard Origin/master
それはどのように機能しますか? git fetch
はgit pull
を行いますが、マージはしません 。そして git reset --hard
はあなたの作業ツリーを最後のコミットと一致させます。リポジトリ内のファイルに対するあなたのローカルな変更はすべて 破棄 されますが、新しいローカルファイルはそのままにされます。
特定のブランチのバージョンとのすべての衝突を解決するには
git diff --name-only --diff-filter=U | xargs git checkout ${branchName}
したがって、すでにマージ状態にあり、競合しているファイルのマスターバージョンを保持したい場合は、次のようにします。
git diff --name-only --diff-filter=U | xargs git checkout master
時にはこれが うまくいかないことを忘れないでください :
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はマージされていないファイルのリストからファイルを削除しません
VSコード(統合Git)IDEユーザー:
衝突ファイル に入ってくるすべての変更を受け入れたい場合は、次の手順を実行してください。
1. Go to command palette - Ctrl + Shift + P
2. Select the option - Merge Conflict: Accept All Incoming
同様に、 両方を受け入れる、現在を受け入れるなどのような他のオプションに対しても実行できます。