1. ホーム
  2. git

[解決済み] [Solved] リモートの変更を破棄して、ファイルに "解決済み "のマークを付けるには?

2022-04-12 02:42:30

質問

ローカルにあるファイルをリモートブランチからプルしたところ、コンフリクトが発生しました。 ローカルの変更を維持し、コンフリクトを引き起こしているリモートの変更を無視したいことは承知しています。事実上、"すべての競合を解決済みとしてマークし、ローカルを使用する"と言うために使用できるコマンドはありますか?

解決方法は?

git checkout には --ours オプションで、ローカルにあるファイルのバージョンをチェックアウトすることができます (これとは対照的に --theirs これは、取り込んだバージョンです)。を渡すことができます。 .git checkout を使って、ツリー内のすべてをチェックアウトするように指示します。それから、コンフリクトを解決済みとしてマークする必要があります。 git add そして、作業が完了したらコミットしてください。

git checkout --ours .  # checkout our local version of all files
git add -u             # mark all conflicted files as merged
git commit             # commit the merge

注意 . の中にある git checkout コマンドを使用します。これはとても重要で、見逃しがちです。 git checkout ブランチを切り替えるモードと、インデックスから作業コピーにファイルをチェックアウトするモードです(別のリビジョンから先にインデックスに取り込むこともあります)。ファイル名を渡さなかった場合、ブランチの切り替えを試みますが(ブランチを渡さなかった場合は、現在のブランチを再度チェックアウトしようとします)、変更されたファイルがある場合は切り替えを行いません。ですから、既存のファイルを上書きするような挙動をさせたい場合は . から2番目の挙動を得るためには、ファイル名または git checkout .

また、ファイル名を渡すときは、オフセットを -- というように git checkout --ours -- <filename> . もしこれを行わず、ファイル名がたまたまブランチやタグの名前と一致した場合、Git はファイル名をチェックアウトするのではなく、そのリビジョンをチェックアウトしたいのだと判断し、最初の形式の checkout コマンドを使用します。

コンフリクトと マージ はGitで動作します。他人のコードをマージするとき(これはプルのときにも起こります。プルは、基本的にフェッチの後にマージすることです)、いくつかの可能な状況があります。

最もシンプルなのは、同じリビジョンにいる場合です。この場合、あなたはすでに最新の状態であり、何も起こりません。

もう一つの可能性は、相手のリビジョンが単にあなたのリビジョンの子孫であることで、その場合、デフォルトで "fast-forward merge" が発生し、あなたの HEAD は相手のコミットに更新されるだけで、マージは行われません(本当にマージを記録したい場合は、これを無効にすることができます。 --no-ff ).

次に、実際に2つのリビジョンをマージする必要がある状況に入ります。この場合、2つの可能性があります。ひとつは、マージがきれいに行われる場合です。すべての変更が別のファイルにあるか、同じファイルにあるが十分に離れていて、両方の変更を問題なく適用できる場合です。デフォルトでは、クリーンなマージが行われると自動的にコミットされますが、これを無効にするには --no-commit 事前に編集する必要がある場合(例えば、関数の名前を変更した場合など foo から bar を呼び出す新しいコードを追加し、他の誰かが foo を実行すると、きれいにマージされますが、壊れたツリーが生成されるので、壊れたコミットが発生しないようにするために、マージコミットの一部としてそれをクリーンアップしたい場合があります)。

最後の可能性は、実際にマージが行われ、コンフリクトが発生した場合です。この場合、Git は可能な限りのマージを行い、コンフリクトマーカー付きのファイル ( <<<<<<< , ======= および >>>>>>> ) を作業コピーに追加します。インデックス(ステージング・エリアとも呼ばれます。 git add マージする2つのブランチの祖先にあるファイルのオリジナルバージョン、マージするブランチの HEAD (マージした側) とリモートブランチのバージョンです。

競合を解決するには、作業コピーにあるファイルを編集し、競合マーカーを削除して、動作するようにコードを修正します。あるいは、マージの片方あるいはもう片方のバージョンをチェックアウトすることもできます。 git checkout --ours または git checkout --theirs . ファイルを好きな状態にしたら、マージが終わってコミットできる状態になったことを示すために git add で、マージをコミットすることができます。 git commit .