git でメールアドレスやら名前やらを間違えて commit してしまったときの修正方法

ネット上で複数のアカウントやら人格やらを使い分けてる git 使いの方必見。
git でメールアドレスやら名前やらを間違えて commit してしまったときの修正のやり方。


きげんよく開発&コミットをしてきてふとコミットログを確認すると、

D:\ToaruGitNoRepository>git log -2
commit d104bc235464568b95bf18b00e00583b90a8ccbb
Author: foo 
Date:   Tue Jan 4 17:48:40 2011 +0900

    新環境に合わせて環境変数設定用のbatファイルを更新

commit e566fc3bde92333b1e60f9cb508cbd13ba4f0cbe
Author: hogehoge 
Date:   Tue Jan 4 17:20:44 2011 +0900

    関連ファイルの再配置

「やっべ!裏アカウントの hogehoge で commit しちゃってた! 別人のふりしてるアカウントだから直さないと!」


ということで、

D:\ToaruGitNoRepository>git rebase -i HEAD~2

とすると、core.editor で設定しているエディタが開いて、行頭に pick がついたリストが出てくるので、

pick e566fc3 関連ファイルの再配置
pick d104bc2 新環境に合わせて環境変数設定用のbatファイルを更新

# Rebase cf5d0b1..d104bc2 onto cf5d0b1
#
# 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 a shell command , and stop if it fails
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#

変更したいコミット部分を pick から edit に書き換えて、保存してからエディタを閉じる。

edit e566fc3 関連ファイルの再配置
pick d104bc2 新環境に合わせて環境変数設定用のbatファイルを更新

そうすると次のように、edit にしたコミット部分で修正チャンスがやってくるので、

Stopped at e566fc3... relocate peripheral files
You can amend the commit now, with

        git commit --amend

Once you are satisfied with your changes, run

        git rebase --continue

指示に従って修正したかった author を amend で修正してやる。

D:\ToaruGitNoRepository>git commit --amend --author="foo "
[detached HEAD d6533d7] relocate peripheral files
9 files changed, 0 insertions(+), 0 deletions(-)
rename run.bat => bin/run.bat (100%)

そして rebase --continue で残りのコミットを走らせる。

D:\ToaruGitNoRepository>git rebase --continue
Successfully rebased and updated refs/heads/develop.

ログを確認すると、

D:\ToaruGitNoRepository>git log -2
commit 48682d3de7ebf8ace1937d1b86db4d62c8657b8c
Author: foo 
Date:   Tue Jan 4 17:48:40 2011 +0900

    新環境に合わせて環境変数設定用のbatファイルを更新

commit d6533d7c8738614afab8ea2d545edcf279718a61
Author: foo 
Date:   Tue Jan 4 17:20:44 2011 +0900

    関連ファイルの再配置

これで綺麗にごまかせた。ヤレヤレ。


この作業は pick を edit に置き換えた箇所毎に起きるので、複数 edit にした場合はその都度 --ammend と --continue をやってやります。

動作イメージとしてはコミットの積み直し、といった感じでしょうか。
git rebaseのメモ - unpushの日記 によると、

大雑把に言うと、git rebase は「git reset + git cherry-pick × n回 を自動化したもの」と考えられる

だそうです。イメージ通りですね。

追記(2011/4/12)

ワンライナーで一気にやっちゃう手もあるとトラックバックいただいたので追記。修正が多い場合に効きそう。
git でメールアドレスやら名前やらを間違えて commit してしまったときの修正方法 - flatlineの日記