Git push被拒主因是本地与远程分支历史不兼容,须先执行git pull origin main同步再推送;若提示[rejected] main -> main (non-fast-forward),说明远程有本地缺失的commit,应拉取合并或变基,禁用强制推送。

Git push 被拒,90% 不是权限或网络问题,而是本地分支历史和远程不兼容——必须先同步再推,不能跳过 git pull 或 git fetch 直接硬推。
看到 [rejected] main -> main (non-fast-forward) 怎么办
这是最典型的提示,说明远程 main 有你本地没有的 commit(比如同事刚 push 了 README.md,或你 clone 后没 pull 就直接 commit+push)。Git 拒绝非快进推送,防止覆盖他人工作。
- 立刻执行
git pull origin main(等价于git fetch origin+git merge origin/main) - 若提示冲突,打开含
<<<< HEAD和>>>> origin/main标记的文件,删掉标记、保留最终内容 - 保存后运行
git add <文件名>,再git commit -m "resolve conflict"(这步不能跳) - 最后
git push origin main
git pull --rebase 适合什么场景
想保持线性历史、避免 merge 提交时用它。但会改写本地 commit 的 hash,不适合已共享给同事或被 CI 引用的分支。
- 执行前先
git fetch origin,确保拿到最新远程引用 - 运行
git pull --rebase origin main,Git 会把你的本地提交“重放”到远程最新 commit 之后 - 遇冲突时,解决后只用
git add <文件>+git rebase --continue,不要git commit - 如果已用
git push推过旧版本,又做了 rebase,必须用git push --force-with-lease才能更新远程
远程 URL、凭证、SSH 连通性怎么查
这些错误常被 UI 隐藏,终端执行 git push 才能看到真实报错。常见断点不在 Git 本身,而在认证链上。
- 检查远程地址是否正确:
git remote get-url origin;HTTPS 地址漏.git后缀、SSH 地址混用 HTTPS 凭证都会失败 - HTTPS 用户:运行
git config --get credential.helper,Windows 上可用git credential-manager reject https://github.com清旧凭据 - SSH 用户:执行
ssh -T git@github.com;失败说明密钥未加载,或公钥没加到 GitHub/Gitee 账户里 - 企业私有仓库还可能受 SSO 或 OAuth scope 限制,确认 token 是否带
repo权限
GH006 或 Hook declined 错误意味着什么
这不是你操作错了,是远程分支保护规则生效了。GitHub 显示 GH006,GitLab 显示 Hook declined,基本可锁定为保护分支拦截。
- 去仓库
Settings → Branches → Branch protection rules查看是否启用了 “Require pull request reviews” 或 “Include administrators” - 合规做法是:推送到新分支(如
git push origin feature/login),再在 Web 界面创建 PR - 管理员可临时关闭保护,但不推荐;IDE(如 JetBrains)里点 Push 有时静默失败,务必用终端看原始报错
- 对
main、develop这类受保护分支,--force-with-lease也会被拒绝,必须走 PR/MR 流程
最容易被忽略的是:新建仓库时勾选了 “Add a README file”,而你本地是空 init 后直接 push —— 两边历史完全无关,必须加 --allow-unrelated-histories 才能拉下来合并。这个参数不是可选项,是强制条件。


















