web-dev-qa-db-ja.com

リモートの変更を破棄して、ファイルを「解決済み」としてマークするにはどうすればよいですか?

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

194
Tom DeMille

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での競合と マージ の動作について少し説明します。他の人のコードをマージすると(プル中にも発生します。プルとは基本的にフェッチの後にマージが続く)、起こりうる状況はほとんどありません。

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

別の可能性は、それらのリビジョンが単にあなたの子孫である場合です。この場合、デフォルトでは「早送りマージ」があり、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を使用してマージをコミットできます。

320
Brian Campbell

競合の発生元を確認します。それがgit mergeの結果である場合は、 Brian Campbellanswer を参照してください。

しかし、git rebaseの結果がifの場合、remote(それらの)変更を破棄して使用するにはlocalの変更、あなたはする必要があります:

git checkout --theirs -- .

ours」と「theirs」の意味が逆になっている」 "を参照して、リベース時にourstheirsがどのようにスワップされるかを確認してください( upstream ブランチはチェックアウトされています)。

22
VonC