git实战问题(6)git push 时发现分支已被更新,push失败了怎么办
当 git push
失败并提示当前分支已被其他人更新时(例如报错 ! [rejected] branch-name -> branch-name (non-fast-forward)
),说明远程分支有新的提交,而你的本地分支尚未包含这些更新。以下是标准解决流程:
1. 拉取远程最新代码
先拉取远程分支的最新变更到本地:
git pull
这相当于 git fetch + git merge
,会自动尝试合并远程和本地的修改。
2. 处理可能的合并冲突
如果 git pull
后出现冲突(Conflict):
- 按提示手动解决冲突文件(参考上一问题的步骤)。
- 用
git add <file>
标记冲突已解决。 - 完成合并提交:
git commit -m "Merge remote changes"
3. 更推荐的方式:使用 rebase
代替 merge
如果不想生成多余的合并提交,可以用 rebase
保持提交历史线性:
git pull --rebase # 等同于 git fetch + git rebase
- 如果遇到冲突:
- 解决冲突后执行
git add <file>
。 - 继续变基:
git rebase --continue
- 若想放弃变基:
git rebase --abort
- 解决冲突后执行
4. 重新推送代码
解决冲突并合并/变基后,再次推送:
git push
5. 强制推送(慎用!)
如果确定远程的新提交无关紧要(例如仅自己使用的临时分支),可强制覆盖远程分支:
git push --force
# 或更安全的选项(避免覆盖他人可能的提交):
git push --force-with-lease
警告:强制推送会覆盖远程历史,仅限私有分支或团队协商后使用!
关键原理
- Git 默认拒绝非快进式推送(
non-fast-forward
),要求本地包含远程的所有提交。 git pull --rebase
比直接git pull
更优雅,能避免多余的合并提交。
预防措施
- 推送前总是先拉取最新代码:
git pull --rebase git push
- 协作分支避免直接强制推送(
--force
)。 - 使用功能分支开发,通过 PR/Merge Request 合并代码。
通过以上步骤,你可以在保证代码安全的前提下解决推送冲突问题。