Stage 2・中級編 ー Lesson 2-3

コンフリクトを解決する — マージで衝突したときの対処

<<<<<<< のマーカーを目印に手で編集して、add + commit で解決する

💡 たとえるなら

2人が同じノートの同じ行を別々の言葉で書き換えてしまったとき、どちらを残すか手で決める感覚

git mergegit pull をして、こんなメッセージを見たら コンフリクト(衝突) が起きています:

$ git merge feature
Auto-merging memo.txt
CONFLICT (content): Merge conflict in memo.txt
Automatic merge failed; fix conflicts and then commit the result.

このレッスンでは、その対処を 手取り足取り やっていきます。Stage 1-6 でも触れましたが、ここでは状況再現から修正→確定までフルでやります。

なぜコンフリクトが起きるのか

両方のブランチが 同じファイルの同じ行 を別々に変更していると、Gitは「どちらを採用すればいいか分からない」と判断停止します。

共通の祖先 「メモ」 main で変更 「主のメモ」 feature で変更 「機能のメモ」 同じ「メモ」という1行を別々に変更 → どちらを採用?

Gitは強制で混ぜたりせず、「両方の変更をマーカー付きで残すから、人間が選んで」 と作業を止めてくれます。

コンフリクトを実際に起こしてみる

my_project で再現してみましょう。

# feature ブランチを切って、memo.txt を書き換え
$ git switch -c feature
$ echo "feature 側で書き換え" > memo.txt
$ git commit -am "feature で memo を変更"
# main に戻って、同じ場所を別の文字で書き換え
$ git switch main
$ echo "main 側で書き換え" > memo.txt
$ git commit -am "main で memo を変更"
# ここで feature を main にマージ → 衝突!
$ git merge feature
CONFLICT (content): Merge conflict in memo.txt
💡 git commit -am "..."
-a = 追跡中ファイルの変更を全部 add、-m = メッセージ。1コマンドで add + commit できる便利オプション。新規ファイルは対象外なので注意。

status で状況を見る

衝突中に git status を打つと、どのファイルがぶつかっているかが分かります。

$ git status
On branch main
You have unmerged paths.
 (fix conflicts and run "git commit")
Unmerged paths:
 both modified: memo.txt

both modified は「両方が同じファイルを変更したよ」のサイン。

衝突したファイルを開いてみる

memo.txt をテキストエディタで開くと、Gitが両方の変更をマーカーで囲んで残してくれています。

<<<<<<< HEAD
main 側で書き換え
=======
feature 側で書き換え
>>>>>>> feature

3つのマーカーが目印:

マーカー意味
<<<<<<< HEADここから下、自分(今いるブランチ=main)の変更
=======区切り線
>>>>>>> featureここまで、相手(merge してきた feature)の変更

解決:手で書き直す

ファイルを どちらかに寄せるか・両方を組み合わせて 書き直します。マーカー行(<<<<<<< ======= >>>>>>> の3行)も忘れずに削除。

例:両方を採用したいなら、こう書き直します。

main 側で書き換え
feature 側で書き換え

main 側だけ残したいなら:

main 側で書き換え

重要:マーカー行を消し忘れると <<<<<<< がコードに残ってしまい、後で動かない・読めない原因になります。

解決後:add + commit で確定

# 解決したファイルをステージング
$ git add memo.txt
# マージコミットを作る(メッセージはGitが提案してくれる)
$ git commit
[main 1234567] Merge branch 'feature'

git commit を引数なしで打つとエディタが開き、Merge branch 'feature' のような既定メッセージが表示されます。そのまま保存して閉じればOK。

git status がクリーンになったらコンフリクト解決完了です。

マージをやめたい:git merge —abort

「マズい、手を出す前にいったんなかったことにしたい」と思ったら、マージごとキャンセルできます。

$ git merge --abort

merge を始める前の状態に戻ります。落ち着いてから出直したいときに便利。

コンフリクトに強くなるコツ

  • git status を頻繁に見る:今どのファイルがぶつかっているか即わかる
  • 小さく頻繁にマージする:放置するほど衝突が増える
  • エディタの help を活用:VSCode などはコンフリクト箇所に「Accept Current / Accept Incoming / Accept Both」のボタンを出してくれる
  • 怖くなったら --abort:いつでも引き返せる
💡 コンフリクトは「失敗」じゃなくて「確認待ち」
Gitは何も失わせないように両方の変更を残してくれているだけ。落ち着いて、自分が残したい中身を選べば大丈夫。

このレッスンのまとめ

できるようになったこと
✅ コンフリクトが起きる仕組みを理解した
<<<<<<< ======= >>>>>>> マーカーを読める
✅ 解決後に git add + git commit で確定できる
git merge --abort で取り消せる

✏️ 理解度チェック

0 / 3 正解

各問題、選んだ瞬間に正解と解説が表示されます。気軽に試してください。

  1. Q1. コンフリクトマーカー <<<<<<< HEAD が示しているのは?
  2. Q2. コンフリクトを解消したあとの正しい操作は?
  3. Q3. マージの途中で「やっぱりやめたい」ときのコマンドは?

© 2026 git-ready-easy — プログラミング未経験でもわかる git 入門