本地分支与远程分支分叉了(diverged)怎么办

分叉说明两边都有对方没有的提交。查看分叉情况 git log --left-right --oneline main...origin/main;合并用 git pull(merge)或 git pull --rebase;确定远程为准则 git reset --hard origin/main。

最佳实践
Git 分支协作与合并示意

"分叉"= 你本地有未推送的提交,同时远程也有你没有的提交。 两条路合并分歧:git pull(merge 出合并提交)或 git pull --rebase(把你的提交挪到远程提交之后,历史线性)。如果确定远程是对的(比如你的本地改动是垃圾),git reset --hard origin/main 直接对齐。

先看清分叉了什么

git fetch
git log --left-right --oneline main...origin/main
# < 开头:本地独有提交
# > 开头:远程独有提交

方案一:merge 合并(保留分叉事实)

git pull origin main       # 或 git merge origin/main
# 解决冲突后 commit 推送

历史出现一个合并提交,真实反映"两条线汇合"。

方案二:rebase(历史线性)

git pull --rebase origin main
git push

你的本地提交被重放到远程提交之后,像是一直基于最新代码开发。个人分支推荐;注意已推送过的分支 rebase 后需强推。

方案三:以一边为准

git reset --hard origin/main    # 远程为准,丢弃本地
git push --force-with-lease     # 本地为准,覆盖远程(危险!)

常见问题(FAQ)

Q:为什么会分叉?

常见原因:在两台机器上先后提交、网页端改了文件本地也改了、amend/rebase 改写了已推送的提交后又 pull。

Q:pull 时怎么默认用 rebase?

git config --global pull.rebase true。想严格保守用 pull.ff only(非快进就报错,逼你手动选策略)。

Q:强推覆盖了同事的提交怎么办?

同事的提交还在他本地:让他 git push --force-with-lease 推回,或 reflog 恢复。这是"覆盖远程"方案的危险所在。

参考资料

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台