いくつかのローカルファイルがあり、リモートブランチからプルしますが、競合があります。ローカルの変更を保持し、競合の原因となるリモートの変更を無視したいことはわかっています。「すべての競合を解決済みとしてマークし、ローカルを使用する」と実際に言うために使用できるコマンドはありますか?
2 に答える
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つのモードがあります。1つはブランチを切り替え、もう1つはファイルをインデックスから作業コピーにチェックアウトします(場合によっては、最初に別のリビジョンからインデックスにファイルをプルします)。区別する方法は、ファイル名を渡したかどうかです。ファイル名を渡していない場合は、ブランチの切り替えを試みます(ただし、ブランチも渡さない場合は、現在のブランチを再度チェックアウトしようとします)が、変更されたファイルがある場合は、切り替えを拒否します。それが影響するだろう。したがって、既存のファイルを上書きする動作が必要な場合は、.
から2番目の動作を取得するために、またはファイル名を渡す必要がありますgit checkout
。
--
また、ファイル名を渡すときに、。などでオフセットするのも良い習慣git checkout --ours -- <filename>
です。これを行わず、ファイル名がブランチまたはタグの名前と一致する場合、Gitは、ファイル名をチェックアウトするのではなく、そのリビジョンをチェックアウトする必要があると判断するため、checkout
コマンドの最初の形式を使用します。
Gitで競合とマージがどのように機能するかについて少し詳しく説明します。他の誰かのコードをマージする場合(これはプル中にも発生します。プルは基本的にフェッチとそれに続くマージです)、考えられる状況はほとんどありません。
最も単純なのは、同じリビジョンを使用していることです。この場合、あなたは「すでに最新」であり、何も起こりません。
もう1つの可能性は、それらのリビジョンが単にあなたの子孫であるということです。この場合、デフォルトで「早送りマージ」が行われ、HEAD
マージは行われずにコミットに更新されます(これは無効にすることができます。 )を使用して、本当にマージを記録したい--no-ff
。
次に、実際に2つのリビジョンをマージする必要がある状況に入ります。この場合、2つの可能な結果があります。1つは、マージがクリーンに行われることです。すべての変更は異なるファイルにあるか、同じファイルにありますが、両方の変更セットを問題なく適用できるほど十分に離れています。デフォルトでは、クリーンマージが発生すると、自動的にコミット--no-commit
されますが、事前に編集する必要がある場合は、これを無効にすることができます(たとえば、関数の名前をに変更foo
しbar
、他の誰かがを呼び出す新しいコードを追加するとfoo
、クリーンマージされます、ただし、壊れたツリーを生成するため、コミットが壊れないようにするために、マージコミットの一部としてそれをクリーンアップすることをお勧めします)。
最後の可能性は、実際のマージがあり、競合があることです。この場合、Gitは可能な限り多くのマージを実行し、作業コピーに競合マーカー(、、、および)<<<<<<<
を=======
含むファイルを生成します。>>>>>>>
インデックス(「ステージング領域」とも呼ばれます。ファイルをコミットする前にファイルが保存される場所git add
)には、競合のある各ファイルの3つのバージョンがあります。マージする2つのブランチの祖先からのファイルの元のバージョン、HEAD
(マージの側)からのバージョン、およびリモートブランチからのバージョンがあります。
競合を解決するには、作業コピーにあるファイルを編集し、競合マーカーを削除して、コードが機能するように修正します。git checkout --ours
または、またはを使用して、マージの一方または他方の側からバージョンをチェックアウトできますgit checkout --theirs
。ファイルを目的の状態にしたら、ファイルのマージが完了し、を使用してコミットする準備ができていることを示します。git add
次に、を使用してマージをコミットできますgit commit
。
競合の原因を確認してください。それがの結果である場合は、BrianCampbellの回答git merge
を参照してください。
ただし、がの結果である場合、リモート(それらの)変更git rebase
を破棄してローカル変更を使用するには、次のことを行う必要があります。
git checkout --theirs -- .
「<code>ours」と「<code>theirs」の意味が逆になっている理由」を参照して、リベース中に(アップストリームブランチがチェックアウトされているため)どのようours
にスワップされるかを確認してください。theirs