かもメモ

自分の落ちた落とし穴に何度も落ちる人のメモ帳

Git マージコミットを残したまま rebase したい。

別 PR で機能を取り込んだりしたマージコミットのあるブランチでマージコミットを残したまま rebase したい時のメモ

git rebase -i だとマージコミットが消えてしまう

e.g.

$ git log --graph --oneline
* f3084e4 (HEAD -> master) 時はきた!
* defc249 ねこいいよね
* 3864499 (origin/master) Merge pull request #1 from Mikan/wow
|\
| * 99fb7bd (origin/wow, wow) まちカドまぞく2期決定
|/
* 22301d8 千代田もも
* af375c9 シャミ子
$ git rebase -i af375c9

👇 merge commit が表示されない

pick 22301d8 千代田もも
pick 99fb7bd まちカドまぞく2期決定
pick defc249 ねこいいよね
pick f3084e4 時はきた!

# Rebase af375c9..f3084e4 onto f3084e4 (4 commands)

rebase が完了すると merge commit が消えた履歴になる

$ git log --graph --oneline
* 7817181 (HEAD -> master) 時はきた!
* 82e603d ねこいいよね
* ca3fc82 まちカドまぞく2期決定
* d4132d0 桃色魔法少女
* af375c9 シャミ子

マージコミットを残したい時は -p ( --preserve-merges ) オプションを使用する

追記 (2023-08-28)-s (--preserve-merges) は廃止されているので -r (--preserve-merges) を使う方が良い

-p --preserve-merges
[DEPRECATED: use --rebase-merges instead]
cf. Git - git-rebase Documentation

$ git rebase -i -p af375c9

👇 merge commit も表示される

pick 22301d8 千代田もも
pick 99fb7bd まちカドまぞく2期決定
pick 3864499 Merge pull request #1 from Mikan/wow
pick defc249 ねこいいよね
pick f3084e4 時はきた!

# Rebase af375c9..f3084e4 onto af375c9 (5 commands)

rebase しても merge commit が維持される

$ git log --graph --oneline
* 7817181 (HEAD -> master) 時はきた!
* 82e603d ねこいいよね
*   8689d15 Merge pull request #1 from Mikan/wow
|\
| * ca3fc82 まちカドまぞく2期決定
|/
* d4132d0 桃色魔法少女
* af375c9 シャミ子

マージされたコミットのブランチ名などは失われてしまうようですが、 merge commit を維持したまま rebase することができました。歴史改竄のテクニックをまた一つ覚えてしまった。そもそも merge commit を挟んで rebase する必要が出ないように気をつけるべきだとは思いますが…


[参考]

まちカドまぞく2期嬉しい!