远程拒绝推送主因是本地与远程分支历史不兼容,需先git pull或fetch同步再推送;常见于他人已推送新提交、本地amend/rebase/reset导致分叉,或初始化时远程已有readme.md等文件。

远程分支拒绝推送,绝大多数情况不是权限问题,而是本地历史与远程不兼容——必须先同步再推,不能跳过 git pull 或 git fetch 硬上。
为什么 git push 直接被拒?
Git 拒绝的核心判断是:remote 分支最新提交不在你的本地分支历史中。典型场景包括:
- 别人刚
push了新 commit,你本地还基于旧HEAD提交 - 你本地执行过
git rebase、git reset --hard或git commit --amend,导致历史分叉 - 初始化仓库时远程已有
README.md等文件,你没pull就直接add/commit/push
错误信息里常见关键词:non-fast-forward、Updates were rejected、refusing to update checked out branch(后者多见于非裸仓远程,另需单独处理)。
安全解决:先 git pull 再推(推荐默认路径)
这是协作中最稳妥、最易理解的方式,等价于 git fetch origin + git merge origin/branch-name:
- 运行
git pull origin prd2.6.2(把prd2.6.2替成你实际分支名) - 若提示冲突,打开带
和 <code>>>>>> origin/prd2.6.2标记的文件,删掉标记、保留正确内容 - 保存后执行
git add <file></file>,再git commit -m "Merge remote-tracking branch 'origin/prd2.6.2'"——这步不能跳,否则 Git 不认为冲突已解决 - 最后
git push origin prd2.6.2
注意:如果本地有未提交改动,建议先 git stash,避免 pull 过程中混入意外冲突。
想保持线性历史?用 git rebase 同步
适合希望提交图谱干净、避免多余合并提交的场景,但要求你熟悉变基流程:
- 先
git fetch origin拉取远程引用(不合并) - 再
git rebase origin/prd2.6.2(当前必须在prd2.6.2分支) - 遇到冲突时,编辑文件 →
git add <file></file>→git rebase --continue - 变基完成后,
git push origin prd2.6.2通常能成功;但如果远程在此期间又被更新,可能仍需重试或切回pull方式
⚠️ 变基后若要强制推送(如 --force-with-lease),只限私有分支且确认无人基于你旧提交开发——否则会破坏他人本地历史。
分支保护规则触发时,别硬推
像 GitHub/GitLab 的 Branch Protection Rules 可能禁止直接推送,强制走 PR 流程。此时你会看到类似错误:
TF402455: 不允许推送(push)这个分支;你必须使用 pull request 来更新remote: error: GH006: Protected branch update failed
这不是操作失误,而是策略生效。正确做法是:
- 新建特性分支:
git checkout -b feat/fix-prd262 - 推送新分支:
git push origin feat/fix-prd262 - 去网页端创建 Pull Request,等 CI 通过、审批完成,由维护者合并
- 本地可选重置原分支:
git reset --hard origin/prd2.6.2,避免后续和远程进一步脱节
真正容易被忽略的是:很多人以为“只要没冲突就能推”,却忘了分支保护是服务端策略,和本地历史是否干净完全无关——它根本不给你执行 push 的机会。











