トラブルシューティング

マージコンフリクトの解消方法

コンフリクトの読み方・解消手順をステップバイステップで解説

マージコンフリクトの解消方法 diagram

コンフリクトは失敗ではない

コンフリクト(conflict / 競合)は、同じ箇所を複数人が変更した場合に Git が「どちらを採用すべきか判断できない」ことを示しているだけです。

正常な開発フローで日常的に起こるものであり、慌てる必要はありません。

コンフリクトマーカーの読み方

コンフリクトが発生すると、該当ファイルに <<<<<<<、=======、>>>>>>> というマーカーが挿入されます。

<<<<<<< HEAD から ======= までが自分の変更、======= から >>>>>>> branch-name までが相手の変更です。

bash
<<<<<<< HEAD
console.log("Hello");
=======
console.log("こんにちは");
>>>>>>> feature/greeting

解消の手順

  1. コンフリクトが発生したファイルを開く

    git status で「Unmerged paths」に列挙されているファイルを確認し、エディタで開きます。

  2. マーカーを読んで採用するコードを決める

    <<<<<<< から ======= が自分の変更、======= から >>>>>>> が相手の変更です。両方の差分を見ながら最終的に残すコードを決めます。

  3. マーカー行を削除して正しいコードだけ残す

    <<<<<<< ======= >>>>>>> の行はすべて取り除きます。残し忘れると次のステップで add できません。

  4. 解消済みファイルを git add でステージング

    ステージングされた時点で Git は「解消済み」と認識します。

  5. git commit でマージコミットを完了

    マージ中に自動で作られるコミットメッセージをそのまま使っても構いません。

bash
# コンフリクトファイルを確認
git status

# ファイルを編集してマーカーを解消した後
git add index.js
git commit -m "コンフリクトを解消"

IDE でのコンフリクト解消(推奨)

VS Code をはじめ、JetBrains(IntelliJ, WebStorm 等)や Visual Studio など主要な IDE にはコンフリクト解消の GUI が組み込まれています。

手動でマーカーを編集するよりも安全・確実です。

VS Code の場合、コンフリクトマーカーを自動検出し、ワンクリックで解消できるボタンを表示します。

Source Control パネルでコンフリクト中のファイル一覧を確認でき、3-way マージエディタで3画面比較も可能です。

ボタン(VS Code の場合) 動作
Accept Current Change 自分(HEAD)の変更だけを残す
Accept Incoming Change 相手(マージ元)の変更だけを残す
Accept Both Changes 両方残す(自分が上、相手が下)
Compare Changes 左右に差分を表示(ファイルは変更しない)

迷ったら Compare Changes で差分を確認してから判断するのがおすすめです。

他の IDE でもボタン名は異なりますが、同様の機能(Current/Incoming の選択、3-way マージ)が提供されています。

コンフリクト解消の推奨フロー

  1. feature ブランチに切り替え

    git switch feature で自分の作業ブランチに移動します。

  2. 親ブランチを feature に取り込む

    git merge main で main の最新を feature 側に持ってきます。ここでコンフリクトが起きたら feature 側で解消します。

  3. 動作確認してコミット

    feature で動作確認まで済ませてからコミットすれば、main が壊れるリスクがありません。

  4. main にマージ

    git switch main してから git merge feature を実行すれば、この時点ではコンフリクトなしで統合できます。

bash
# 1. feature ブランチに切り替え
git switch feature

# 2. main の最新を feature に取り込む(ここでコンフリクト解消)
git merge main

# 3. コンフリクトを解消して動作確認
git add .
git commit -m "main をマージしてコンフリクト解消"

# 4. main にマージ(コンフリクトなし)
git switch main
git merge feature

マージを中止する場合

コンフリクトの解消が難しい場合や、マージ自体をやり直したい場合は git merge --abort でマージ前の状態に戻せます。

何も失われないので安心して使えます。

bash
# マージを中止してマージ前の状態に戻す
git merge --abort

関連コマンド