VS Codeでのマージ競合の解決

マージ競合は、Gitが異なるブランチからの変更を自動的に結合できない場合に発生します。VS Codeには、これらの競合を効率的に特定して解決するためのツールがいくつか用意されています。

VS Codeで、インラインエディターのアクション、3方向マージエディター、およびAI支援による解決を使用してマージ競合を解決する方法を学びます。

マージ競合の理解

マージ競合は、Gitが自動的に解決できない競合する変更に遭遇したときに発生します。一般的なシナリオには以下があります。

  • 2つのブランチでファイルの同じ行が変更されている
  • 一方のブランチで削除されたファイルを、もう一方のブランチで変更している
  • 2つのブランチで同じ場所に異なるコンテンツが追加されている

競合する変更を含むコミットをマージ、リベース、プル、またはチェリーピックしようとすると、Gitは操作を一時停止し、手動で解決できるように競合箇所をマークします。

ヒント

ブランチの作成と管理について学び、開発作業を整理してマージ競合を最小限に抑える方法を確認してください。

VS Codeでの競合の認識

マージ競合が発生すると、VS Codeはそれらを特定して解決するために役立つ複数の視覚的インジケーターを提供します。競合があるファイルは、ソース管理ビューの「マージの変更」セクションに表示されます。

エディターの競合マーカー

競合のあるファイルを開くと、VS Codeは競合するセクションを以下のマーカーで強調表示します。

  • <<<<<<< HEAD (または現在のブランチ名): 現在のブランチの変更の開始位置をマークします
  • =======: 競合する2つのバージョンを区切ります
  • >>>>>>> branch-name: マージ先(インカミング)ブランチの変更の終了位置をマークします

Screenshot of inline conflict markers in the editor showing current and incoming changes.

CodeLensアクション

各競合の上に、VS Codeは競合を素早く解決するためのCodeLensアクションを表示します。

  • 現在の変更を取り込む: 現在のブランチのバージョンのみを保持します
  • 入ってくる変更を取り込む: マージ先ブランチのバージョンのみを保持します
  • 両方の変更を取り込む: 両方のバージョンを続けて保持します
  • 変更の比較: 差分ビューを開き、左右に並べて違いを確認します

インラインアクションによる競合の解決

単純な競合であれば、CodeLensアクションを使用してエディター上で直接解決できます。

  1. ソース管理ビューから競合のあるファイルを開きます

  2. 競合マーカーで示された競合セクションを確認します

  3. 競合の上に表示されているCodeLensアクションのいずれかを選択します

    • 現在の変更を取り込むを選択して、自分のバージョンを保持する
    • 入ってくる変更を取り込むを選択して、マージ先のバージョンを保持する
    • 両方の変更を取り込むを選択して、両方のバージョンを保持する
  4. ファイル内の各競合に対して繰り返します

  5. すべての競合が解決されたらファイルを保存します

ファイル内の競合を解決すると競合マーカーが消え、ファイルをステージングできます。ファイルはソース管理ビューの「ステージング済みの変更」セクションに移動し、その後コミットに進むことができます。

ヒント

両方の変更の一部を組み合わせる必要があるようなより複雑な競合の場合は、ファイルを手動で編集します。競合マーカー(<<<<<<<, =======, >>>>>>>)を削除し、コンテンツを編集して目的の結果を作成します。

3方向(3-way)マージエディターの使用

より複雑な競合の場合、またはすべての変更を並べて表示したい場合は、3方向マージエディターを使用します。このエディターは、3つのパネルを備えた包括的なビューを提供します。

  • Incoming(左): マージされるブランチからの変更
  • Current(右): 現在のブランチからの変更
  • Result(下): 保存されるマージ結果

マージエディターを開く

3方向マージエディターを開くには:

  1. ソース管理ビューで競合のあるファイルを選択します

  2. コンテキストメニューからマージエディターで開くを選択するか、エディター上部に表示されるマージエディターで解決ボタンを選択します

    Screenshot of the 3-way merge editor showing incoming, current, and result panels.

