【Git】interactiveリベースでクソコミットをどうにかする

今はアプリケーション開発系じゃない事業部で働いてる。 Gitを使うと言っても、社内ツールのリポジトリ程度なので、 わりとカジュアルにテキトーなコミットをカマしても (たぶん) なんとかなってる。

しかし、ふと気づけば、開発中のトピックブランチに連なるクソコミット達。

(なんだこれは……)

技術者の端くれとして良心の呵責に苛まれて、コミット履歴をきれいにしたくなることあるじゃないですか。 そんなときのinteractiveリベース。


これを……

$ git log --graph --oneline --decorate=full
* 7399e30 (HEAD -> refs/heads/bugfix/hogehoge) update
* 5211aa5 Fix hoge
* d4a292f Fix hoge
* b3dc23d Fix hoge
* e6618aa update
* 419ff0e Cosmetic change
* cc14f7f Rename delete.py to delete_expired_hoge.py
* 38b39d4 update
* 282afdc added new delete script.
* 88d33ae Remove hoge.json from git index
* 7e28ea9 none

こうして……

$ git rebase -i 7e28ea
pick 88d33ae Remove hoge.json from git index
pick 282afdc added new delete script.
pick 38b39d4 update
pick cc14f7f Rename delete.py to delete_expired_hoge.py
pick 419ff0e Cosmetic change
pick e6618aa update
pick b3dc23d Fix hoge
s d4a292f Fix hoge
s 5211aa5 Fix hoge
pick 7399e30 update

# Rebase 7e28ea9..7399e30 onto 7e28ea9 (10 commands)
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

エディタを保存すると、ヌルっとクソコミットが消える。 (ここでは、冒頭のログにある Fix hoge のクソコミット3つを squash して1つに結合した。)

$ git log --graph --oneline --decorate=full
* 19c6230 (HEAD -> refs/heads/bugfix/hogehoge) update
* 7076f2d Fix hoge
* e6618aa update
* 419ff0e Cosmetic change
* cc14f7f Rename delete.py to delete_expired_hoge.py
* 38b39d4 update
* 282afdc added new delete script.
* 88d33ae Remove hoge.json from git index
* 7e28ea9 none

squash 以外にもいろんなコマンドがあるので、それらを駆使してみんなもクソコミットを抹殺しよう!!


まぁ、コミット履歴の書き換えなので、 リモートにプッシュ済みのブランチをリベースした場合は、forceプッシュが必要になるので要注意 (特に複数人で共同作業しているブランチの場合は頑張って……)。

git push --force-with-lease origin bugfix/hogehoge