読者です 読者をやめる 読者になる 読者になる

あざらし備忘録。

渋谷ではたらく音ゲー大好きウェッブエンジニアがいろいろ思った事やった事を書いていくブログです

Gitで過去のコミットの名前やメールアドレス、コミット時刻を変更する[Git]

小ネタを一つ。

タイトルの通りで、これまでにしてきたコミットの名前などの情報を書き換えることができるので備忘録がてらご紹介です。

書き換えるには git filter-branch というコマンドを利用します。

git filter-branch とは

最強のオプション: filter-branch 歴史を書き換える方法がもうひとつあります。これは、大量のコミットの書き換えを機械的に行いたい場合 (メールアドレスを一括変更したりすべてのコミットからあるファイルを削除したりなど) に使うものです。そのためのコマンドが filter-branch です。これは歴史を大規模にばさっと書き換えることができるものなので、プロジェクトを一般に公開した後や書き換え対象のコミットを元にしてだれかが作業を始めている場合はまず使うことはありません。しかし、これは非常に便利なものでもあります。

といったように、非常に強力な書き換えコマンドになってます。

単純に過去のコミット全てを書き換える

シンプルすべてのコミットを対象に書き換えるようにするには以下のようにします。

一人で進めているリポジトリだったり、勉強した形跡としてアップしているだけのリポジトリ等にはこれだけで全然良いと思います。

名前を変える

 git filter-branch -f --env-filter 'export GIT_AUTHOR_NAME="<名前>"'

メールアドレスを変える

 git filter-branch -f --env-filter 'export GIT_AUTHOR_EMAIL="<メールアドレス>"'

コミット時刻を変える

 git filter-branch -f --env-filter 'export GIT_AUTHOR_DATE="<時刻>"'

指定のコミットだけ書き換える

書き換えるコミットをフィルタリングして、書き換えたいコミットだけ書き換えるようにもできます。

というのも、先ほど export ほげほげ と書いた点からわかるように、実は中でシェルを実行しているだけなので、好きなようにスクリプトを書くことができます。

なので例えば特定のコミットだけ書き換えたいのなら、次のようにコミットIDを指定して実行することができます。

git filter-branch --env-filter '
if [ $GIT_COMMIT = "<コミットID>" ]
then
    export GIT_AUTHOR_NAME="<名前>"
    export GIT_AUTHOR_EMAIL="<メールアドレス>"
    export GIT_AUTHOR_DATE="<時刻>"
fi'

こんな感じで、もしも書き換えたくなった時でも柔軟に対応できます!

git commit --amendで同じようなことをする

実はおなじみのgit commit --amendでも同じような事が可能です。(もちろん直近のコミットに限りますが)

コマンドは以下のとおりです。

git commit --amend --author "名前 <メールアドレス>" --date "時刻"

コミット直後にすぐ気づいたならこれで大丈夫そうですね!

おまけ

Gitには、実はAUTHORCOMMITERという2人の情報が記憶されています。

こちらの記事などを参照すると良さそうです。

www.shigemk2.com

なので、今回の記事ではシンプルにするためにAUTHORの書き換えだけを紹介しているので、もしもCOMMITER側の情報も書き換えたい場合はAUTHORと書かれていたところをCOMMITERに変えてコマンドを実行してみてください。