Gitのコミットメッセージを後から変更する方法をわかりやすく書いてみた

こんにちは、ひさっしーです!
今回は、久しぶりにGitネタです。

Gitを使っている方のあるあるかと思いますが、急いで作業している時にコミットメッセージを書き間違えたままcommitしてしまった!なんてことありますよね。

また、グランフェアズではBitbucketで課題を発行してタスクをこなすことがあるので、コミットメッセージに「refs #25」などをつけてコミットを該当の課題と関連付けたりするのですが…これを書き忘れたり、間違えて違う番号にして関連付けをミスったり…ということもあったりします。

コミットメッセージを書き間違えた!
課題との関連付けをし忘れた!

そういった迷えるうっかりさんを救う、「コミットメッセージを後から変更する方法」を今回はご紹介します!

【初級編】直前にコミットしたメッセージを変更する

例えばこんな風に、今書いたコミットメッセージを書き直したい!という時がありますよね。

$ git add -A
$ git commit -m "htmlを修正"
#あっ 今のコミット内容、CSSの修正だった!書き直したい…!(心の声)

そんな時は

git commit --amend

を使用します。

使い方はこのような感じです。

$ git add -A
$ git commit -m "htmlを修正"
#あっ 今のコミット内容、cssの修正だった!書き直したい…!(心の声)
$ git commit --amend -m "cssを修正"
#これで直前のコミットが更新されました!やったー!

簡単ですね!
これで先ほどのミスはなかったことになりました!ふふふ…。

本当かどうか、コミットログも確認してみましょう。
この通り!

$ git log --oneline
e8ecd78a cssを修正 //コミット変更が出来ている!
ca23fd5 ファイルの日付を変更
:

ちなみに、このログはqを入力すると抜けられます。

直前のコミットメッセージの修正はこんなに簡単だったのですね!

【中級編】2つ以上前のコミットメッセージを変更する

お次は、もう少し難度が上がります。例えばこんな風に、3つ前のコミットメッセージを間違えてしまった場合。

$ git add -A
$ git commit -m "htmlを修正"
$ git add -A
$ git commit -m "refs #25 cssを修正"
$ git add-A
$ git commit -m "refs #25 phpを修正"
#あー!3つ前のコミットメッセージ、課題との関連付け忘れてる!

git logだとこんな感じになっています。

$ git log --oneline
d6d9ec4 refs #25 phpを修正 //一番新しいコミット
e1cb3cb refs #25 cssを修正
a202fbd htmlを修正 //←ここを修正したい!
:

そんな時に使用するのが

git rebase -i

です。

一番新しいコミットを1として、修正したいコミットまでの数を数えて、「HEAD~」のあとにその数を入力します。
今回修正したいのは3番目なので「HEAD~3」となります。

$ git rebase -i HEAD~3

そうすると、viエディタが開きます。
(Git使い初心者さんが恐れるviエディタ…っ)

viエディタ画面

一番上に、3つのコミットが並んでいますね。
このviエディタで行うのは、修正したいコミット先頭の「pick」「edit」に書き換えることです。

「えっ?どうやって書き換えるんですか?」という方も大丈夫です!一緒にやってみましょう。

1.「入力モード」に切り替える

慣れている方は分かるかと思いますが、viエディタ起動時の状態は「コマンドモード」となっており、エディタ内の文字を書き換えることができませんので、 「入力モード」にする必要があります。

まず、「入力モードに」切り替えるため、iを押します。
これは「インサート(挿入)」の略です。 最下段に「INSERT」という文字が表示されましたね。これが「入力モード」ですよ、という印です。

INSERTが表示される

2.「pick」→「edit」に変更する

「コマンドモード」から「入力モード」に切り替わりましたので、
その状態で、修正したいコミットの「pick」を「edit」に書き換えます。

editに書き換える

(※ここではまだ、コミットメッセージ自体は書き換えません。)

3.「コマンドモード」に切り替える

では、先ほどの入力内容を保存してから、viエディタを閉じましょう。
その前に、保存するには「入力モード」から逆に「コマンドモード」に変更する必要があります。

Escを押すと、「コマンドモード」に切り替わり、最下部の「INSERT」も消えます。
これでファイルの保存やviの終了操作ができるようになります。

4. ファイルを上書き保存してviエディタを終了する

それではコマンド操作を行ってみましょう。

ファイルの上書き保存:wを入力します。
次に、viエディタを終了するには:qを入力です。

組み合わせて:wq:wq!と入力することもできます。
:wq!ファイル書き込みをして強制終了するという意味になります。( ! は強制指定)


これでviエディタが終了しましたね。

今どういう状態かというと、editを指定したコミット(今回の場合は3つ前のコミット)まで状況が戻っています。 ※もしも該当コミットの作業自体も修正・変更したい場合は、この時点で作業ファイルを修正することも可能です。

ここで、先ほども出てきた

git commit --amend

を使用します。

このように書きます。

$ git commit --amend -m "refs #25 htmlを修正"
#正しいコミットメッセージを入力

すると、3番目のコミットメッセージが入力した内容に更新されます。
次に、

$ git rebase --continue

を入力します。
もし他のコミットもeditにしていた場合は、古い順にeditを指定したコミットに移りますので、先ほどと同じくgit commit --amendを使用してコミットを変更してくださいね。

これで、作業完了です。

git logを見ると、ちゃんと変更出来ていることが確認できますね。

$ git log --oneline
d6d9ec4 refs #25 phpを修正
e1cb3cb refs #25 cssを修正
u305ffd refs #25 htmlを修正 //←変更出来ている!
:

まとめ

いかがでしたか?手順に沿って修正すると、案外簡単なことが分かると思います。
コミットメッセージを書き間違えたけど、さかのぼって修正するのはなんだか怖い…といった方の助けになると幸いです。

viエディタは私もまだ不慣れで、毎回出てくるたびにドキドキします。慣れるしかないですね…。
みなさんも、Gitライフ、楽しんでくださいね!
ひさっしーでした!