Visual Studio でのマージの競合を解決する

一方のブランチを他方のブランチにマージすると、一方のブランチでのコミットによるファイルの変更が、他方での変更と競合する可能性があります。 Git では、ご利用のリポジトリ内の履歴を使用して、マージされたファイルがどのようにあるべきかを判断することで、これらの変更の解決を試みます。 変更をマージする方法が明確ではない場合、Git によってマージは停止され、競合しているファイルが通知されます。

マージの競合を理解する

次の図は、Git 内で変更の競合がどのように発生するのかを示す基本的な例です。 この例では、メイン ブランチと bugfix ブランチでソース コードの同じ行に対して更新が行われています。

Diagram that shows a merge conflict.

bugfix を main の方にマージすることを試みた場合、マージされたバージョンでどちらの変更を使用すればよいかは、Git には判断できません。 変更は、メイン ブランチ、bugfix ブランチ、またはこの 2 つの組み合わせで保持することが必要になる可能性があります。 この競合を解決するには、メイン ブランチ上でマージ コミットを使用して、2 つのブランチ間で競合する変更を調整します。

Diagram that shows how a merge commit resolves a merge conflict.

マージ競合が発生するシナリオとしては、リモート ブランチから自分のローカル ブランチに更新プログラムをプルする場合 (たとえば、origin/bugfix から自分のローカル bugfix ブランチへ) が最も一般的です。 このような競合も同じ方法で解決できます。つまり、自分のローカル ブランチ上で変更を調整するコミットを作成し、マージを完了します。

マージの競合を防ぐ

コミット間でファイルの内容が大幅に変更されない限り、Git ではほとんどの状況でファイルの変更が優れた方法で自動的にマージされます。 使用しているブランチが自分のメイン ブランチよりはるかに遅れている場合は、pull request を開く前にブランチのリベースを検討してください。 リベースされたブランチは、競合することなく main ブランチにマージされます。

マージ競合を解決する

  • 同じブランチ上の他のユーザーと共同作業を行っている場合、変更をプッシュするときにマージの競合が発生する可能性があります。

    Screenshot of merge conflict after a push.

  • 作業しているローカル ブランチがそのリモート追跡ブランチより遅れているかどうかが Visual Studio で検出され、選択可能なオプションが提示されます。

    Screenshot of the options available when the local branch is behind the remote branch.

    Note

    使用しているリモート リポジトリで強制プッシュがサポートされている場合は、[Git]>[設定] を使用して、それを有効にすることができます。

    この例では、リモート リポジトリに導入された変更を含めるために、[プル後にプッシュ] を選択します。 変更をプルするときに、または 2 つのブランチのマージを試みるときにマージの競合が存在する場合は、[Git 変更]ウィンドウ、[Git リポジトリ] ウィンドウ、および競合を含むファイルにおいて、Visual Studio から通知されます。

    Screenshot of a merge conflict notification.

  • [Git 変更] ウィンドウの [マージされていない変更] の下には、競合を含むファイルの一覧が表示されます。 競合の解決を開始するには、ファイルをダブルクリックします。 または、競合を含むファイルをエディターで開くには、[マージ エディターを開く] を選択できます。

    Screenshot of merge conflict status in the Git Changes window.

  • マージ エディターで、次の方法のいずれかを使用して競合を解決する作業を開始できます (番号の付いたスクリーンショットに示すとおり)。

    1. 競合を 1 行ずつ確認し、右側または左側のどちらを保持するかを、チェックボックスをオンにすることで選択します。
    2. 競合している変更のすべてを保持または無視します。
    3. [結果] ウィンドウでコードを手動で編集します。

    Screenshot that shows how to resolve a merge conflict in Visual Studio 2022.

    ヒント

    マージ エディターの既定のレイアウトが気に入らない場合は、歯車のドロップダウン メニューを使用して自由に変更できます。

    Screenshot of the Merge Editor layout options.

    たとえば、次のスクリーンショットは、縦表示がどのように見えるかを示しています。

    Screenshot of vertical view in the Merge Editor user interface.

  • マージ競合の解決が完了したら、[マージの許可] を選択します。 競合しているすべてのファイルに対してこのプロセスを繰り返します。

    Screenshot of the Accept Merge action in Visual Studio 2022.

  • [Git 変更] ウィンドウを使用してマージ コミットを作成し、競合を解決します。

    Screenshot of how to create a merge commit by using the Git Changes window.

    Note

    ファイルに加えた変更をすべて保持する必要がある場合は、[マージされていない変更] セクションでそれを右クリックし、[現在を保持 (ローカル)] を選択してください。マージ エディターを開く必要はありません。

    Screenshot of the Keep Current menu option.

ヒント

使用可能なアクセシビリティ オプションの詳細については、「Visual Studio のアクセシビリティのヒントとテクニック」ページの「Git キーボード ショートカット」セクションを参照してください。