チーム開発で git merge や git pull を実行した直後に Automatic merge failed; fix conflicts and then commit the result. と表示されて作業が止まった経験はありませんか。git マージ コンフリクトはチーム開発では必ず発生します。しかし、VSCodeのマージエディタを使えば、複雑なコンフリクトマーカーを手動で編集せずに視覚的・安全に解消できます。
このシリーズの全記事
- 第1回:プログラミングエラーメッセージの読み方
- 第2回:VSCodeで「command not found: code」が出た時の解決方法
- 第3回:npmのEACCESエラーをsudoなしで安全に解決する方法
- 第4回:git commitでVimが開いたときにコミットをキャンセルする方法
- 第5回:git detached HEAD状態から安全に復帰する方法
- 第6回:git resetとgit revertの違いと使い分け
- 第7回:git restoreで特定のファイルだけを過去に戻す方法
- 第8回:VSCodeのマージエディタでgitコンフリクトを解消する手順【この記事】
- 第9回:.envをGitにコミットしてしまった場合の履歴からの完全削除
この記事でわかること
- コンフリクトが発生する仕組みと確認方法
- VSCodeのマージエディタ(Merge Editor)を開く手順
- Accept Incoming/Current/Combinationの使い分けとgit add・commitまでの完全な流れ
コンフリクト発生の確認
コンフリクトが発生すると、ターミナルに以下のメッセージが表示されます。
git merge develop
# 出力:
Auto-merging app.py
CONFLICT (content): Merge conflict in app.py
Automatic merge failed; fix conflicts and then commit the result.
コンフリクトが起きているファイルを確認します。
git status
# 出力:
On branch main
You have unmerged paths.
(fix conflicts and run "git commit")
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: app.py
both modified と表示されているファイルがコンフリクトしています。コンフリクトしたファイル内には、Gitが自動挿入したコンフリクトマーカーが存在します。
<<<<<<< HEAD
def greet(name):
return f"こんにちは、{name}さん"
=======
def greet(name):
return f"Hello, {name}!"
>>>>>>> develop
VSCodeのマージエディタを開く
コンフリクトマーカーを直接手動で削除・編集するのは見落としのリスクがあります。VSCodeのマージエディタを使うと、GUIで安全に解消できます。
-
ソース管理タブを開く
VSCode左サイドバーのソース管理アイコン(分岐マーク)をクリックするか、
Ctrl + Shift + G(Mac:Cmd + Shift + G)を押してソース管理タブを開きます。 -
コンフリクトファイルを選択してマージエディタを開く
「マージの変更」セクションに表示されているコンフリクトファイルをクリックします。ファイルが開いたら、エディタ右上に表示される「Resolve in Merge Editor」ボタンをクリックします。
-
コンフリクト箇所を移動しながら解消する
マージエディタが開くと、画面が3つに分割されます。左側が「Current(現在のブランチの変更)」、右側が「Incoming(マージするブランチの変更)」、下側が「Result(マージ結果)」です。
画面右上の上下矢印ボタン(↑ / ↓)でコンフリクト箇所を順番に移動できます。見落としなくすべての箇所を処理してください。
Accept Incoming / Current / Combinationの使い分け
各コンフリクト箇所で、以下のいずれかを選択してマージ結果を決定します。
| ボタン | 動作 | 使う場面 |
|---|---|---|
| Accept Current | 現在のブランチ(HEAD)の変更を採用する | 自分のブランチの実装を残したい場合 |
| Accept Incoming | マージするブランチの変更を採用する | 相手のブランチの実装を取り込みたい場合 |
| Accept Combination | 両方の変更を結合する | どちらのコードも残す必要がある場合 |
Result(下部)の内容を直接編集して、Accept Combination では対応できない複雑なマージ結果を手動で作ることもできます。
ポイント
どちらの変更を採用すべきか迷ったら、コードの変更者(git blame)や、PRのコメントで合意が取れているかを確認してから判断してください。技術的な正解よりもチームの合意が重要です。
Complete Merge → git add → git commit
すべてのコンフリクト箇所を処理したら、マージエディタ右下の「Complete Merge」ボタンをクリックします。その後、ターミナルでコミットを完了させます。
# すべてのコンフリクトを解消してステージングする
git add -A
# 出力:(出力なし)
# マージコミットを作成する
git commit -m "Merge develop: greet関数の日本語メッセージを採用"
# 出力:
[main b3c4d5e] Merge develop: greet関数の日本語メッセージを採用
注意
git add -A を実行する前に、すべてのコンフリクトファイルがマージエディタで「Complete Merge」されていることを確認してください。コンフリクトマーカー(<<<<<<<)が残ったままコミットすると、壊れたコードがリポジトリに入ります。
まとめ
- コンフリクト発生後は
git statusでboth modifiedになっているファイルを確認する - VSCodeのソース管理タブから「Resolve in Merge Editor」を開き、Accept Incoming/Current/Combinationで各コンフリクト箇所を解消する
- 「Complete Merge」後、
git add -A→git commitでマージを完了させる
シリーズナビゲーション:脱・初学者サバイバルガイド


コメント