You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何撤销含大文件的Git提交且不丢失代码?

问题描述

我的Git仓库包含大型数据集,误执行git add .并提交后,每次推送时Git都会尝试将整个数据集推送到服务器。该项目已开发半年但从未推送到GitHub。现在我想撤销这次提交,只推送自己编写的代码,但Git要求完成最后一次提交才能操作,且我不想丢失已写代码。尝试使用git revert又担心会删除代码,请问该如何解决?

Git Status 输出(翻译后)

上一次提交的数百行记录

没有变更被添加到提交中(使用 "git add" 和/或 "git commit -a")

Git Push 输出(翻译后)

枚举对象:2343,完成。
计数对象:100% (2343/2343),完成。
使用最多12线程进行增量压缩
压缩对象:100% (1795/1795),完成。
remote: fatal: 包大小超过最大允许值(2.00 GiB)error: RPC 失败;curl 92 HTTP/2 流0未正常关闭:CANCEL (错误8)

send-pack: 读取边带数据包时意外断开连接
写入对象:100% (2341/2341),2.60 GiB | 5.96 MiB/s,完成。
总计2341(增量574),复用2208(增量543),无复用包
fatal: 远程端意外挂断
Everything up-to-date
解决方案

由于项目从未推送到远程仓库,直接修改本地提交历史完全安全,不会影响其他协作方,按以下步骤操作:

  1. 撤销误提交,保留本地所有文件
    运行命令将HEAD回退到误提交前的版本,本地代码和大文件都会保留:

    git reset HEAD~1
    

    执行后,那次包含大文件的提交会从本地历史中移除,工作区回到提交前的状态。

  2. 配置.gitignore排除大文件
    在仓库根目录创建或修改.gitignore文件,添加大型数据集的路径,比如数据集文件夹为data/,就添加:

    /data/
    

    若是单个大文件,比如big_dataset.zip,则添加:

    big_dataset.zip
    
  3. 重新提交代码
    重新添加并提交你的代码,此时大文件会被.gitignore过滤,不会加入提交:

    git add .
    git commit -m "提交项目代码(排除大型数据集)"
    
  4. 推送到GitHub
    执行推送命令即可完成上传:

    git push origin main
    

    (若你的分支不是main,替换为实际分支名,如master)

补充说明

  • 若更早的提交中也包含大文件,可使用git filter-repo工具彻底清理历史中的大文件,操作前请务必备份仓库。
  • git revert不适用此场景:它会生成新提交来撤销变更,但大文件仍会留在Git历史中,推送时依然会被上传。而git reset直接修改历史,彻底移除误提交的大文件。

内容的提问来源于stack exchange,提问作者Haowei Lou

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 23:01:52