VS Code でマージ競合を解決する
マージ競合は、Git が異なるブランチからの変更を自動的に結合できない場合に発生します。VS Code は、これらの競合を効率的に特定して解決するためのいくつかのツールを提供します。
インライン エディター アクション、3 方向マージエディター、AI アシスト解決を使用して、Visual Studio Code でマージ競合を解決する方法を学びましょう。
マージ競合の理解
Git が自動的に解決できない競合する変更に遭遇すると、マージ競合が発生します。一般的なシナリオには次のようなものがあります。
- 2 つのブランチがファイル内の同じ行を変更する
- 一方のブランチが、もう一方のブランチが変更したファイルを削除する
- 2 つのブランチが同じ場所に異なるコンテンツを追加する
競合する変更を含むコミットをマージ、リベース、プル、またはチェリーピックしようとすると、Git は操作を一時停止し、手動で解決する必要がある競合をマークします。
開発作業を整理し、マージ競合を最小限に抑えるための ブランチの作成と管理 についてさらに詳しく学びましょう。
VS Code で競合を認識する
マージ競合が発生すると、VS Code は競合を特定して解決するのに役立つ複数の視覚的インジケーターを提供します。競合のあるファイルは、ソース管理ビューの **[マージ変更]** セクションに表示されます。
エディターの競合マーカー
競合のあるファイルを開くと、VS Code は次のマーカーで競合セクションをハイライト表示します。
<<<<<<< HEAD(または現在のブランチ名): 現在のブランチの変更の開始を示します。=======: 2 つの競合するバージョンを区切ります。>>>>>>> branch-name: 取り込みブランチの変更の終了を示します。

CodeLens アクション
VS Code は、各競合の上に CodeLens アクションを表示し、競合をすばやく解決できるようにします。
- 現在の変更を受け入れる: 現在のブランチのバージョンのみを保持します。
- 取り込み変更を受け入れる: 取り込みブランチのバージョンのみを保持します。
- 両方の変更を受け入れる: 両方のバージョンを順番に保持します。
- 変更の比較: diff ビューを開いて、変更を横並びで表示します。
インライン アクションで競合を解決する
簡単な競合の場合は、CodeLens アクションを使用してエディターで直接解決できます。
-
ソース管理ビューから競合のあるファイルを開きます。
-
競合マーカーでマークされた競合セクションを確認します。
-
競合の上にある CodeLens アクションのいずれかを選択します。
- 現在のバージョンを保持するには、**現在の変更を受け入れる** を選択します。
- 取り込みバージョンを保持するには、**取り込み変更を受け入れる** を選択します。
- 両方のバージョンを保持するには、**両方の変更を受け入れる** を選択します。
-
ファイル内の各競合について繰り返します。
-
すべての競合が解決されたら、ファイルを保存します。
ファイル内の競合を解決すると、競合マーカーが消え、ファイルをステージングできます。これにより、ソース管理ビューの **[ステージされた変更]** セクションに移動します。その後、変更をコミットに進むことができます。
両方の変更の一部を組み合わせる必要がある、より複雑な競合の場合は、ファイルを直接編集できます。競合マーカー (<<<<<<<、=======、>>>>>>>) を削除し、コンテンツを編集して目的の結果を作成します。
3 方向マージエディターを使用する
より複雑な競合がある場合や、すべての変更を横並びで表示したい場合は、3 方向マージエディターを使用します。このエディターは、3 つのパネルを備えた包括的なビューを提供します。
- 取り込み (左): マージされるブランチからの変更。
- 現在 (右): 現在のブランチからの変更。
- 結果 (下): 保存されるマージ結果。
マージエディターを開く
3 方向マージエディターを開くには:
-
ソース管理ビューで競合のあるファイルを選択します。
-
コンテキスト メニューから **[マージエディターで開く]** を選択するか、エディターの上部に表示される **[マージエディターで解決]** ボタンを選択します。

