マージコンフリクトの解消方法
コンフリクトの読み方・解消手順をステップバイステップで解説
コンフリクトは失敗ではない
コンフリクト(conflict / 競合)は、同じ箇所を複数人が変更した場合に Git が「どちらを採用すべきか判断できない」ことを示しているだけです。
正常な開発フローで日常的に起こるものであり、慌てる必要はありません。
コンフリクトマーカーの読み方
コンフリクトが発生すると、該当ファイルに <<<<<<<、=======、>>>>>>> というマーカーが挿入されます。
<<<<<<< HEAD から ======= までが自分の変更、======= から >>>>>>> branch-name までが相手の変更です。
<<<<<<< HEAD
console.log("Hello");
=======
console.log("こんにちは");
>>>>>>> feature/greeting解消の手順
コンフリクトが発生したファイルを開く
git statusで「Unmerged paths」に列挙されているファイルを確認し、エディタで開きます。マーカーを読んで採用するコードを決める
<<<<<<<から=======が自分の変更、=======から>>>>>>>が相手の変更です。両方の差分を見ながら最終的に残すコードを決めます。マーカー行を削除して正しいコードだけ残す
<<<<<<<=======>>>>>>>の行はすべて取り除きます。残し忘れると次のステップで add できません。解消済みファイルを
git addでステージングステージングされた時点で Git は「解消済み」と認識します。
git commitでマージコミットを完了マージ中に自動で作られるコミットメッセージをそのまま使っても構いません。
# コンフリクトファイルを確認
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 マージ)が提供されています。
コンフリクト解消の推奨フロー
feature ブランチに切り替え
git switch featureで自分の作業ブランチに移動します。親ブランチを feature に取り込む
git merge mainで main の最新を feature 側に持ってきます。ここでコンフリクトが起きたら feature 側で解消します。動作確認してコミット
feature で動作確認まで済ませてからコミットすれば、main が壊れるリスクがありません。
main にマージ
git switch mainしてからgit merge featureを実行すれば、この時点ではコンフリクトなしで統合できます。
# 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 でマージ前の状態に戻せます。
何も失われないので安心して使えます。
# マージを中止してマージ前の状態に戻す
git merge --abort
Git Ready