今はアプリケーション開発系じゃない事業部で働いてる。 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