「git rebaseの挙動とコミットIDの変化について確認する」に関しての考えをまとめました。
目次
作業ブランチに、メインブランチを定期的に取り込んでいるのだけど、Mergeを行うと作業ブランチのコミットが複雑になる。また作業差分も分かりにくくなると思っていた。
そういう状況では「git rebase
を使って最新ブランチを取り込むとよい」と聞いた。
後にも書くけど、注意!: rebaseによりコミットIDが変更されてしまう。そのためリモートにプッシュされており、かつ作業者がいるブランチに対してrebaseは使用できない。ほかの作業者がいなければforceを使えばよいと思うが・・・まだ運用ケースを目にしたことがないので、実情がわからない。。
基本的なコード
git checkout feature // 作業ブランチ移動
git rebase master // masterブランチをfeatureブランチに取り込む
実際の挙動を確かめる
rebase前の変更履歴
featureブランチより前に、masterブランチが存在している
# ----------------------
# rebase前
# ----------------------
$ git log --oneline --graph --all
* c2669e6 (master) master5
* 35799cf master3
| * 3ef1728 (HEAD -> feature) feature4
| * 1468b2e feature
|/
* 8dce528 init
* deb1247 init
feature4のコミットオブジェクト
Commit: 3ef17288e33e35007ea6ac66d05251703f74a533
Parents: 1468b2e8de49506c9aa4b2460a6377b17f378ddd
Author: Your Name <you@example.com>
Committer: Your Name <you@example.com>
Date: Fri Aug 25 2023 11:38:56 GMT+0900 (日本標準時)
feature4
rebaseした後の変更履歴
featureブランチの切り分け先がmasterのHEADをベースに行われる
———————-
##git rebase master後
———————-
$ git log –oneline –graph –all
- 491e327 (HEAD -> feature) feature4
- d4c1c83 feature
- c2669e6 (master) master5
- 35799cf master3
- 8dce528 init
- deb1247 init
### feaure4のコミットオブジェクト
CommitとParent(前のコミットID)も変更されている!
また、Commiterの項目が追加されている。
コミットオブジェクトの内容が変更されたので、CommitIDも変化する。
Commit: 491e3279a420fbf2bd1f5d636398a2be5b07ee59 Parents: d4c1c830399fe9d1cf2131e25535d18eb8871074 Author: Your Name you@example.com Author Date: Fri Aug 25 2023 11:38:56 GMT+0900 (日本標準時) Committer: Your Name you@example.com Committer Date: Fri Aug 25 2023 11:42:43 GMT+0900 (日本標準時)
feature4
# 🚀 結論!
ローカルで作業しているときは、最新のブランチの取り込みは、`git rebase master`でよさそう!
一方で、pushしているブランチに対しては、メインブランチを作業ブランチにmergeするという従来通りの対応になる!なぜなら、コミットオブジェクトのIDが変化しているから。
一人で作業しているリモートブランチに対しては、forceオプションをつけても良い気がするけど、そこはチームと相談になりそうだ。