経緯
Git で数個前の commit (未 push) のコミットメッセージを修正したい、という事態に直面したため対応。
ただし、上述の通りローカルでの commit のみで push はしていないことが前提となります。
手順
参考記事を見ながら作業していきます。
なお、今回は3つ前の commit のコミットメッセージを修正したい、という仮定です。
> git rebase -i HEAD~3
pick xxxxxxx Shocking First Commit.
pick yyyyyyy Annihilating Second Commit.
pick zzzzzzz Exterminating Last Commit.
# Rebase zzzzzzz..zzzzzzz onto aaaaaaa (3 commands)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup [-C | -c] <commit> = like "squash" but keep only the previous
# commit's log message, unless -C is used, in which case
# keep only this commit's message; -c is same as -C but
# opens the editor
# x, exec <command> = run command (the rest of the line) using shell
# b, break = stop here (continue rebase later with 'git rebase --continue')
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
# create a merge commit using the original merge commit's
# message (or the oneline, if no original merge commit was
# specified); use -c <commit> to reword the commit message
# u, update-ref <ref> = track a placeholder for the <ref> to be updated
# to this position in the new commits. The <ref> is
# updated at the end of the rebase
#
# These lines can be re-ordered; they are executed from top to bottom.
まず git rebase -i HEAD~3
で直近3回のコミットを表示させます。
このとき、 commit のログは日時の昇順で表示されます。通常の Git の操作では降順なのでその点は注意が必要ですね。
edit xxxxxxx Shocking First Commit.
pick yyyyyyy Annihilating Second Commit.
pick zzzzzzz Exterminating Last Commit.
そして、今回は3つ前、ログでは一番上のコミットメッセージを編集したいので、 pick
を edit
に書き換えます。操作は vi(vim) ベースなのでそのつもりで。
:wq
でいったん書き換えを保存。コミットメッセージはこの後に修正するのでこの段階ではまだ未着手です。
> git rebase -i HEAD~3
Stopped at xxxxxxx... Shocking First Commit.
You can amend the commit now, with
git commit --amend
Once you are satisfied with your changes, run
git rebase --continue
続いて次に行うコマンドが表示されるので打ち込みます。
> git commit --amend
--amend
でコミットメッセージを修正します。
Instant Final Commit.
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# Date: WWW MMM dd hh:ii:ss yyyy +zzzz
#
# interactive rebase in progress; onto xxxxxxx
# Last command done (1 command done):
@@@
.git/COMMIT_EDITMSG[+] [unix] (hh:ii dd/mm/yyyy)
これで保存。
> git commit --amend
[detached HEAD bbbbbbb] Instant Final Commit.
Date: WWW MMM dd hh:ii:ss yyyy +zzzz
X files changed, XXX insertions(+), XXX deletions(-)
create mode cccccc PATH/TO/MODIFIED-FILE.js
>
第一段階完了。
> git rebase --continue
Successfully rebased and updated refs/heads/main.
第二段階完了。
これでコミットメッセージを書き換えることができました。