Clear GitHub Commit History

清除GitHub提交记录

Clear GitHub Commit History

📝 笔记总结

主要是有时候我的强迫症犯了:清除 GitHub 提交记录,核心是重写历史并强制推送。

📖 内容来源

清除 GitHub 提交记录,核心是重写历史并强制推送。操作前请务必备份,并注意:如果曾有人 Fork 或克隆过仓库,旧数据仍可能存在于他人本地或 GitHub 缓存中,无法从网络上彻底抹去。

方案一:清空所有历史,保留最新快照

如果你想让仓库看起来像全新的,只保留当前的文件状态,这是最简单的方法。

  1. 备份:将本地代码库复制到安全位置。
  2. 创建孤立分支:在项目目录下执行,这会创建一个没有父提交的全新分支。
    1
    git checkout --orphan new_branch
  3. 提交所有文件:把当前工作目录的所有文件加入并提交为一个新初始提交。
    1
    2
    git add -A
    git commit -m \"Initial commit (clean snapshot)\"
  4. 替换旧分支:删除原来的主分支(如 main 或 master),并把当前分支重命名为它。
    1
    2
    git branch -D main
    git branch -m main
  5. 强制推送:覆盖远程仓库的历史。
    1
    git push origin --force main

方案二:彻底删除 .git 目录后重新初始化

这个方法更直接,但会丢失所有分支配置和标签,适用于只想保留文件快照的场景。

  1. 删除 Git 仓库数据:进入项目目录,删除隐藏的 .git 文件夹。
    1
    rm -rf .git
  2. 重新初始化并提交:
    1
    2
    3
    4
    git init
    git add .
    git commit -m \"Initial commit\"
    git remote add origin <你的仓库地址>
  3. 强制推送:
    1
    git push --force --set-upstream origin main

方案三:删除特定文件或敏感提交

如果只是想删掉历史记录里的某个敏感文件(如密码、密钥),可以使用 git filter-repo 工具,它比旧版的 filter-branch 更快更安全。

  1. 安装:pip install git-filter-repo
  2. 删除文件:这会将指定文件从所有历史提交中移除。
    1
    git filter-repo --path 敏感文件名 --invert-paths
  3. 强制推送:git push origin --force --all(若涉及标签,也需推送 --tags)。

⚠️ 关键警告与善后

  • 秘密必须轮换:如果提交的是密码或密钥,立刻作废并重新生成。清除历史无法阻止别人在清除前已经拷贝,你必须默认它已经泄露。
  • 通知协作者:强制推送后,其他人的本地历史会与远程冲突。应通知他们重新克隆,而不是使用 git pull(合并)来更新,否则可能把旧历史又推回来。