Git:過去のコミットコメントを修正する方法

最終更新:2018-07-08 by Joe

git commit により、すでに作成したコミットのコメント(コミットメッセージ)を修正する方法についてです。

直前のコミットコメントの修正「git commit --amend」

Git で、コミットログ(コミットメッセージ、コミットログとも言います)を修正したいときは、非常にシンプルです。

git commit の「--amend」オプションを使います。

// 直前のコミットコメントを修正する
$ git commit --amend

実際は、--amend オプションは直前のコミットを「置き換える」コマンドです。コマンド実行時インデックスに変更が含まれていれば、新しいコミットにその変更を取り込み、直前のコミットを置き換えます。

git commit の詳しい仕様は、こちらの記事も合わせてご覧ください。

過去のコミットコメントを修正「git rebase -i 」

直前のコミットでない場合、単純に git commit --amend のみでの修正は不可能です。2つ以上過去のコミットを修正するには、「git rebase -i」を利用します。(-i は --interactive の略です。)

git rebase -i の利用は、段階を踏んで進んでいきます。

Step 1コメントを変えたいコミットのコミット識別子(SHA-1)を見つける

まず、「git log --oneline」などでコミット履歴を一覧し、適切なコミット識別子(SHA-1)を見つけます

// ログを一行で表示する
$ git log --oneline

// 結果
3e89043 (HEAD -> refs/heads/master) Fix the bug where the image doesn't show.
02f1a92 Add the form to the contact page.
14776e2 Update the page title for the static pages.
8274a1c Add the contatvt page
9edj233 Initial commit.

git rebase -i では、引数にリベースの対象(リベース先)となるコミットを指定することになっています。ですので、今回は、コミットコメントを変更したいコミットの1つ直前のコミットを引数で指定する必要があります。

例えば、上記の出力のなかで「8274a1c Add the contatvt page」を変更したい、場合、その直前の「9edj233」を引数に指定します。

// 9edj233 直後からの履歴をリベース
$ git rebase -i 9edj233

Step 2コメント変更するコミットに「edit」を指定する

さて、このコマンドを実行するとエディタ起動し、過去のコミットを変更する動作が行えるようになります。コミットの右側に表示されている「pick」を、所定の文字列に変更してエディタを保存すると、操作が実行されます。

pick 3e89043 Fix the bug where the image doesn't show.
pick 02f1a92 Add the form to the contact page.
pick 14776e2 Update the page title for the static pages.
pick 8274a1c Add the contatvt page.

# Rebase 307028b..8274a1c onto 307028b (4 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

ヘルプメッセージにも英語で出力されていますが、利用できる変更指定は、下記の通りです。今回のコミットコメントの変更の利用したいのは「edit」です。これにより

pick 3e89043 Fix the bug where the image doesn't show.
pick 02f1a92 Add the form to the contact page.
pick 14776e2 Update the page title for the static pages.
edit 8274a1c Add the contatvt page.

pick を edit (eでも構いません)に書き換えて、エディタを保存して閉じると、次のステップに進みます。

Step 3コミットコメントを修正して、エディタを閉じる

エディタを閉じると即座にリベースが実行されますが、さきほど指定したコミットを編集にため、一度リベースがストップしてくれます。下記のような出力がでます。

// エディタを終了後の出力・・・
Stopped at 8274a1c...  Add the contatvt page.

You can amend the commit now, with

  git commit --amend 

Once you are satisfied with your changes, run

  git rebase --continue

「--amend でコミットを修正できるよ」といった由が表示されています。

この状態で、「git commit --amend 」を実行すると、指定したコミットのコミットコメントを修正することができます。

// コミットコメントを修正
$git commit --amend

Add the contatvt page.

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# Date:      Sat Jun 30 00:55:31 2018 +0900
#
# interactive rebase in progress; onto 8274a1c
# Last commands done (1 commands done):
#    pick 9edj233 Initial commit.
#    edit 8274a1c Add the contatvt page.
# Next commands to do (4 remaining commands):
#    pick 14776e2 Update the page title for the static pages
#    pick 02f1a92 Add the form to the contact page.
# You are currently editing a commit while rebasing branch 'master' on 'db860ce'.

あとはエディタ保存して閉じ「git rebase --continue」を打ち込めば、コミットコメントの修正は完了です。

コミットコメントの修正であれば、リベースの最中にコンフリクトが発生することもありませんので、ほとんどの場合、問題なくコメントの修正を完了できるはずです。

なお、git rebase -i は、コメントの編集以外にも、コミットの消去かコミットの統合など、過去のコミット編集に多く利用できます。

指定説明日本語
p, pickuse commitコミットを利用する
r, reworduse commit, but edit the commit messageコミットを利用する、でもコミットメッセージを編集
e, edituse commit, but stop for amendingコミットを利用する、でもコミットを修正する(ステージにあるが、git commit されていない状態)
s, squashuse commit, but meld into previous commitコミットを利用する、でも直前のコミットに統合
f, fixuplike "squash", but discard this commit's log messagesquashと似ているが、コミットメッセージをを破棄する
x, execrun command (the rest of the line) using shellこの行の末尾に指定したシェルコマンドを実行
d, dropremove commitコミットを破棄する

参考情報

リベースについては、こちらの記事にもまとめています。