Git 中文手册

git push 失败 rejected 的 6 个常见原因与解决办法

2026-09-06 约 3 分钟阅读

推送代码被拒「! [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,由有权限的人审查合并。