这个报错通常意味着远程仓库有你本地没有的提交,直接推送会被拒绝以防止覆盖历史,最稳妥的做法是先拉取远程变更再推送。
先说结论:这是 Git 保护机制触发的非快进式推送拒绝,通常发生在多人协作或跨设备提交后。
- 先确认远程分支是否有新提交
- 先处理本地与远程的历史差异
- 再验证推送是否成功
命令速用版
git pull `--rebase` origin main
git push origin main
注:请将 main 替换为你的实际分支名,常见默认分支为 main 或 master。
为什么会这样
Git 默认禁止“非快进式”(non-fast-forward)推送。当你本地基于旧版本提交,而远程已经更新了新版本时,直接 push 会覆盖远程历史,因此被服务器拒绝。这是为了防止协作时的代码丢失。
分步处理
第一步:检查当前状态
运行 git status 确认当前分支,运行 git log `--oneline` -5 查看本地提交记录。
第二步:拉取远程变更
使用变基方式拉取,保持历史线性:git pull `--rebase` origin main。如果出现冲突,手动解决文件冲突后运行 git add . 和 git rebase `--continue`。
第三步:再次推送
冲突解决或拉取完成后,运行 git push origin main。
怎么验证是否生效
推送完成后,运行 git status 应显示“分支与 origin 同步”。登录代码托管平台(如 GitHub、GitLab)查看提交记录,确认最新提交已出现在远程列表中。
常见坑
1. 慎用强制推送:除非你确定要覆盖远程历史(如私有分支),否则不要使用 git push `--force`,这会丢失他人的提交。
2. 权限问题混淆:如果报错包含"Permission denied",那是 SSH 密钥或账号权限问题,与 refs 拒绝不同,需检查密钥配置。
3. 钩子拦截:少数情况下,服务端预接收钩子(pre-receive hook)会拒绝推送,需联系仓库管理员查看具体拒绝原因。
参考来源
- Git 官方文档:git-push - https://git-scm.com/docs/git-push
- Atlassian Git 教程:git push - https://www.atlassian.com/git/tutorials/syncing/git-push