ローカルファイルがいくつかあり、リモートブランチからプルしますが、競合があります。ローカルの変更を保持し、競合の原因となるリモートの変更を無視したいことを知っています。 「すべての競合を解決済みとしてマークし、ローカルで使用する」と言うのに使用できるコマンドはありますか?
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
を使用してマージをコミットできます。
競合の発生元を確認します。それがgit merge
の結果である場合は、 Brian Campbell の answer を参照してください。
しかし、git rebase
の結果がifの場合、remote(それらの)変更を破棄して使用するにはlocalの変更、あなたはする必要があります:
git checkout --theirs -- .
「 「ours
」と「theirs
」の意味が逆になっている」 "を参照して、リベース時にours
とtheirs
がどのようにスワップされるかを確認してください( upstream ブランチはチェックアウトされています)。