Stage 2・中級編 ー Lesson 2-3
コンフリクトを解決する — マージで衝突したときの対処
<<<<<<< のマーカーを目印に手で編集して、add + commit で解決する
💡 たとえるなら
2人が同じノートの同じ行を別々の言葉で書き換えてしまったとき、どちらを残すか手で決める感覚
git merge や git pull をして、こんなメッセージを見たら コンフリクト(衝突) が起きています:
このレッスンでは、その対処を 手取り足取り やっていきます。Stage 1-6 でも触れましたが、ここでは状況再現から修正→確定までフルでやります。
なぜコンフリクトが起きるのか
両方のブランチが 同じファイルの同じ行 を別々に変更していると、Gitは「どちらを採用すればいいか分からない」と判断停止します。
Gitは強制で混ぜたりせず、「両方の変更をマーカー付きで残すから、人間が選んで」 と作業を止めてくれます。
コンフリクトを実際に起こしてみる
my_project で再現してみましょう。
git commit -am "..."-a = 追跡中ファイルの変更を全部 add、-m = メッセージ。1コマンドで add + commit できる便利オプション。新規ファイルは対象外なので注意。
status で状況を見る
衝突中に git status を打つと、どのファイルがぶつかっているかが分かります。
both modified は「両方が同じファイルを変更したよ」のサイン。
衝突したファイルを開いてみる
memo.txt をテキストエディタで開くと、Gitが両方の変更をマーカーで囲んで残してくれています。
3つのマーカーが目印:
| マーカー | 意味 |
|---|---|
<<<<<<< HEAD | ここから下、自分(今いるブランチ=main)の変更 |
======= | 区切り線 |
>>>>>>> feature | ここまで、相手(merge してきた feature)の変更 |
解決:手で書き直す
ファイルを どちらかに寄せるか・両方を組み合わせて 書き直します。マーカー行(<<<<<<< ======= >>>>>>> の3行)も忘れずに削除。
例:両方を採用したいなら、こう書き直します。
main 側だけ残したいなら:
重要:マーカー行を消し忘れると <<<<<<< がコードに残ってしまい、後で動かない・読めない原因になります。
解決後:add + commit で確定
git commit を引数なしで打つとエディタが開き、Merge branch 'feature' のような既定メッセージが表示されます。そのまま保存して閉じればOK。
git status がクリーンになったらコンフリクト解決完了です。
マージをやめたい:git merge —abort
「マズい、手を出す前にいったんなかったことにしたい」と思ったら、マージごとキャンセルできます。
merge を始める前の状態に戻ります。落ち着いてから出直したいときに便利。
コンフリクトに強くなるコツ
git statusを頻繁に見る:今どのファイルがぶつかっているか即わかる- 小さく頻繁にマージする:放置するほど衝突が増える
- エディタの help を活用:VSCode などはコンフリクト箇所に「Accept Current / Accept Incoming / Accept Both」のボタンを出してくれる
- 怖くなったら
--abort:いつでも引き返せる
Gitは何も失わせないように両方の変更を残してくれているだけ。落ち着いて、自分が残したい中身を選べば大丈夫。
このレッスンのまとめ
<<<<<<< ======= >>>>>>> マーカーを読めるgit add + git commit で確定できるgit merge --abort で取り消せる✏️ 理解度チェック
各問題、選んだ瞬間に正解と解説が表示されます。気軽に試してください。
- Q1. コンフリクトマーカー <<<<<<< HEAD が示しているのは?
- Q2. コンフリクトを解消したあとの正しい操作は?
- Q3. マージの途中で「やっぱりやめたい」ときのコマンドは?