【Git】「You have unmerged paths.」のパニック状態から脱出するコンフリクト解消の黄金ルール

開発チームにジョインし、ついに自分の書いた素晴らしい機能をメインコードに合流させようと、ターミナルで意気揚々と git merge feature-branch を叩いた瞬間——。

CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.

その瞬間に心臓がドクン!と跳ね上がります。
「やばい、壊した!?」と焦り、どうにかしようと git commit を叩くも、今度は fatal: You have unmerged paths. という冷酷なログに弾き返される。
これが、Git初心者が必ず通るパニックの登竜門「コンフリクト(競合)お預け状態」です。

本記事では、このエラーが出たときに絶望することなく、むしろ「よっしゃ、コンフリクト直してやるか」とニヤリと笑えるようになるための、Gitの内部構造とコンフリクト解消の黄金ルールを徹底的に紐解きます。

1. 「You have unmerged paths」が意味する本当のこと

このエラーメッセージ直訳すると「あなたには、まだ合流(マージ)しきれていない道(ファイル)が残っているよ」となります。
そもそもコンフリクトとは、「Aさん(同僚など)」と「Bさん(あなた)」が、全く同じファイルの、全く同じ行番号を別々に書き換えてしまった時に起こります。

Gitはとても賢いツールなので、大抵の変更は自動で綺麗にくっつけて(Auto-merge)くれますが、上記のように「同じ行」が競合した時だけは、
「どっちが正しいかGitという機械には判断できない!人間であるあなたが責任を持って片方に決めてくれ!決めるまではコミット操作(保存)は一切受け付けないぞ!」
と、一時停止状態(マージ中状態)にしてユーザーの判断を強制します。
この一時停止状態こそが「unmerged paths」の正体であり、パニックになる必要など全くありません。Gitが私たちのためにわざとストップしてくれている安全装置なのです。

2. コンフリクト解消の「3ステップ黄金ルール」

エラーが出ても、ターミナルを閉じたり Ctrl+C を連打したりしないでください。深呼吸をして、以下の3ステップを落ち着いて実行しましょう。

ステップ1:競合している「現場」を特定する

まずは、どのファイルが赤く燃え上がっている(競合している)のかを特定します。
ターミナルで git status コマンドを打ってください。

$ git status
On branch main
You have unmerged paths.
  (fix conflicts and run "git commit")
Unmerged paths:
  (use "git add ..." to mark resolution)
	both modified:   index.html

この both modified(両方が変更した)と書かれているファイル(今回なら index.html)が、人間が手動で介入してやるべき「救出対象」です。

ステップ2:エディタで開き、暗号(マーカー)を消す

VS Codeなどのエディタで、先ほど特定した index.html を開いてみてください。すると、以前は無かった「謎の暗号記号」がコードの中に直接書き加えられているはずです。

<<<<<<< HEAD
  

こんにちは世界!

=======

Hello, World!

>>>>>>> feature-branch

これこそがコンフリクトの正体です。
<<<<<<< HEAD から ======= までが「今あなたが現在いるブランチの変更内容」。
======= から >>>>>>> までが「新しく合流させようとした別ブランチの変更内容」です。

やるべきことはただ一つ。この両方を見比べて「最終的にどういうコードにしたいか」を考え、不要な方(と、<<< などの記号全て)をDelキーで削除するだけです。

ステップ3:解決を宣言する(add して commit)

ファイルを編集し終えたら、Gitに対して「競合の解決が終わったぞ!」と宣言してあげます。宣言の仕方は、普段の保存処理と全く同じです。

# 1. 解決済みのファイルをステージングに乗せ直す(これで赤い unmerged が緑に変わります)
$ git add index.html
# 2. マージコミットを作成して一時停止状態(コンフリクト)を完全に終了させる!
$ git commit -m "Merge branch 'feature-branch' and fix conflicts in index.html"

これでエラーは消え去り、無事に2つの世界線(ブランチ)が1つに融合しました!おめでとうございます。

まとめ:エラーを楽しむ余裕を持つ

Gitは、実はコードを絶対に消えさせない「強力なタイムマシン」です。
コンフリクトが起きたからといって、あなたのコードが消滅したわけでは決してありません。ただGitが「どちらを採用すべきか教えてくださいご主人様!」と待機してくれているだけなのです。

「どうしてもよく分からないし、取り返しがつかなくなりそうで怖い…」という時は、git merge --abort という魔法のコマンドを打ち込めば、マージする前の平和な状態に時計の針を完全に戻すことも可能です。
このエラーを通じてGitの根本原則(コミットツリーの概念)をより深く理解しておくと、チーム開発でのトラブルシューティングが一気に得意になります!

コメント

タイトルとURLをコピーしました