修正されたコンテンツも機密ではないと仮定すると、これはうまくいくかもしれません: 修正したいコミットで新しいブランチをチェックアウトし、ファイルを修正してから、以前に修正されていない後のすべてのマージを保持する非インタラクティブなリベースを使用します新しい修正されたコミットにコミットします。
# Checkout a branch "fix" at the commit STUPID
git checkout -b fix STUPID
# Make your file changes...
# Amend STUPID
git add .
git commit --amend -m "REDACTED MWA-HA-HA!"
# Do the BIGGEST rebase that you'll probably ever do in your entire life!
git rebase --preserve-merges --onto fix STUPID master
# or `-p` for short
git rebase -p --onto fix STUPID master
# Verify that the only difference between master and master@{1}
# is the amended content:
git diff master@{1} master
リベースの前後の唯一の違いがmaster
修正されたコンテンツであることを確認したら、reflog を期限切れにして次のコマンドを実行して、古いコミットのローカルおよびリモート リポジトリをパージすることをお勧めしますgit gc
。
git reflog expire --expire=now --all
git gc --prune=now
実行する必要があるその他のクリーンアップ手順については、次を参照してください。
- 機密ファイルとそのコミットを Git 履歴から削除します。
- GitHub: 機密データを削除します。
ところで、何か問題が発生した場合に備えて、所有しているレポの唯一のコピーでこれを試す前に、まず別のローカル クローンでリベースをテストしてください。
そうそう、私はほとんど忘れていました。あなたの修正STUPID
がその上にリベースされているコミットと競合する場合、リベース中にそれらの競合を修正する必要があります。
この 1337 の git-fu は、 Cupcakeの厚意により提供されました: 2012 年以来、git リポジトリで開心術を行っています ;)