Skip to content

推送被拒绝

错误信息

                ! [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,改写历史要慎重

相关资源

相关课程

相关练习

← 返回语言