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