推送被拒绝
错误信息
! [rejected] main -> main (fetch first)
快速摘要
你 `git push` 时被拒绝,因为远程分支上有你本地没有的提交,直接推送会覆盖别人的工作。
为什么发生
别人往远程推了新提交,你本地还没拉取
你在本地做了
git commit --amend或 rebase,改写了已推送的历史试图强推到受保护分支(如 main),被服务器拒绝
最小示例
✗ 错误代码
git push origin main
# ! [rejected] main -> main (fetch first)✓ 修复代码
git pull --rebase origin main
git push origin main远程有新提交,直接推被拒。先 git pull --rebase 把远程提交合并进来,再 git push 即可。
如何诊断
阅读拒绝信息,确认是
fetch first还是non-fast-forward运行
git fetch拉取远程最新状态用
git log origin/main..main查看本地比远程多的提交
如何修复
先
git pull --rebase拉取并以 rebase 方式合并,再git push如果确实需要覆盖远程(如修正历史),用
git push --force-with-lease对受保护分支,先走 PR 流程而不是直接推
如何预防
推送前先
git pull --rebase,保持本地与远程同步避免对已推送的提交做 amend 或 rebase,改写历史要慎重