コンフリクトを解消する
ブランチ同士の変更が衝突したとき、コンフリクトを解消する方法を体験しましょう。
コンフリクトとは
ここまでのレッスンでは、ブランチのマージがスムーズに進みました。しかし実際の開発では、同じファイルの同じ箇所を複数のブランチで編集してしまうことがあります。
Git はこの状況を自動で解決できないため、コンフリクト(衝突) として報告し、人間に判断を委ねます。
このレッスンでは、意図的にコンフリクトを起こし、解消する手順を一通り体験します。
コンフリクトを起こす準備
コンフリクトを発生させるために、main ブランチと別のブランチで <footer> の同じ行を別々に編集 します。
ステップ 1: main でフッターを変更する
まず main ブランチにいることを確認しましょう。
git branch* mainindex.html の <footer> を以下のように変更します。
変更前:
<footer>
<p>GitHub で学習中!</p>
</footer>変更後:
<footer>
<p>© 2026 あなたの名前</p>
</footer>保存したら、コミットします。
git add index.html
git commit -m "フッターに著作権表示を追加"ステップ 2: 別ブランチで同じ箇所を変更する
次に、フッターを変更する前の状態からブランチを作ります。
ここでは少し特殊な操作を使います。
コンフリクトを意図的に起こすために、1つ前のコミットの時点に戻ってブランチを作ります。
git switch -c update-footer HEAD~1Switched to a new branch 'update-footer'HEAD とは
HEAD は「今いるブランチの最新コミット」を指す特別な名前です。Git が「今どこにいるか」を示すポインタだと考えてください。
HEAD~1 のように ~数字 を付けると、そこから数えて何個前のコミットかを指定できます。
| 表記 | 意味 |
|---|---|
HEAD | 現在のブランチの最新コミット |
HEAD~1 | 1つ前のコミット |
HEAD~2 | 2つ前のコミット |
今回の場合、main の最新コミット(HEAD)は「フッターに著作権表示を追加」ですが、HEAD~1 を指定することで その1つ前のコミット(フッターがまだ「GitHub で学習中!」の状態)からブランチを分岐させています。
こうすることで、main と update-footer が同じ行を別々に変更した状態を作り出せます。
index.html を開いてみてください。フッターが「GitHub で学習中!」に戻っているはずです(1つ前のコミットの状態なので)。
このフッターを、main とは違う内容に変更しましょう。
変更後:
<footer>
<p>このページは GitHub で公開しています</p>
</footer>保存したら、コミットします。
git add index.html
git commit -m "フッターの説明文を更新"現在の状況を整理する
ここまでの操作で、以下の状態になっています。
| ブランチ | フッターの内容 |
|---|---|
main | © 2026 あなたの名前 |
update-footer | このページは GitHub で公開しています |
2つのブランチが、同じファイルの同じ行を違う内容に変更しています。これをマージしようとすると、Git は「どちらを採用すればいいかわからない」状態になります。
コンフリクトを発生させる
main に戻って、update-footer をマージしてみましょう。
git switch main
git merge update-footerAuto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.CONFLICT と表示されました! Git が自動マージに失敗し、コンフリクトが発生しています。
git status で状態を確認しましょう。
git statusOn branch main
You have unmerged paths.
(fix conflicts and run "git commit")
(use "git merge --abort" to abort the merge)
Unmerged paths:
(use "git add <file>..." to mark resolution)
both modified: index.html
no changes added to commit (use "git add" to track)both modified: index.html と表示されています。両方のブランチが index.html を変更したことがわかります。
もしコンフリクトの解消が難しいと感じたら、git merge --abort でマージ自体を取り消して、マージ前の状態に戻れます。落ち着いてやり直しましょう。
コンフリクトマーカーを読む
index.html を (VS Code など)で開いてみてください。フッター部分が画像のようになっているはずです。

コンフリクトマーカー が衝突部分を教えてくれています。
| マーカー | 意味 |
|---|---|
<<<<<<< HEAD | ここから現在のブランチ(main)の変更 |
======= | 区切り線 |
>>>>>>> update-footer | ここまでマージしようとしたブランチの変更 |
コンフリクトを解消する
コンフリクトの解消は、マーカーを削除して、最終的にどうしたいかを手動で書くだけです。
今回は両方の変更を活かしましょう。コンフリクトマーカー(<<<<<<<、=======、>>>>>>>)をすべて削除し、以下のように編集してください。
<footer>
<p>© 2026 あなたの名前</p>
<p>このページは GitHub で公開しています</p>
</footer>コンフリクトマーカー(<<<<<<<、=======、>>>>>>>)は必ずすべて削除してください。残したままコミットすると、マーカーがそのままコードに含まれてしまいます。
コンフリクトの解消方法は、状況によって異なります。
| 方針 | やること | 例 |
|---|---|---|
| 両方採用 | 両方の変更を残す | 今回のケース |
| 片方を採用 | 不要な方を削除する | 同じ修正を別々にやってしまった場合 |
| 書き直し | どちらも使わず新しく書く | 両方の変更を統合して別の形にする場合 |
どの方針を取るかは、変更の意図を理解した上で判断します。だからこそ Git は自動で解決せず、人間に委ねるのです。
解消をコミットする
コンフリクトを解消したら、通常のコミットと同じ手順で記録します。
git add index.htmlgit status で確認してみましょう。
git statusOn branch main
All conflicts fixed but you are still merging.
(use "git commit" to conclude merge)
Changes to be committed:
modified: index.html「All conflicts fixed」と表示されています。コミットしましょう。
git commit -m "フッターのコンフリクトを解消"これでコンフリクトの解消が完了しました!
履歴を確認する
git log でマージの履歴を確認してみましょう。
git log --oneline --graph* hij7890 (HEAD -> main) フッターのコンフリクトを解消
|\
| * ghi6789 (update-footer) フッターの説明文を更新
* | fgh5678 フッターに著作権表示を追加
|/
* efg4567 スキルセクションを追加
* def3456 趣味セクションを追加
* ...今回は Fast-forward ではなく、枝分かれが発生したマージになっています。--graph の出力で、main と update-footer が分岐して合流した様子が見えます。
レッスン05で「分岐が起きた場合は枝分かれした図が表示されます」と紹介した形です。
後片付け
マージ済みのブランチを削除して、GitHub にプッシュしておきましょう。
git branch -d update-footer
git pushコンフリクトが起きやすいケース
実際の開発でコンフリクトが起きやすいのは、こんな場面です。
- 複数人が同じファイルを同時に編集している
- 長期間ブランチを分けたままにしている(
mainとの差が大きくなる) - 設定ファイル(
package.jsonなど)を複数のブランチで変更した
コンフリクトを減らすには、そもそも衝突が起きにくい状況を作ることが大切です。
- チームで 編集する箇所が被らないように分担 を話し合う
- ブランチでの作業は 短期間で終わらせて、こまめにマージ する
ブランチを長期間放置するほど main との差が広がり、コンフリクトのリスクが高まります。
このレッスンのまとめ
- 同じファイルの同じ箇所を複数のブランチで変更するとコンフリクトが発生する
- コンフリクトマーカー(
<<<<<<<、=======、>>>>>>>)で衝突箇所を確認できる - マーカーを削除して最終的な内容を手動で書くことで解消する
- 解消後は
git add→git commitで記録する git merge --abortでマージを取り消してやり直すこともできる
次のステップ
お疲れさまでした!最後にこのコースで学んだことを振り返りましょう。