マージエディターで変更を取り込む

マージエディターでは、各競合する変更の横にチェックボックスが表示されます。これらのチェックボックスを使用して、どの変更を採用するかを選択します。

  1. IncomingおよびCurrentパネルで変更を確認します

  2. エディターのCodeLensアクションを使用して、どの変更を採用するかを選択します

    • IncomingまたはCurrentのいずれかの変更を採用します
    • 両方の組み合わせを採用して、両方の変更をスマートにマージします
    • 変更を無視して、結果から除外します
  3. 下部のResultパネルが自動的に更新され、選択内容が反映されます

  4. 結果エディターの右側にある競合カウントインジケーターを使用して、未解決の競合がいくつ残っているかを確認します。

  5. すべての競合が解決されたら、マージの完了を選択して変更をステージングし、マージエディターを閉じます

マージエディターでの手動編集

両方の変更の一部を組み合わせる必要がある場合や、全く新しい解決策を作成したい場合があります。その際はResultパネルを直接編集できます。

  1. Resultパネル内の任意の場所を選択してカーソルを置きます

  2. 必要に応じてコンテンツを編集し、両方の変更の要素を組み合わせたり、新しいコードを記述したりします

ヒント

IncomingまたはCurrentパネルの無視ボタンを使用して、採用したくない変更を非表示にします。これにより、関連する競合に集中しやすくなります。

代替レイアウト

マージエディターの右上にある3つの点(···)を選択すると、追加オプションを含むコンテキストメニューが開きます。垂直レイアウトに切り替えたり、変更が加えられる前のファイルの状態を表示するベースビューを表示したりできます。

IncomingCurrentResultの横にある3つの点は、各ビューに対するオプション(ベースとの差分を並べて表示、すべての変更を採用、結果のリセットなど)を提供します。

AIを使用した競合の解決(実験的)

注意

AI支援による競合解決は実験的な機能であり、GitHub Copilotのサブスクリプションが必要です。

VS CodeはAIを使用して、マージ競合を自動的に解決する手助けができます。この機能は、競合する変更の双方のバージョンを分析し、解決策を提案します。

  1. エディターで競合のあるファイルを開きます

  2. エディター上部のAIでマージ競合を解決ボタンを選択します

    Screenshot of the AI merge conflict resolution button in the editor.

  3. VS Codeがチャットビューを開き、競合を分析するためのエージェントフローを開始します

  4. エディター上で提案された変更を確認します

  5. 解決策を受け入れるか、必要に応じて手動で調整を行います

AIはマージベース(両ブランチの共通の先祖)と各ブランチからの変更を考慮し、両方の変更の意図を維持しようとする解決策を生成します。

マージ操作の完了

すべての競合を解決した後、変更をコミットしてマージ操作を完了する必要があります。

  1. すべての競合ファイルが解決され、ステージング済みの変更セクションにあることを確認します

  2. コミットメッセージを入力し、コミットを選択してマージを完了します

ヒント

マージ操作を中断する必要がある場合は、コマンドパレットからGit: マージの中止を選択します。これにより、リポジトリがマージ開始前の状態に戻ります。

VS Codeをデフォルトのマージツールとして設定

ターミナルで以下のコマンドを実行することで、VS CodeをデフォルトのGitマージツールとして設定できます。コマンドラインでマージを実行して競合が発生した場合、GitはVS Codeのマージエディターを開いて解決を支援します。

git config --global merge.tool vscode
git config --global mergetool.vscode.cmd 'code --wait $MERGED'

VS CodeをGitのデフォルトの差分ツールとして使用するには、以下を実行します。

git config --global diff.tool vscode
git config --global difftool.vscode.cmd 'code --wait --diff $LOCAL $REMOTE'

次のステップ

© . This site is unofficial and not affiliated with Microsoft.