误提交大文件到Git?保留代码、只删文件,一篇教程搞定

文章目录

在日常开发中,我们经常会遇到一个尴尬场景: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 改成 edite,保存退出。

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

注意:

  • 个人分支 / 自己独立开发:放心用
  • 多人协作分支:确认没人基于这个旧提交开发

五、一句话总结流程

  1. 找到错误 commit
  2. git rebase -i 父commit
  3. 把 pick → edit
  4. git rm --cached 大文件
  5. 加到 .gitignore
  6. git commit --amend --no-edit
  7. git rebase --continue
  8. 推送(如需)git push --force-with-lease

六、以后如何避免?

  • 提交前先用 git status 看一眼文件列表
  • 大型文件、日志、缓存、临时目录提前写进 .gitignore
  • 不要把 git add . 当成万能操作,不确定时用 git add 文件名

这篇就是通用、可直接复制使用的 Git 大文件误提交修复教程,几乎所有后端/前端开发者都会遇到,收藏备用很实用。


也可以看看