原因:远程仓库和本地同步的代码文件存在差异,由于个人在A先提交了一个大的文件到本地,然后又从B提交了代码到线上,导致线上代码与本地A机器代码不一致
remote: git rev-list --objects --all | grep 7c431234ab53abc7ef04b9aa97e66afe6519d85e
remote: Please remove the file from history and try again.
! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'github.com'
git-rev-list - 按反向时间顺序列出提交对象
# 查看文件大小
du -ah .git/objects
# 查看哪个文件占用的空间比较大
du -d 1 -h
#占用空间最多的五个文件
git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5 | awk '{print$1}')"
鉴于个人查找解决的时候答案比较凌乱,在此汇总的解决办法,问题不一样,搞清楚命令含义再使用,已解决我个人遇见的问题,仅供参考。
解决一:强制提交
git push -f
解决二、消除差异重新提交
1、把远程仓库和本地同步,消除差异
git pull origin master --allow-unrelated-histories
2、push到远程仓库
git push origin master
或者重新初始化关联
1、初始化本地仓库
git init
2、重新关联本地和远程仓库
git remote add origin git@github.com:******/manage.git
解决三:解决删除提交的大文件,冲突文件,删除git 历史中的纪录
1、按照git 错误提示执行该语句,找到文件所属路径
git rev-list --objects --all | grep 7c431234ab53abc7ef04b9aa97e66afe6519d85e
2、删除文件
rm -rf fileName
3、移除git 历史中的纪录
git filter-branch --force --index-filter 'git rm -rf --cached --ignore-unmatch '大文件名' --prune-empty --tag-name-filter cat -- --all
4、强制覆盖的方式推送你的repo
git push origin master --force
解决四:直接删除,清理和回收空间
rm -rf .git/refs/original/
git reflog expire --expire=now --all
git gc --prune=now
git gc --aggressive --prune=now
git push origin master --force
# 让远程仓库变小
git remote prune origin
参考原文链接:
记一次删除Git记录中的大文件的过程
腾讯云Git 开发者手册—Plumbing Commands
git push到GitHub的时候遇到! [rejected] master -> master (non-fast-forward)的问题