Gitのmergeとrebaseの違い
merge
Aの変更をBに取り込む履歴(コミット)を作る
枝分かれは残ったまま
merge後にコミットIDに変更は無い
rebase
Aの変更をBに取り込むが履歴は残らない(枝分かれが見えない形で一本化)
枝分かれは消える
コミットが作り直されるためコミットIDが変更される
統合時の図解
ローカルとリモートが分岐した状態でmerge、rebaseで統合する場合の違い
code: (md)
A -- B -- C ← リモート(Cが最新)
A -- B -- D -- E ← ローカル(D、Eが作業コミット)
ローカルの作業コミットD、E を残した上でリモートの最新コミットC を取り込みたい
mergeでの統合
1. git fetch でリモートのC を持ってくる
2. ローカルの先頭E とリモートの先頭Cをmergeする
3. 新しいmergeコミット M が作られる(M にD、E が含まれる)
code: (md)
D -- E
/
A -- B -- C -------- M ← ローカル(merge後)
rebaseでの統合
1. C を取り込む
2. D、E をいったん外す
3. C の後にD、E を載せ直す
code: (md)
A -- B -- C -- D' -- E' ← ローカル(rebase後)
D'、E'はrebase後に作り直されたコミットなのでコミットIDが変わる