如何撤销含大文件的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
解决方案
由于项目从未推送到远程仓库,直接修改本地提交历史完全安全,不会影响其他协作方,按以下步骤操作:
撤销误提交,保留本地所有文件
运行命令将HEAD回退到误提交前的版本,本地代码和大文件都会保留:git reset HEAD~1执行后,那次包含大文件的提交会从本地历史中移除,工作区回到提交前的状态。
配置.gitignore排除大文件
在仓库根目录创建或修改.gitignore文件,添加大型数据集的路径,比如数据集文件夹为data/,就添加:/data/若是单个大文件,比如
big_dataset.zip,则添加:big_dataset.zip重新提交代码
重新添加并提交你的代码,此时大文件会被.gitignore过滤,不会加入提交:git add . git commit -m "提交项目代码(排除大型数据集)"推送到GitHub
执行推送命令即可完成上传:git push origin main(若你的分支不是
main,替换为实际分支名,如master)
补充说明
- 若更早的提交中也包含大文件,可使用
git filter-repo工具彻底清理历史中的大文件,操作前请务必备份仓库。 git revert不适用此场景:它会生成新提交来撤销变更,但大文件仍会留在Git历史中,推送时依然会被上传。而git reset直接修改历史,彻底移除误提交的大文件。
内容的提问来源于stack exchange,提问作者Haowei Lou
相关产品推荐
相关产品推荐

