推送失败主因是本地与远程分支历史不一致,git拒绝非快进推送以防覆盖他人提交;需先执行git pull origin main同步,遇冲突则手动解决后提交再推送,或用git pull --rebase保持线性历史。

推送失败不是权限或网络问题,而是本地分支和远程分支历史不一致——Git 拒绝非快进(non-fast-forward)推送,防止覆盖他人提交。
看到 [rejected] main -> main (fetch first) 怎么办
这是最常见提示,说明远程 main 有你本地没有的 commit(比如别人刚推了 README.md,或你 clone 后没 pull 就直接 commit+push)。Git 不会自动覆盖,必须先同步。
- 立刻执行
git pull origin main(等价于git fetch origin+git merge origin/main) - 如果提示冲突,打开标有
和 <code>>>>>> origin/main的文件,删掉标记,保留最终内容 - 保存后运行
git add .,再git commit -m "resolve merge conflicts" - 最后
git push origin main
想保持线性历史?用 git pull --rebase
默认 git pull 会生成一个 merge commit;--rebase 把你的本地提交“重放”到远程最新 commit 之后,历史更干净。但注意:它会改写本地 commit hash。
- 执行
git pull origin main --rebase - 遇到冲突时,编辑文件 →
git add 文件名→git rebase --continue(全程不要git commit) - 完成后直接
git push origin main - 别在已分享给同事的分支上用——CI 流水线或他人本地引用的旧 hash 会失效
git remote 断连或地址错误导致推送失败
运行 git remote -v 发现空输出,或地址明显不对(比如少了 @、协议写成 git:// 而不是 ssh:// 或 https://),说明本地根本没连上远程仓库。
- 确认远程地址正确:GitHub 用
https://github.com/user/repo.git或git@github.com:user/repo.git;GitLab 类似 - 地址错了就重设:
git remote set-url origin 正确地址 - 完全没配置就加:
git remote add origin 正确地址 - 然后
git fetch origin看是否能列出远程分支;再git branch --set-upstream-to=origin/main main绑定跟踪关系
强制推送能用吗?什么时候敢用 --force-with-lease
它比 --force 安全,只在确认远程分支没被别人更新的前提下才覆盖。但绝大多数情况不该碰它——尤其对 main、develop 这类受保护分支,GitHub/GitLab 默认拦截,即使加参数也会被拒绝。
- 仅限私有 feature 分支,且你 100% 确认没人基于它工作
- 执行前必须先
git fetch origin;如果git push --force-with-lease origin main报 “stale info”,说明远程已有新提交——立刻停手,切回pull或rebase - 团队协作中,强制推送等于单方面清空他人劳动,修复成本远高于预防
最容易被忽略的一点:新建仓库时直接 push 失败,往往是因为远程已有文件(如 GitHub 勾选了 “Add a README file”),而你本地是空初始化的。这时必须用 git pull --allow-unrelated-histories origin main,否则 Git 认为两边历史完全无关,拒绝合并。











