为何报错:
git在拉取完代码后准备本地代码推送到远程,执行 git push失败了
先上图:

报错分析:
其实发生过好几次了,没找到git push报错原因,或许跟平时的操作习惯有关。
1、本人两部电脑开发,一部mac一部windows,代码在两台电脑上都会进行git操作(错误分析)
2、代码commit的时候经常git commit -m 'xxx'和 git commit -am 'xxx'混用(错误分析)
3、同事提交了我没拉取更新(不大可能,也是错误分析)
解决方法:
方法一、因为发生过好几次,所以之前的解决办法是git push origin --delete [远程分支名字]将远程分支删除,再git push -u origin [远程分支名字]将本地分支推送到刚删除的远程同名分支上就解决问题了
方法二、今天按方法一的操作发现不生效了,怎么推送都失败,后找到解决方法并尝试推送成功了,步骤如下:
1、首先切换到master分支上
git checkout master
2、更新master
git pull origin master
3、将推送报错的分支(dev)合并到master
git merge dev
4、推送到master(要有推送到master的权限)
git push origin master
5、再切换到推送报错的分支(dev)
git checkout dev
6、执行推送
git push origin dev
最后推送成功(不是绝对,也可能还是报错Missing tree,)网上其他方法是git push --no-thin xxx方法,我没有成功
方法三:最终解决方法
发生报错
error: remote unpack failed: error Missing tree xxx的根本原因是我当初克隆代码使用的是浅克隆git clone --depth 1 xxx,快速克隆下代码后我再补齐的其他历史,但是.git/shallow文件没被正确清理
只需执行git repack -a -d,该命令会检测到边界 commit 的父对象已存在,自动删除 .git/shallow,仓库升级为完整克隆。
git repack -a -d是 git 仓库的"整理打包"命令,拆开看:
| 序号 | 项目 |
|---|---|
repack |
重新打包对象(把散落的 loose objects 合并成 pack 文件) |
-a |
all — 把所有对象(包括已在 pack 里的)都重新打包成一个全新的 pack |
-d |
delete — 打包完成后,删除旧的、被替代的 pack 文件和 loose objects |
什么时候用:
1.仓库变慢时 — 整理对象能提升性能
2.空间占用异常时 — 回收旧 pack 和 loose objects 的空间
3.修复浅克隆问题时 — 就像我遇到的,repack 会检测并清理过期的.git/shallow标记
4.日常维护 — 一般不需要,git 的 auto-gc 会自动处理;手动跑通常是为了解决问题
长期建议
- 克隆新项目时不要用
--depth,除非明确只需要短期使用 - 如果已经用了浅克隆,尽早
git fetch --unshallow转完整 - 如果方便可以升级git到更新的版本,对浅克隆的处理更稳健