提交大文件并执行Git回退后,如何成功推送无大文件的代码?
解决Git推送大文件历史的问题
问题核心:你的Commit b已经将大文件提交到Git历史中,后续的回滚、删除操作只是在最新提交中移除了文件,但历史记录里的大文件依然存在,推送时Git会检查整个提交历史,因此仍触发大小限制。git rm --cached无效是因为当前工作区/暂存区已经没有这个文件了,但历史里还留存着。
以下是具体解决步骤:
第一步:定位初始无大文件的提交
执行git log --oneline查看提交记录,找到Commit a的哈希值(类似abc123的字符串)。第二步:交互式重写提交历史
执行命令:git rebase -i <Commit-a的哈希值>比如Commit a的哈希是
abc123,就输入git rebase -i abc123。在弹出的编辑界面中,找到对应Commit b的那一行,把开头的
pick改成edit,其他提交保持pick不变,保存并退出编辑器。第三步:移除Commit b中的大文件
此时Git会回到Commit b的状态,执行命令删除大文件:git rm bigfile.json然后修改这个提交,保留原提交信息:
git commit --amend --no-edit第四步:完成重写并推送
继续完成剩余的rebase流程:git rebase --continue如果过程中出现冲突,解决冲突后执行
git add .,再运行git rebase --continue直到完成。最后强制推送修改后的历史(注意:如果是多人协作仓库,需确认其他协作者没有基于旧历史开发):
git push --force
备选方案(如果交互式rebase太复杂)
使用git filter-repo工具彻底清理历史中的大文件(需先安装该工具):
git filter-repo --path bigfile.json --invert-paths
执行完成后同样需要强制推送:git push --force
内容的提问来源于stack exchange,提问作者Jeet
相关产品推荐
相关产品推荐

