プルされた変更を優先して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
-s recursive
はデフォルトのマージ戦略であるため、ここでは冗長であることに注意してください。したがってgit pull -X theirs
、これをに簡略化できますgit pull --strategy-option theirs
。これは基本的にと同等です。
MERGING
状態に戻ります。その後git merge --abort
、再試行できますが、毎回マージが発生することになります。…リベースが自分のアップストリームにプッシュされたことは知っているので、おそらくそれが原因ですか?
git checkout --theirs path/to/file
。リベース中にそれを使用し、予期しない結果を得ました。ドキュメントで説明が見つかりました:git rebaseとgit pull --rebaseの実行中、私たちと彼らの入れ替えが表示される場合があります。--oursは変更がリベースされるブランチからのバージョンを提供し、--theirsはリベースされる作業を保持するブランチからバージョンを提供します。
git checkout --theirs/--ours path
マニュアルページには、マージされていないパスでも機能することが記載されていることに注意してください。したがって、パスに競合がなかった場合、すでにマージされているため、このコマンドは何もしません。これは、たとえば、サブフォルダ全体の「それら」のバージョンが必要な場合に問題になることがあります。したがって、そのような場合はgit checkout MERGE_HEAD path
、コミットハッシュを実行または使用する方が安全です。
git pull -X theirs
競合がある場合(別のコミッターがgit push -f
リモートに実行した場合など)はマージコミットを作成します。マージコミットが不要な場合は、代わりに実行してくださいgit fetch && git reset --hard origin/master
。
再帰的な "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ページが言うように、「私たち」のマージ戦略オプションは、「私たち」マージとは非常に異なっている戦略。
git checkout --theirs
、1つの競合するファイルを操作する場合
git checkout <ref to theirs> -- the/conflicted.file
; そしてgit add
彼らの変化。
すでに競合状態にあり、それらすべてを受け入れるだけの場合:
git checkout --theirs .
git add .
反対のことをしたい場合:
git checkout --ours .
git add .
これはかなり抜本的ですので、実行する前に、このようにすべてを完全に消去したいことを確認してください。
.
チェックアウトするドットの代わりにファイルを指定します。「抜本的」ではなく、おそらくあなたがやりたいことを正確に。
git add -u
代わりに使用して、バージョン管理されていないファイルをスキップします。
わかりました、私がちょうどいたシナリオを想像してください:
あなたは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 status
間でcheckout
とを実行してadd
も、ファイルは「両方が変更された」と表示されます。
git reset --hard
その後、 git pull [remote server name] [branch name] -Xtheirs
(マージを元に戻す私のものの上に新しいものを引く) -ではないことを確認、この何をしたい場合。
git pull -X theirs
答えは醜いマージコミットを作成、または発行することができます
エラー:次のファイルに対するローカルの変更は、マージによって上書きされます:
たとえば常に常に起点のミラーであるはずのクライアント上で、リポジトリからのファイルに対するローカルの変更を単に無視したい場合は、これを実行します(master
必要なブランチに置き換えます)。
git fetch && git reset --hard origin/master
どのように機能しますか?git fetch
ありませんgit pull
が、マージしません。次にgit reset --hard
、作業ツリーを最後のコミットに一致させます。リポジトリ内のファイルに対するローカルの変更はすべて破棄されますが、新しいローカルファイルはそのまま残ります。
git fetch && git reset --hard {remote}/{branch}
私の問題を解決したものでした。自分の変更を完全に破棄して、ブランチの「自分たちの」状態を優先する必要がありましたgit pull -X theirs
が、一部の移動/名前変更されたファイルで窒息しました。ありがとう!
特定のブランチのバージョンとのすべての競合を解決するには:
git diff --name-only --diff-filter=U | xargs git checkout ${branchName}
したがって、すでにマージ状態にあり、競合するファイルのマスターバージョンを保持したい場合は、次のようにします。
git diff --name-only --diff-filter=U | xargs git checkout master
git cherry-pick --continue
またはgit commit --allow-empty
これらの変更をコミットするためのコマンドを、この痛みを自動化することになり、コマンドが必要とされるの背後にはシステム、なさそうです。私は現在、.git/COMMIT_EDITMSG
ファイルの存在をテストすることでこれを解決していますが、それはハックルで壊れやすいようで、常に機能することはまだわかりません。
git add
)場合、これを介して残りを一括解決できます。git checkout --ours
/ git checkout --theirs
も便利です。
時々これが機能しないことに注意してください:
git checkout --ours path / to / file
または
git checkout-それらのパス/ to / file
HEADが私たちのものであり、MERGE_HEADが彼らのものであると仮定して、代わりにこれを行いました
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
同様に、Accept All Both、Accept All Currentなど、他のオプションについても実行できます。
私は、でnext-version
変更されたdevelop
ファイル、両方のブランチの別の場所に追加されたファイルなどを大量に削除する長期実行ブランチを持っていました。
next-version
ブランチの内容全体develop
を1つのなんとなくマージコミットに取り込みたいと思っていました。
私のために働いた上記のコマンドの組み合わせは:
git merge -X theirs next-version
# lots of files left that were modified on develop but deleted on next-version
git checkout next-version .
# files removed, now add the deletions to the commit
git add .
# still have files that were added on develop; in my case they are all in web/
git rm -r web
新しい答えではなく、多くの答えからのビットを組み合わせるだけで、部分的にはこれらすべての答えが必要になる可能性があることを安心させるためです。
https://git-scm.com/book/en/v2/Git-Tools-Advanced-Mergingから
これは基本的に偽のマージを行います。両方のブランチを親として持つ新しいマージコミットを記録しますが、マージするブランチは調べません。マージの結果として、現在のブランチの正確なコードを記録するだけです。
$ git merge -s ours mundo
「ours」戦略によって作成されたマージ。
$ git diff HEAD HEAD~
私たちがいたブランチとマージの結果の間に違いがないことがわかります。
これは、基本的にGitをだまして、後でマージを行うときにブランチがすでにマージされていると考えるのに役立ちます。たとえば、リリースブランチから分岐して、ある時点でマスターブランチにマージする必要がある作業を行ったとします。それまでの間、マスターのバグ修正をリリースブランチにバックポートする必要があります。バグ修正ブランチをリリースブランチにマージし、同じブランチをマスターブランチにマージすることもできます(フィックスがすでに存在している場合でも)。後でリリースブランチを再度マージするときに、バグ修正による競合は発生しません。
新しいトピックブランチの変更をマスターに反映させたい場合に役立つ状況です。-Xtheirsはいくつかの状況で競合なしにマージしないことに気づきました...例
$ git merge -Xtheirs topicFoo
CONFLICT (modify/delete): js/search.js deleted in HEAD and modified in topicFoo. Version topicFoo of js/search.js left in tree.
この場合、私が見つけた解決策は
$ git checkout topicFoo
topicFooから、最初に-s ours戦略を使用してマスターにマージします。これにより、topicFooの状態である偽のコミットが作成されます。$ git merge -s私たちのマスター
作成されたマージコミットを確認する
$ git log
今マスターブランチをチェックアウト
$ git checkout master
トピックブランチをマージして戻しますが、今回は-Xtheirs再帰戦略を使用します。これにより、topicFooの状態のマスターブランチが表示されます。
$ git merge -X theirs topicFoo