このように git 履歴を書き換える際の問題は、1 つのコミットを変更すると、それに依存するすべてのコミットも変更されることです。つまり、変更しようとしているコミット ID の後にすべてのコミット ID を保持したい場合、変更したいコミットを変更することはできません。
変更しようとしているコミットの ID に続くコミットの ID を台無しにしても問題ない場合は、次のようなレシピを使用してコミットの詳細を変更できます。
git filter-branch -f --env-filter '
if [ $GIT_COMMIT = %COMMITID% ]
then
export GIT_AUTHOR_DATE="YYYY-MM-DD hh:mm:ss z"
export GIT_COMMITTER_DATE="YYYY-MM-DD hh:mm:ss z"
export GIT_AUTHOR_NAME="Name"
export GIT_AUTHOR_EMAIL="email@address"
export GIT_COMMITTER_NAME="Name"
export GIT_COMMITTER_EMAIL="email@address"
fi
' -- %COMMITID%~..HEAD
`%COMMITID% は、変更するコミットの ID に置き換えます。例:
git filter-branch -f --env-filter '
if [ $GIT_COMMIT = 1234567890ABCD ]
then
export GIT_AUTHOR_DATE="2000-01-01 00:00:00 -0500"
export GIT_COMMITTER_DATE="2000-01-01 00:00:00 -0500"
export GIT_AUTHOR_NAME="Name"
export GIT_AUTHOR_EMAIL="email@address"
export GIT_COMMITTER_NAME="Name"
export GIT_COMMITTER_EMAIL="email@address"
fi
' -- 1234567890ABCD~..HEAD
警告!繰り返しますが、そのコミットだけでなく、その上にあるすべてのコミットを変更しています。
上記により、「邪悪な双子」「幽霊」「古い」コミットツリーがまだぶらぶらしているでしょう。次の方法でクリーンアップできます。
git filter-branch -f --env-filter "" -- %COMMITID%~..HEAD
リモートブランチをプッシュするだけでは機能しないため、新しいコミットでリモートブランチを上書きする必要があります-リモートサーバーが文句を言います。「強制」するか、書き換えられたブランチをプッシュする前にリモート ブランチを削除します。
git push remote_address_or_name :branch_name
例:
git push origin :feature_a
- 他のすべてのチーム メンバーを新しいツリーの上にリベースする必要があります。
git fetch --all -p
そして、リベースする前に、リライトされたリモート ブランチのローカル ヒストリーをクレンジングするなどの作業が必要になる可能性があります。
上記に基づいて、問題のあるコミットを含むいくつかのサーバー側の pre-receive
フックを停止push
し、上記のfilter-branch
魔法を使用して問題のあるメッセージをコミットから取り除く方法をチームメンバーに通知することをお勧めします。