本地分支与远程分支分叉了(diverged)怎么办
分叉说明两边都有对方没有的提交。查看分叉情况 git log --left-right --oneline main...origin/main;合并用 git pull(merge)或 git pull --rebase;确定远程为准则 git reset --hard origin/main。
"分叉"= 你本地有未推送的提交,同时远程也有你没有的提交。 两条路合并分歧: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 恢复。这是"覆盖远程"方案的危险所在。