Clear GitHub Commit History
清除GitHub提交记录

📝 笔记总结
主要是有时候我的强迫症犯了:清除 GitHub 提交记录,核心是重写历史并强制推送。
📖 内容来源
清除 GitHub 提交记录,核心是重写历史并强制推送。操作前请务必备份,并注意:如果曾有人 Fork 或克隆过仓库,旧数据仍可能存在于他人本地或 GitHub 缓存中,无法从网络上彻底抹去。
方案一:清空所有历史,保留最新快照
如果你想让仓库看起来像全新的,只保留当前的文件状态,这是最简单的方法。
- 备份:将本地代码库复制到安全位置。
- 创建孤立分支:在项目目录下执行,这会创建一个没有父提交的全新分支。
1
git checkout --orphan new_branch
- 提交所有文件:把当前工作目录的所有文件加入并提交为一个新初始提交。
1
2git add -A
git commit -m \"Initial commit (clean snapshot)\" - 替换旧分支:删除原来的主分支(如
main或master),并把当前分支重命名为它。1
2git branch -D main
git branch -m main - 强制推送:覆盖远程仓库的历史。
1
git push origin --force main
方案二:彻底删除 .git 目录后重新初始化
这个方法更直接,但会丢失所有分支配置和标签,适用于只想保留文件快照的场景。
- 删除 Git 仓库数据:进入项目目录,删除隐藏的
.git文件夹。1
rm -rf .git
- 重新初始化并提交:
1
2
3
4git init
git add .
git commit -m \"Initial commit\"
git remote add origin <你的仓库地址> - 强制推送:
1
git push --force --set-upstream origin main
方案三:删除特定文件或敏感提交
如果只是想删掉历史记录里的某个敏感文件(如密码、密钥),可以使用 git filter-repo 工具,它比旧版的 filter-branch 更快更安全。
- 安装:
pip install git-filter-repo - 删除文件:这会将指定文件从所有历史提交中移除。
1
git filter-repo --path 敏感文件名 --invert-paths
- 强制推送:
git push origin --force --all(若涉及标签,也需推送--tags)。
⚠️ 关键警告与善后
- 秘密必须轮换:如果提交的是密码或密钥,立刻作废并重新生成。清除历史无法阻止别人在清除前已经拷贝,你必须默认它已经泄露。
- 通知协作者:强制推送后,其他人的本地历史会与远程冲突。应通知他们重新克隆,而不是使用
git pull(合并)来更新,否则可能把旧历史又推回来。