Gitでコミットログを変更する

Gitを使っていて、後からコミットログを変更する方法を説明する。

まず、こんな履歴があるとする。

commit 37bde0bc18e4e3ac0bf170c045cec34662b7aad4
Author: coiledcoil 
Date:   Mon Aug 16 02:08:11 2010 +0900

    message3

commit 85c337ad4de254bc92c73b5c1504013ee36baa3f
Author: coiledcoil 
Date:   Mon Aug 16 02:08:10 2010 +0900

    message2

commit 664835c29bf5689d673b4f4349f2eaa3cfc85b23
Author: coiledcoil 
Date:   Mon Aug 16 02:08:08 2010 +0900

    message1

commit 4a053f596455e8009d10cec686c1fc29f96b82c1
Author: coiledcoil 
Date:   Mon Aug 16 02:07:31 2010 +0900

    Initial commit

直前のコミットの場合

この場合、git commit --amendを利用する。

git commit --amend

すると、エディターが起動して、既存のコミットログを変更できるようになる。

何世代か前のコミットログの場合

例として、上の履歴の「message2」を「message2 modified」に変更したいとする。
まず、変更したい履歴よりひとつ前のコミットのコミットIDを探す。
今の場合は、664835c29bf5689d673b4f4349f2eaa3cfc85b23である*1
それから、以下のようなコマンドを実行する。

git rebase -i 664835c29bf5689d673b4f4349f2eaa3cfc85b23

すると、エディターが起動して次のようなメッセージが表示される。

pick 25787cf message2
pick d479e8f message3

# Rebase 664835c..d479e8f onto 664835c
#
# 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
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#

ここからは、英語で説明がある通りである。すなわち、変更したい「message2」の手前の、
「pick」という4文字を、「reword」に変更してから、保存して、エディターを終了する。

すると、もう一度エディターが起動し、「message2」を変更するためにコミットログを
入力できる画面になる。ここで、「message2 modified」と入力すれば、コミットログは
無事に変更される。

git rebase は他にも、コミットの取り消しや、入れ替え、融合、分割など、
履歴の書き換え操作が一通りできる。

ただし、git pushしてしまった後にgit rebaseすると、何かと面倒なことになるので、
git pushする前に一度履歴を見直すようにしたほうがよいと思う。

*1:コミットIDは省略して先頭の7,8文字だけ入力してもOKである。