206

いくつかのローカルファイルがあり、リモートブランチからプルしますが、競合があります。ローカルの変更を保持し、競合の原因となるリモートの変更を無視したいことはわかっています。「すべての競合を解決済みとしてマークし、ローカルを使用する」と実際に言うために使用できるコマンドはありますか?

4

2 に答える 2

350

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 checkout2つのモードがあります。1つはブランチを切り替え、もう1つはファイルをインデックスから作業コピーにチェックアウトします(場合によっては、最初に別のリビジョンからインデックスにファイルをプルします)。区別する方法は、ファイル名を渡したかどうかです。ファイル名を渡していない場合は、ブランチの切り替えを試みます(ただし、ブランチも渡さない場合は、現在のブランチを再度チェックアウトしようとします)が、変更されたファイルがある場合は、切り替えを拒否します。それが影響するだろう。したがって、既存のファイルを上書きする動作が必要な場合は、.から2番目の動作を取得するために、またはファイル名を渡す必要がありますgit checkout

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

Gitで競合とマージがどのように機能するかについて少し詳しく説明します。他の誰かのコードをマージする場合(これはプル中にも発生します。プルは基本的にフェッチとそれに続くマージです)、考えられる状況はほとんどありません。

最も単純なのは、同じリビジョンを使用していることです。この場合、あなたは「すでに最新」であり、何も起こりません。

もう1つの可能性は、それらのリビジョンが単にあなたの子孫であるということです。この場合、デフォルトで「早送りマージ」が行われ、HEADマージは行われずにコミットに更新されます(これは無効にすることができます。 )を使用して、本当にマージを記録したい--no-ff

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

最後の可能性は、実際のマージがあり、競合があることです。この場合、Gitは可能な限り多くのマージを実行し、作業コピーに競合マーカー(、、、および)<<<<<<<=======含むファイルを生成します。>>>>>>>インデックス(「ステージング領域」とも呼ばれます。ファイルをコミットする前にファイルが保存される場所git add)には、競合のある各ファイルの3つのバージョンがあります。マージする2つのブランチの祖先からのファイルの元のバージョン、HEAD(マージの側)からのバージョン、およびリモートブランチからのバージョンがあります。

競合を解決するには、作業コピーにあるファイルを編集し、競合マーカーを削除して、コードが機能するように修正します。git checkout --oursまたは、またはを使用して、マージの一方または他方の側からバージョンをチェックアウトできますgit checkout --theirs。ファイルを目的の状態にしたら、ファイルのマージが完了し、を使用してコミットする準備ができていることを示します。git add次に、を使用してマージをコミットできますgit commit

于 2010-01-15T18:29:38.993 に答える
25

競合の原因を確認してください。それがの結果である場合は、BrianCampbell回答git mergeを参照してください。

ただし、がの結果である場合、リモート(それらの)変更git rebaseを破棄してローカル変更を使用するには、次のことを行う必要があります。

git checkout --theirs -- .

「<code>ours」と「<code>theirs」の意味が逆になっている理由」を参照して、リベース中に(アップストリームブランチがチェックアウトされているため)どのようoursにスワップされるかを確認してください。theirs

于 2012-09-21T05:48:31.557 に答える