「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オプションをつけても良い気がするけど、そこはチームと相談になりそうだ。