マージエディターで変更を受け入れる
マージエディターは、競合する各変更の横にチェックボックスを表示して競合を示します。これらのチェックボックスを使用して、どの変更を受け入れるかを選択します。
-
[取り込み] および [現在] パネルの変更を確認します。
-
エディターの CodeLens アクションを使用して、どの変更を受け入れるかを選択します。
- [取り込み] または [現在] の変更を受け入れます。
- 両方の変更の組み合わせをスマートにマージするには、**[両方の変更の組み合わせを受け入れる]** を選択します。
- 変更を結果に含めたくない場合は、**[無視]** を選択します。
-
下部にある **[結果]** パネルは、選択内容を表示するように自動的に更新されます。
-
結果エディターの右側にある競合カウントインジケーターを使用して、未解決の競合がいくつ残っているかを追跡します。
-
すべての競合が解決されたら、**[マージの完了]** を選択して変更をステージングし、マージエディターを閉じます。
マージエディターでの手動編集
場合によっては、両方の変更の一部を組み合わせたり、完全に新しい解決策を作成したりする必要があります。**[結果]** パネルを直接編集できます。
-
**[結果]** パネルの任意の場所を選択してカーソルを配置します。
-
必要に応じてコンテンツを編集し、両方の変更の要素を組み合わせたり、新しいコードを記述したりします。
受け入れたくない変更を非表示にするには、**[取り込み]** または **[現在]** パネルの **[無視]** ボタンを使用します。これにより、関連する競合に集中できます。
代替レイアウト
マージエディターの右上にある 3 つのドット (···) を選択すると、追加オプションを含むコンテキスト メニューが開きます。垂直レイアウトに切り替えて、変更が行われる前のファイルのステータスを示すベースビューを表示できます。
**[取り込み]**、**[現在]**、**[結果]** の隣にある 3 つのドットには、ベースとの横並び diff の表示、すべての変更の受け入れ、結果のリセットなど、各ビューのオプションがあります。
AI で競合を解決する (実験的機能)
AI アシストによる競合解決は実験的な機能であり、GitHub Copilot サブスクリプションが必要です。
VS Code は AI を使用して マージ競合を自動的に解決するのに役立ちます。この機能は、競合する変更の両方のバージョンを分析し、解決策を提案します。
-
エディターで競合のあるファイルを開きます。
-
エディターの上部にある **[AI でマージ競合を解決]** ボタンを選択します。

-
VS Code はチャットビューを開き、競合を分析するためのエージェンティック フローを開始します。
-
エディターで提案された変更を確認します。
-
解決策を受け入れるか、必要に応じて手動で調整します。
AI は、マージベース (両方のブランチの共通の祖先) と各ブランチからの変更を考慮して、両方の変更の意図を維持しようとする解決策を生成します。
マージ操作を完了する
すべての競合を解決した後、変更をコミットしてマージ操作を完了する必要があります。
-
すべての競合するファイルが解決され、**[ステージされた変更]** セクションにあることを確認します。
-
コミット メッセージを入力し、**[コミット]** を選択してマージを完了します。
マージ操作を中止する必要がある場合は、コマンド パレットから **[Git: マージの中止]** を選択します。これにより、リポジトリはマージ開始前の状態に戻ります。
VS Code を既定のマージツールとして構成する
VS Code を既定のマージツールとして設定するには、ターミナルで次のコマンドを実行します。コマンドラインでマージを実行して競合が発生した場合、Git は VS Code のマージエディターを開いて解決を支援します。
git config --global merge.tool vscode
git config --global mergetool.vscode.cmd 'code --wait $MERGED'
VS Code を Git の既定の diff ツールとして使用するには、次を実行します。
git config --global diff.tool vscode
git config --global difftool.vscode.cmd 'code --wait --diff $LOCAL $REMOTE'
次のステップ
- ブランチとワークツリー - ブランチ管理と競合を最小限に抑える戦略について学びましょう。
- ステージングとコミット - 変更のステージングとコミットの作成について学びましょう。
- リポジトリとリモート - リモートリポジトリでの作業について学びましょう。
- ソース管理の概要 - VS Code のその他の Git 機能を探索しましょう。
- VS Code の Copilot - その他の AI を活用した開発機能を発見しましょう。