コミットを対話的に書き換える

git rebase --interactive HEAD

コミットの適用日時を作成日時に合わせる

git rebase --committer-date-is-author-date HEAD

名前とメールアドレスを変更する

git filter-branch --force --env-filter \
"GIT_AUTHOR_NAME='$(git config --get user.name)';"\
"GIT_AUTHOR_EMAIL='$(git config --get user.email)';"\
"GIT_COMMITTER_NAME='$(git config --get user.name)';"\
"GIT_COMMITTER_EMAIL='$(git config --get user.email)';" HEAD

コミットを機械的に書き換える

git filter-branch --tree-filter \
"find . -name *.txt -print0 | xargs -0 perl -pi -e 's/as-is/to-be/g'" HEAD

--tree-filterは各コミットをチェックアウトしてからコマンドを実行し、コミットし直す。

git filter-branch --index-filter \
"git rm --cached --ignore-unmatch password.txt" HEAD

--index-filterはコミットをチェックアウトせずにインデックスを書き換える。

書き換える範囲を指定する

filter-branchで書き換える範囲はHEADやハッシュでの指定ができず、ブランチで指定する。

変更を適用したい直前のコミットに対してブランチを作成し、ブランチ間のコミットを指定する。

以下はorigin/master以降でmasterの最新まで、すなわち、プッシュされていないコミットに対して書き換えを実施する。

git filter-branch --index-filter \
"git rm --cached --ignore-unmatch password.txt" origin/master..master