假设修改后的内容也不是敏感的,那么这可能会起作用:在要修改的提交处签出一个新分支,修改文件,然后使用非交互式变基来保留先前未修改后所有内容的合并重新提交到新修改的提交:
# 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
导致与基于它的提交发生冲突,你需要在 rebase 期间修复这些冲突。
这个 1337 git-fu 由Cupcake提供给您:自 2012 年以来在 git repos 上进行心脏直视手术;)