如何从Git的多个历史提交记录中彻底删除已提交的大文件
彻底移除Git历史提交中大文件的操作方案
你之前执行的git rm --cached仅会移除暂存区的对应文件,已经写入本地历史提交的大文件仍然存在,因此推送时远程端检测到历史提交中的大文件依然会触发报错,必须将两个文件从所有本地提交记录中彻底删除才能正常推送。
方法一:使用git filter-repo(官方推荐,适合任意提交数量场景)
git filter-repo是Git官方推荐的历史记录改写工具,操作效率高于传统的filter-branch方案:
- 操作前先完整备份本地仓库,避免操作失误丢失代码
- 在仓库根目录执行如下命令,将
<大文件1相对路径>、<大文件2相对路径>替换为你要删除的两个文件的实际路径:git filter-repo --path <大文件1相对路径> --path <大文件2相对路径> --invert-paths - 命令执行完成后,验证所有提交历史中已无目标大文件、其余代码改动均正常保留
- 执行强制推送命令覆盖远程分支历史:
git push origin <你的分支名称> --force
方法二:交互式变基(适合上次推送后新增提交数量较少的场景)
如果上次推送后你只新增了个位数的提交,用交互式变基操作更轻量化:
- 执行
git log找到上次成功推送的最后一个提交的哈希值,记为<last-push-commit-id> - 启动交互式变基:
git rebase -i <last-push-commit-id> - 在弹出的编辑界面中,将所有包含大文件的提交前的
pick改为edit,保存后退出 - 变基执行到对应待修改提交时,执行如下命令删除大文件并更新提交:
git rm --cached <大文件路径> git commit --amend - 执行
git rebase --continue完成剩余变基流程,如有多个待修改提交重复上一步操作 - 变基完成后执行强制推送即可:
git push origin <你的分支名称> --force
注意事项
- 所有改写历史的操作前必须备份仓库,避免误操作造成代码损失
- 强制推送会覆盖远程分支的提交历史,如果有其他协作者共同使用该分支,需提前告知协作者重置本地对应分支,避免后续提交产生冲突
内容的提问来源于stack exchange,提问作者Jake Mulhern
相关产品推荐
相关产品推荐

