git push 失败 rejected 的 6 个常见原因与解决办法
推送代码被拒「! [rejected]」「failed to push」「non-fast-forward」怎么办?本文覆盖远程领先、权限不足、分支被保护、网络等 6 大根因及对应解法。
git push 是你把本地提交送上远程的动作,但它经常被拒。绝大多数失败都有明确原因,本文按出现频率排序,逐个给解法。
原因 1:远程领先于本地(non-fast-forward)
最常见。别人先推了,你的本地落后于远程,直接 push 会覆盖别人提交,被拒绝:
! [rejected] main -> main (non-fast-forward)
error: failed to push some refs
hint: Updates were rejected because the remote contains work that you do not have locally.
解法:先同步再推。
git pull --rebase origin main # 把自己的提交变基到最新之上
git push origin main
原因 2:本地没有要推送的分支对应远程
git push -u origin 分支名 # -u 同时建立追踪关系
原因 3:权限不足(403 / denied)
对私有仓库或没有写权限的仓库推送会被拒。检查:
- 是否用对了账号/SSH 公钥
- HTTPS 是否用了有写权限的 token
- GitHub 上是否为 collaborator
ssh -T git@github.com # 测试 SSH 是否通
原因 4:分支被保护(protected branch)
远程仓库(尤其 GitHub/GitLab 的 main)开启了分支保护,普通成员不能直接推。解法:创建功能分支推送,再发 Pull/Merge Request 合并。
原因 5:大小/规则被拒
某些平台限制单文件大小或文件名规则,报 File ... is over 100 MB 等。解法:用 Git LFS 管理大文件,或移除大文件后重新提交。
原因 6:网络/超时
Could not resolve host / Connection timed out:网络问题,国内访问 GitHub 可配代理。
git config --global http.proxy http://127.0.0.1:端口
git config --global https.proxy http://127.0.0.1:端口
安全提示
- 遇到 rejected 先
git pull --rebase,不要用git push --force强行覆盖,否则会冲掉同事的提交。 - 确需强推(如已确认无人使用)才用
--force-with-lease(比--force安全,防止覆盖别人新推的)。
一句话速记
先看报错是「远程领先」(pull --rebase)、「权限」(查凭据)、「保护」(走 PR)还是「网络」(配代理),对症下药。
?
常见问题 FAQ
git push 被拒后能直接用 git push --force 吗?
不推荐。--force 会覆盖远程历史,可能冲掉别人的提交。若非单人独享分支,应先用 git pull --rebase 同步;确需强推用更安全的 --force-with-lease。
non-fast-forward 是什么意思?
表示远程有本地没有的新提交,直接推会覆盖它们,所以 Git 拒绝。解法是先 git pull --rebase 把远程改动合并到本地再推。
为什么我 pull 之后 push 还是被拒?
pull 只是拉取了远程改动,若本地与远程仍不一致或 rebase 未完成,可能还需解决冲突并 git push。可先用 git status 确认没有未完成的操作。
远程分支被保护(main)推不上去怎么办?
新建功能分支推送,再在 GitHub/GitLab 上发起 Pull Request 或 Merge Request,由有权限的人审查合并。