报错“rejected — non-fast-forward”需先git pull --rebase同步远程更新并解决冲突,再推送;若确需强推私有分支,用git push --force-with-lease;多人主分支禁用--force。

git push 报错 “rejected — non-fast-forward” 怎么办
这是本地分支落后于远程分支时最常遇到的拒绝推送,本质是 Git 拒绝覆盖别人已提交的历史。
常见场景:别人先 git push 了新提交,你本地没拉取就直接推;或者你用 git commit --amend 或 git rebase 改写了历史后硬推。
- 先执行
git pull --rebase(推荐)或git pull,把远程更新合入本地,解决冲突后再推 - 确认自己改写历史是故意的(比如还没共享的私有分支),可用
git push --force-with-lease安全强推(比--force更安全,不会覆盖他人新提交) - 绝对避免在多人协作的主分支(如
main、develop)上用--force
第一次 push 时为什么总要加 -u 参数
-u(即 --set-upstream)不是必须的,但不加就会报 “No upstream configured”,后续每次 push 都得写全分支名。
它只做一件事:把当前本地分支和远程同名分支建立追踪关系。之后 git push 和 git pull 就能省略参数。
- 首次推送建议写成:
git push -u origin main(假设远程叫origin,分支叫main) - 如果远程仓库刚建好、空无一物,而你本地已有提交,Git 会拒绝推送——先用
git push -u origin main强制创建远程分支 - 别用
git push -u origin master除非你确定远程接受master;现在主流平台默认用main
远程地址填错了,怎么换
推送失败提示 “Could not resolve host” 或 “Permission denied (publickey)” 时,大概率是远程 URL 不对或权限没配好。
使用约定式提交(Conventional Commits)从 Git 历史记录中生成结构化变更日志,支持多种格式、AI 增强型描述以及可自定义的范围……
检查和修改分两步:先看,再改。
- 查当前地址:
git remote get-url origin - 改成 HTTPS 地址:
git remote set-url origin https://github.com/user/repo.git - 改成 SSH 地址:
git remote set-url origin git@github.com:user/repo.git - 如果之前用 HTTPS 推送频繁输密码,换成 SSH 后记得配好
~/.ssh/id_rsa.pub公钥
push 后发现漏文件,还能补吗
可以,但得看“补”的定义:是追加新提交,还是把漏掉的文件塞进上一次提交里。
如果刚推完、没人基于它继续开发,用 git commit --amend 最干净;否则老老实实新增一次提交更安全。
- 没推过或刚推完立刻补:
git add missing-file.txt→git commit --amend --no-edit→git push --force-with-lease - 已有人基于你的提交工作,别改历史:直接
git add+git commit+git push -
--amend不会保留原提交的哈希值,所有依赖它的引用都会失效——这点很容易被忽略
改历史就像动公共白板上的字,擦之前得确认没人正照着抄。

















