Git 提交推送总失败?从凭证、分支到钩子的全链路排查
Git 的报错信息常让人摸不着头脑:同样是失败,可能是账号密码错,也可能是分支被保护,甚至是本地钩子拦了你。本文按出现频率梳理最常见的几类失败,并给出可直接照做的修复步骤。
一、认证失败:remote: Invalid username or password
现代代码托管几乎都禁用了明文密码,必须用令牌(token)。排查:
- 确认用的是个人访问令牌而非登录密码;GitHub/GitLab 在 2021 年后均要求 token。
- Windows 凭据管理器里可能缓存了旧密码:打开『凭据管理器 → Windows 凭据』,删掉
git:https://...条目,下次推送重新输入。 - 用 SSH 可一劳永逸:生成
ssh-keygen -t ed25519,把公钥加到账户,并把 remote 改为git@host:user/repo.git。
二、non-fast-forward:本地落后于远端
- 报错含
failed to push some refs和non-fast-forward,说明别人已推送新提交。 - 先
git pull --rebase把本地提交变基到最新,再git push。 - 若 pull 报冲突,逐文件解决后
git add再git rebase --continue。
三、分支被保护或权限不足
直接向 main/master 推送常被服务端拒绝。此时应:
- 新建特性分支:
git checkout -b feature/x,推到远端后再走合并请求(MR/PR)。 - 若是权限问题,报错通常含
remote: You are not allowed to push,需联系仓库管理员授权。
四、pre-commit / pre-push 钩子拦截
- 钩子报错形如
husky - pre-commit hook failed,本质是本地检查未过(如 lint、测试)。 - 先读钩子输出,修复对应问题;确属误报可
git commit --no-verify临时绕过,但需谨慎。
五、大文件与配额限制
单个文件超过托管限制(如 GitHub 100MB)会拒绝。应改用 Git LFS:git lfs install 后 git lfs track '*.psd',再提交;已误提交的需 git filter-repo 清理历史。
技术小结:Git 推送失败先读完整报错首行,分清『认证 / 落后 / 权限 / 钩子 / 体积』五类,再对症下药。养成『先 pull –rebase 再 push、用令牌与 SSH』的习惯,可规避八成问题。