導入
merge は2つの枝を合流させ、その合流点に マージコミット を残します。一方 rebase は、自分のブランチのコミットを 相手の先端に積み直して、履歴を枝分かれのない 一直線 にします。読みやすい履歴を保ちたいチームでよく使われます。
説明
main と feature を別々のファイルで進めて、枝分かれを作ります。
git init
git add .
git commit -m "C1"
git switch -c feature
echo "機能の実装" >> app.js
git add app.js
git commit -m "Add feature"
git switch main
echo "説明を追記" >> README.md
git add README.md
git commit -m "Update README"
git switch feature
git log --oneline
いま履歴は C1 から二股に分かれています(feature には Update README が見えません)。
flowchart LR
C1["C1"] --> U["Update README (main)"]
C1 --> F["Add feature (feature)"]
ここで feature にいるまま git rebase main を打つと、Git は feature のコミット(Add feature)を いったん外し、main の先端に付け替えて 積み直します。
git rebase main
git log --oneline
C1 → Update README → Add feature の 一直線 になりました。マージコミットは作られません。
flowchart LR
C1["C1"] --> U["Update README (main)"] --> F2["Add feature (feature)"]
rebase の黄金律:すでに push して他人と共有しているコミットは rebase しないこと。rebase はコミットを作り直す(=別物に置き換える)ので、共有済みの履歴を積み直すと、みんなの履歴と食い違って混乱します。手元だけの・まだ共有していない ブランチを整えるときに使うのが基本です。
やってみよう
上の手順で枝分かれを作り、git log --oneline で feature に Update README が無いことを確認してから git rebase main を実行しましょう。もう一度 git log --oneline を見て、履歴が一直線につながり、マージコミットが無いことを確かめてください。
演習
feature ブランチにいる状態で、main の先端の上に積み直してください。
ヒント1を見る
今のブランチを別の土台に積み直すのは git rebase <土台のブランチ> です。
ヒント2を見る
git rebase main