3秒でわかる
Git で分かれたブランチの変更を合流させるコマンド。それぞれの履歴を残したまま、別々に進めた作業を 1 本にまとめ、衝突した箇所だけを人が直します。
もう少し詳しく
どういうものか
git merge は、別のブランチで進めたコミットを、今いるブランチに取り込む操作です。ファイルをコピーするのではなく、履歴の枝を合流させます。
git switch main
git merge feature/login合流の形は 2 通りあります。main が動いていなければ、先端を進めるだけで済みます。これが fast-forward です。両方が進んでいれば、2 つの親を持つマージコミットが 1 つ作られます。
fast-forward
main: A---B → A---B---C---D
feat: B---C---D
マージコミット
main: A---B---E---M
feat: B---C---Dなぜ必要か
複数人が同時に別の機能を書くと、履歴は必ず枝分かれします。merge はその枝を、どちらの作業も消さずに戻す手段です。合流の記録がコミットとして残るので、後から「いつ、どの作業が入ったか」を追えます。
つまずきやすいところ
同じ行を両方で編集していると衝突します。Git は自動で決められないので、印を入れた状態で止まります。
<<<<<<< HEAD
const price = 520;
=======
const price = 540;
>>>>>>> feature/loginここでやることは 3 つです。正しい形に書き直し、印の 3 行を消し、git add してから git commit します。印を消し忘れたままコミットすると、構文エラーのコードが本流に入ります。
もうひとつ、途中でやめたくなったら git merge --abort で merge 前の状態に戻せます。慌てて手で消す必要はありません。
似た用語との違い
| コマンド | 履歴の形 |
|---|---|
git merge | 枝が残り、合流点が記録される |
git rebase | 枝を付け替えて 1 本にする。履歴は書き換わる |
git cherry-pick | 特定のコミットだけを持ってくる |
共有済みのブランチを rebase すると、他の人が持っている履歴とずれて、後から取り込むときに大量の衝突を招きます。すでに push したブランチへは merge を使うのが基本です。
覚え方
merge は「両方の歴史を残して合流させる」操作です。どちらかを消して片方に合わせたい場面では、そもそも merge ではなく、要らないほうのブランチを捨てる判断のほうが早いこともあります。