git push到的时候遇到 ! [remote rejected] master -」 master (pre-receive hook declined)的问题

原因:远程仓库和本地同步的代码文件存在差异,由于个人在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中的大文件

腾讯云Git 开发者手册—Plumbing Commands

git push到GitHub的时候遇到! [rejected] master -> master (non-fast-forward)的问题


版权声明:本文为weixin_44807854原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。