← 中文资源

简体中文版本

Git — push 被拒绝(non-fast-forward)

通过比较本地与远端历史诊断 push 拒绝,选择变基或合并,并避免在共享分支上执行破坏性强推。

阅读英文原文

远端不是落后,而是历史分叉

non-fast-forward 拒绝意味着这次 push 不是远端分支的简单延伸:要么远端有新提交,要么本地历史被重写。第一步是 fetch 并查看两侧。不要用 git push --force 让消息消失。

git fetch origin
git log --oneline --graph --left-right HEAD...origin/main

左侧只有你有的提交,右侧只有远端有的提交。右侧非空时,先整合再推送。

有意识地变基或合并

线性历史可以对本地提交变基:

git pull --rebase origin main
# 解决冲突后
git rebase --continue
npm test
git push origin HEAD:main

共享分支或需要保留集成点时改用合并:

git pull --no-rebase origin main
git push origin HEAD:main

两条路径都需要解决冲突并重跑测试。变基会改变提交哈希;如果分支已共享,重写前要协调。

不要随意强推共享分支

git push --force 用本地分支覆盖远端,可能删除他人依赖的提交。如果确实必须强推,使用 --force-with-lease,它会在上次 fetch 后远端又变化时拒绝推送,并提前通知重写。受保护分支应走 PR,而不是绕过保护。

重试前检查上游

意外的拒绝有时是分支不匹配:本地 main 跟踪 origin/develop,或推送目标是 fork 而不是共享仓库。git branch -vv 和 git remote -v 能让问题可见。修正上游或显式指定远端与分支,而不是猜测。