Git 提交代码被拒(Push rejected)超详细图文完整解决方案
个人主页编程的一拳超人⛺️ 欢迎关注点赞 留言 收藏 于高山之巅方见大河奔涌于群峰之上更觉长风浩荡。 ——《人民日报》Git 提交代码被拒Push rejected完整解决方案一、问题现象1.1 错误提示在 IDEA / Git 命令行执行推送操作时出现以下典型报错![rejected]master -master(non-fast-forward)error: failed to push some refs tohttps://github.com/xxx/xxx.githint: Updates were rejected because the tip of your current branch is behind hint: its remote counterpart. Integrate the remote changes(e.g. hint:git pull ...)before pushing again. hint: See theNote about fast-forwardsingit push --helpfordetails.IDEA 中简化提示为Push to origin/master was rejected1.2 典型发生场景场景编号场景描述触发概率场景一远程仓库新建时初始化了 README / LICENSE / .gitignore本地仓库直接推送⭐⭐⭐⭐⭐场景二多人协作时他人已向同一分支提交了代码你本地未拉取最新代码就推送⭐⭐⭐⭐⭐场景三在 GitHub / 码云网页端直接编辑提交过文件导致远程领先于本地⭐⭐⭐⭐场景四本地执行过reset/rebase操作改写了提交历史⭐⭐⭐场景五切换了远程仓库地址新旧仓库提交历史完全无关⭐⭐二、根本原因深度解析2.1 核心原理Git 拒绝推送的本质是「远程分支领先于本地分支」Git 为了防止覆盖他人代码默认只允许fast-forward快进式推送。2.2 图形化讲解为什么会被拒绝mainremoteABC(别人提交的)D(别人提交的)E(我本地提交的)图解说明本地分支停在提交B你在本地新增了提交E但远程分支已经往前走了有别人提交的C和D此时直接 pushGit 不知道该把E放在哪里拒绝合并两个分叉的历史必须先把远程的C、D拉到本地合并后才能推送2.3 两种拒绝类型对比拒绝类型报错关键词原因严重程度non-fast-forwardnon-fast-forward远程有新提交本地落后普通unrelated historiesrefusing to merge unrelated histories两个仓库完全没有共同祖先较严重三、解决方案大全按推荐优先级排序方案一拉取合并后推送推荐90% 场景适用适用场景普通代码冲突、远程有新提交场景一、二、三操作步骤无冲突有冲突1. 拉取远程代码2. 自动合并是否有冲突?3. 直接推送4. 手动解决冲突5. git add git commit命令行执行# 第一步拉取远程最新代码并自动合并gitpull origin master# 如果报 unrelated histories 错误加上参数新建仓库首次合并用gitpull origin master --allow-unrelated-histories# 第二步合并成功后重新推送gitpush origin masterIDEA 图形化操作菜单栏 →Git→Pull选择对应分支点击Pull若无冲突再次点击Push即可若有冲突在弹窗中选择Merge手动解决后提交方案二变基推送更干净的提交历史进阶推荐适用场景希望保持提交历史一条直线不产生多余的 merge 提交操作原理mainABC(远程新增)D(远程新增)E(我的提交变基后)变基后你的提交会「移动」到远程最新提交的后面历史呈一条干净的直线。命令行执行# 第一步拉取并变基把你的提交接到最新代码后面gitpull--rebaseorigin master# 第二步推送此时就是 fast-forward 了gitpush origin master注意如果变基过程中出现冲突解决冲突后执行git add .git rebase --continue不要 commit。方案三强制推送慎用仅单人开发分支适用场景你确认本地代码是最新正确版本愿意覆盖远程历史⚠️ 风险警告强制推送会直接覆盖远程提交历史多人协作的公共分支绝对禁止使用会导致其他人代码丢失。仅适用于你一个人用的分支。命令行执行# 普通强制推送gitpush-forigin master# 更安全的强制推送远程有新提交时会拒绝防止误覆盖gitpush --force-with-lease origin master方案四重新 Clone 大法兜底方案适用场景仓库已经乱了、搞不清状态、新手快速解决问题操作流程1. 备份本地修改的代码2. 删除本地旧仓库3. 重新 Clone 远程仓库4. 把修改的代码复制进去5. 正常 add / commit / push具体步骤把本地修改过的文件单独复制一份备份删除本地整个项目文件夹重新克隆远程仓库gitclone https://github.com/xxx/xxx.git把备份的修改文件覆盖进去正常提交推送gitadd.gitcommit-m提交说明gitpush origin master方案五新建分支迂回法不破坏主分支适用场景主分支情况复杂先把代码推到新分支再提 PR# 1. 基于当前代码新建一个分支gitcheckout-bmy-feature# 2. 推送到远程新分支新分支没有历史不会被拒gitpush origin my-feature推送成功后在网页端发起 Pull Request 合并到主分支即可。四、首次创建仓库被拒的专项说明4.1 为什么新建仓库也会被拒很多人在 GitHub 新建仓库时勾选了「Add a README file」导致远程仓库有一个初始提交而本地仓库是git init新建的两边完全没有共同祖先Git 认为是两个不相干的仓库。4.2 图解两个无关的仓库远程仓库本地仓库没有任何关联提交1提交2README初始提交4.3 标准解决命令# 必须加 --allow-unrelated-histories 才能合并两个无关仓库gitpull origin master --allow-unrelated-histories# 合并后正常推送gitpush origin master五、冲突解决指南pull 之后常见问题5.1 什么是冲突当同一行代码本地和远程都被修改过时Git 无法判断该保留哪个就会标记冲突需要人工决定。5.2 冲突文件长什么样 HEAD 这是我本地写的代码 这是远程仓库的代码 origin/master HEAD到之间你的本地版本到之间远程版本手动删除标记符号保留正确的代码即可5.3 解决冲突后操作# 1. 手动编辑完冲突文件后标记为已解决gitadd冲突文件名# 2. 完成合并提交gitcommit-m合并远程代码解决冲突# 3. 推送gitpush origin master六、预防措施与最佳实践6.1 日常开发好习惯开始写代码前先 git pull 拉取最新编写代码提交前再 pull 一次commit push6.2 最佳实践清单✅写代码前先 pull每天开工第一件事先拉取最新代码✅小步提交不要攒一大堆代码一次性提交频繁提交冲突概率更低✅使用功能分支不在 master 上直接开发新建 feature 分支开发✅推送前先 pull养成 push 之前先 pull 的习惯❌不要强制推送主分支-f是多人协作的大忌❌不要随意 reset 公共分支改写公共历史会影响所有人6.3 新建仓库的正确姿势方式一推荐先建远程再克隆GitHub 上创建仓库勾选 README本地直接git clone克隆下来在克隆的文件夹里写代码→ 永远不会出现 unrelated histories 问题方式二本地先有代码再关联远程远程创建空仓库不要勾选README本地执行gitinitgitadd.gitcommit-m初始提交gitremoteaddorigin 仓库地址gitpush-uorigin master七、排错速查表报错信息原因首选方案non-fast-forward远程有新提交本地落后git pull后再 pushrefusing to merge unrelated histories两个仓库无共同祖先git pull --allow-unrelated-historiesAuthentication failed账号密码/Token 错误检查凭据更新 TokenPermission denied没有仓库推送权限联系管理员加权限fetch first远程有更新需先拉取先git fetch或git pull八、总结解决思路流程图是否是否是否有无Push 被拒绝是第一次推送吗?git pull --allow-unrelated-histories多人协作分支?git pull 合并远程代码确认本地是最新?git push --force-with-lease有冲突吗?手动解决冲突 → add → commit重新 git push推送成功一句话口诀被拒先 pull合并再推送新建仓库加参数主分支别强推。