環境
Ubuntu 20.4
Git 2.25
はじめに
コミット(git commit)した後でもメッセージを修正することができます。修正するコマンドは、状況に合わせて、2種類のコマンドがあります。
- 直前のコミット(HEAD)に対して修正する
- 過去のコミット(HEAD以降)に対して修正する
直前のコミットに対して
コマンドの雛形は次のようになります。
$git commit --amend -m "修正後のメッセージ"
現在のログの状況です。
$git log --oneline
7869790 (HEAD) abc
ce9d4dd ab
4c0a5a0 aa
直前にコミット(HEAD)したメッセージを修正します。
$git commit --amend -m "修正したよ"
[detached HEAD 86b8012] 修正したよ
abc(修正前)→修正したよ(修正後)に変更されました。
$git log --oneline
86b8012 (HEAD) 修正したよ
ce9d4dd ab
4c0a5a0 aa
メッセージは何度も修正することができます。
$git commit --amend -m "再度、修正したよ"
[detached HEAD ce0a15d] 再度、修正したよ
ログを確認すると、修正したよ(修正前)→再度、修正したよ(修正後)に変わりました。
$ git log --oneline
ce0a15d (HEAD) 再度、修正したよ
ce9d4dd ab
4c0a5a0 aa
過去のコミットに対して
現在のログの状況です。
$log --oneline
20e66d5 (HEAD) abb
effbad7 abab
776800d a+b+c+d+e
45a20eb a+bb###
2ee0155 a
HEAD以降の、3つの履歴をviで表示します。
$git rebase -i HEAD^^^
git logでログを表示すると、履歴は上から下に、新しい履歴から古い履歴の順に表示されますが、viで表示される履歴は、上から下に、古い履歴から新しい履歴の順に表示されます。viで、修正したい履歴の1行をpick→editに修正します。修正は複数行修正できてしまいますが、1行だけにします。ここでメッセージを修正しても反映されません。
# 修正前
pick 776800d a+b+c+d+e
pick effbad7 abab
pick 20e66d5 abb
# 修正後
edit 776800d a+b+c+d+e
pick effbad7 abab
pick 20e66d5 abb
更新してviを終了します。この時点でログを表示すると、editに修正した履歴がHEADになっています。一瞬焦りますが、それより新しい履歴は一時的に非表示になっているだけで、削除されたわけではありません。この後、復活します。
$git log --oneline
776800d (HEAD) a+b+c+d+e
45a20eb a+bb###
2ee0155 a
editした履歴に対し、修正後のメッセージを指定します。
$git commit --amend -m "a+b+c+d+e 修正したよ"
この時点でログを表示すると、新しいメッセージが反映されます。
$git log --oneline
b40f220 (HEAD) a+b+c+d+e 修正したよ
45a20eb a+bb###
2ee0155 a
ここで、履歴の再構築が行われます。
$git rebase --continue
修正したメッセージが反映された状態で、ログが元に戻りました。
$git log --oneline
8b50340 (HEAD) abb
d651247 abab
b40f220 a+b+c+d+e 修正したよ
45a20eb a+bb###
2ee0155 a