本文へスキップ
BecomeCoder

Gitコース · 第2章 ブランチとマージ · レッスン13

マージコンフリクト ― 衝突を解決する

ブラウザで完結

導入

2つのブランチ同じファイルの同じ場所 を別々に変更していると、Git は「どちらを採用すべきか」を自動で決められません。これが コンフリクト(衝突) です。怖がる必要はありません。Git が場所を教えてくれるので、人間が選んで直すだけです。

説明

わざとコンフリクトを起こしてみましょう。mainfeatureREADME.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 addgit commit の流れで解決しきってみましょう。一度やれば怖くなくなります。

演習

コンフリクトを解決したあと、履歴を1行ずつ表示してマージコミットができたことを確認してください。

ヒント1を見る

衝突ファイルを書き直して git add、続けて git commit。最後に git log --oneline

実際に動かしてみよう

下の端末に git コマンドを打って Enter を押すと、その場で結果が返ります。本文の手順を実際になぞりながら進めましょう(各レッスンは毎回まっさらな状態から始まり、「最初からやり直す」でいつでも戻せます)。

Git(シミュレート)

ブラウザ内でGitコマンドを試せる学習用環境を読み込みます(本物のgitではなく、動きを再現したものです)。
スクロールして表示された時点でも自動で読み込まれます。