導入
2つのブランチが 同じファイルの同じ場所 を別々に変更していると、Git は「どちらを採用すべきか」を自動で決められません。これが コンフリクト(衝突) です。怖がる必要はありません。Git が場所を教えてくれるので、人間が選んで直すだけです。
説明
わざとコンフリクトを起こしてみましょう。main と feature で README.md を別内容に書き換えます。
git init
git add .
git commit -m "Initial commit"
git switch -c feature
echo "feature の説明" > README.md
git add README.md
git commit -m "Edit README on feature"
git switch main
echo "main の説明" > README.md
git add README.md
git commit -m "Edit README on main"
git merge feature
CONFLICT (content): Merge conflict in README.md と表示され、マージが止まります。ファイルを開くと、両方の変更が マーカー 付きで残っています。
cat README.md
<<<<<<< HEAD (main)
main の説明
=======
feature の説明
>>>>>>> feature
<<<<<<< から ======= までが自分(main)側、そこから >>>>>>> までが相手(feature)側です。あなたがやることは「正しい最終形」に書き直し、マーカー3行を消すこと。ここでは両方を残す形に直しましょう。
echo "main の説明 / feature の説明" > README.md
git add README.md
git commit -m "Merge feature (resolve conflict)"
解決した内容を git add で「解決済み」と伝え、git commit でマージを完了します。git log --oneline を見ると、2つの親を持つ マージコミット ができています。
やってみよう
上の手順でコンフリクトを起こし、cat README.md でマーカーを確認 → 書き直し → git add → git commit の流れで解決しきってみましょう。一度やれば怖くなくなります。
演習
コンフリクトを解決したあと、履歴を1行ずつ表示してマージコミットができたことを確認してください。
ヒント1を見る
衝突ファイルを書き直して git add、続けて git commit。最後に git log --oneline。