Git入門:バージョン管理のきほん
コンフリクトを解決する
この回でやること
マージが止まったときに出るコンフリクトマーカーの読み方と、直して add と commit で完了するまでを実演します。撤退する git merge --abort も覚えましょう。
- 読む 約 6 分
同じ行を 2 人が書き換えると、Git は手を止める
Git は変更を行単位で見比べます。片方が 3 行目、もう片方が 40 行目を直したなら、何も聞かずに両方を取り込みます。止まるのは、両方が同じあたりの行を違う内容に書き換えたときだけです。どちらが正しいかは書いた人にしか分からないので、Git は判断を人間に渡します。壊れたわけではありません。
ターミナル
$ git merge feature
CONFLICT (content): Merge conflict in index.html
$ git status
Unmerged paths:
both modified: index.htmlUnmerged paths に並ぶのが、直さなければいけないファイルです。ここに無いものは自動でまとまっています。この時点でマージは完了していません。進むか戻るかを選ぶまで、中途半端な状態です。
消すのは、記号の 3 行と、採らなかったほうの行
ファイルを開くと、Git が書き込んだ記号が入っています。
プレーンテキスト
<h1>Welcome</h1>
<<<<<<< HEAD
<p>お問い合わせは support@example.com まで。</p>
=======
<p>ご相談は各店舗の窓口までお願いします。</p>
>>>>>>> feature
<footer>© 2026 Example</footer><<<<<<< HEAD から ======= までが、いま自分が立っている main 側。======= から >>>>>>> feature までが、取り込もうとしている相手側です。マーカーの外側は無関係です。<h1> と <footer> の行は自動でまとまっているので、触ってはいけません。
やることは 2 つです。残す内容を決めていらない側の行を消す。そして <<<<<<< ======= >>>>>>> の 3 行もすべて消す。片方だけを採る、両方を並べる、書き直す、どれも正解です。両方を活かすなら、上の 7 行がこの 3 行になります。
プレーンテキスト
<h1>Welcome</h1>
<p>ご相談は各店舗の窓口、またはメール support@example.com までお願いします。</p>
<footer>© 2026 Example</footer>マーカーの消し忘れは、いちばん多い失敗です。JavaScript なら構文エラーで動かなくなります。git diff --check を打って何も出なければ、残っていません。
直しただけでは、まだ終わっていない
ファイルを直しても、マージは途中のままです。git add が「このファイルは解決した」という宣言になります。
ターミナル
$ git add index.html
$ git status
All conflicts fixed but you are still merging.
$ git commit
[main 3d9c05a] Merge branch 'feature'引数なしの git commit でエディタが開くので、用意されたメッセージのまま保存して閉じます。複数ファイルがぶつかっているなら、1 つ直すたびに git add し、Unmerged paths が空になったらコミットします。解決するか abort するまで、他のブランチへは逃げられません。
分からなくなったら、その場でやめる
どう直すのが正しいか分からないときは、始める前の状態へ戻します。
ターミナル
$ git merge --abort編集しかけた内容は消えますが、マージ前のコミットは失われません。落ち着いてから git log --oneline main..feature で相手のコミットメッセージを読み、何を意図した変更かを確かめます。解決は Git の操作ではなく仕様の判断です。迷ったら書いた本人に聞くのが最短です。
- コンフリクトは同じ行を両方が変えたときに起きる正常な動作
- 採らない側の行と、記号の 3 行を消す。
git diff --checkで消し忘れを確かめる - 直したら
git addで宣言し、git commitで完了。迷ったらgit merge --abort