
要删除 Git 仓库的所有历史提交,只保留最后的状态,最核心的思路是创建一个没有历史记录的新分支,然后强制覆盖主分支。
以下是具体操作步骤(请确保在执行前备份好代码,或者在确定不需要历史记录的情况下执行):
基于当前最新的代码状态,创建一个名为 latest 的孤立分支(没有任何父提交历史):
git checkout --orphan latest
将当前工作目录下的所有文件添加到新分支的暂存区中:
git add -A
将暂存区的内容提交,这将成为新仓库的第一次也是唯一一次提交:
git commit -m "Initial commit: retain only the latest state"
删除带有漫长历史的旧主分支(通常是 main 或 master):
# 如果你的主分支是 main
git branch -D main
# 如果你的主分支是 master
git branch -D master
将刚才创建的 latest 分支改名为 main 或 master,使其成为默认分支:
# 重命名为 main
git branch -m main
# 或者重命名为 master
git branch -m master
因为新的主分支历史和远程仓库的历史完全不同,必须使用 --force 强制推送覆盖远程仓库:
# 将main强制推送到远程
git push -f origin main
# 或者是master
git push -f origin master git fetch origin
git reset --hard origin/main
.git 目录中可能仍然存在之前的旧对象(占用磁盘空间)。如果你想彻底清理 .git 目录的体积,可以在强制推送后执行: git reflog expire --expire=now --all
git gc --prune=now --aggressive
远程仓库,一般会有自动的gc,或者去仓库管理页面手动触发下gc动作
最简单粗暴的方法
如果你根本不想敲这些命令
可以直接把项目文件夹里除了 .git 以外的所有文件复制出来备份,然后删掉整个项目文件夹,重新 git init,把备份的文件放进去,提交,并强行推送到远程覆盖。 效果是一样的

。