在日常开发中,我们经常会遇到一个尴尬场景:commit 时不小心把日志、压缩包、数据库文件等大文件一并提交了,等发现时已经生成了 commit。
更麻烦的是:这个 commit 里还有正常的业务代码,只想删掉大文件,保留所有代码修改,而且加了 .gitignore 也没用,因为文件已经被追踪了。
这篇文章就用最清晰、最安全的步骤,教你从历史 commit 中彻底移除大文件,保留全部代码。
一、先搞懂:为什么加了 .gitignore 还没用?
.gitignore 只对未被 Git 追踪的文件生效。
一旦文件已经被 git add & git commit,它就已经在 Git 历史里了,单纯加忽略规则无法自动从历史中删掉。
你需要做的是:
编辑那次错误的提交,把大文件从 Git 记录里删掉,同时保留其他所有代码修改。
二、适用场景
- 不小心 commit 了大文件(几十M、上百M甚至更大)
- 这个 commit 里有正常业务代码,必须保留
- 只想删除大文件,不回滚、不丢弃代码
- 已经加了
.gitignore但无效
三、最干净方案:git rebase -i 编辑历史提交
我们使用 交互式变基,直接修改那一次错误提交,全程不丢代码。
1. 找到错误的 commit
先看日志,定位到包含大文件的那次 commit:
git log --oneline
示例(你只需要关心自己的那条):
bec1a36 大文件统一到独立目录、guestID独立生成... # 这里混进了大文件
14b25bee 在metadata中确保用户信息...
c9be1dd 结果查询使用guestid
...
记住这个 commit 的前一个 commit(父commit),后面要用。
2. 开始交互式变基
执行:
git rebase -i 父commit哈希值
作用:从这个父commit开始,编辑后面的提交记录。
执行后会弹出一个文本,类似这样:
pick bec1a36 大文件提交记录...
pick 14b25bee 后续继续有提交...
pick c9be1dd 后续继续有提交
...
把错误那次 commit 前面的 pick 改成 edit 或 e,保存退出。
Git 会自动停在这个 commit,等待你修改。
3. 从本次提交中移除大文件
关键命令:只从Git仓库删除,保留本地文件
git rm --cached 你的大文件路径
然后把这个文件加入 .gitignore:
echo "大文件路径" >> .gitignore
git add .gitignore
4. 修正本次提交
git commit --amend --no-edit
这一步会覆盖原来的 commit,只保留代码,去掉大文件,提交信息不变。
5. 完成变基
git rebase --continue
如果中途没有冲突,一路 continue 到底即可。
有冲突就解决冲突 → git add 冲突文件 → git rebase --continue。
6. 清理 Git 冗余空间(可选但推荐)
git gc --prune=now
四、如果已经推送到远程?
修改历史后,普通推送会失败,需要安全强推:
git push --force-with-lease
注意:
- 个人分支 / 自己独立开发:放心用
- 多人协作分支:确认没人基于这个旧提交开发
五、一句话总结流程
- 找到错误 commit
git rebase -i 父commit- 把 pick → edit
git rm --cached 大文件- 加到
.gitignore git commit --amend --no-editgit rebase --continue- 推送(如需)
git push --force-with-lease
六、以后如何避免?
- 提交前先用
git status看一眼文件列表 - 大型文件、日志、缓存、临时目录提前写进 .gitignore
- 不要把
git add .当成万能操作,不确定时用git add 文件名
这篇就是通用、可直接复制使用的 Git 大文件误提交修复教程,几乎所有后端/前端开发者都会遇到,收藏备用很实用。








