合并本地Git提交后无法推送至远程,该如何处理?
解决改写提交历史后的推送问题
嘿,这个场景我太熟悉了——改写本地提交历史后,远程和本地的分支历史岔开了,还遇上远程比本地多提交的情况,别慌,分两种情况来处理就行:
情况1:远程没新增提交,只是你改了本地历史
这种情况就是你做完git rebase -i HEAD~3把3个提交合并成1个后,远程分支还是你当初同步时的状态,或者还保留着你原来的3个提交。这时候因为你改写了本地历史,普通的git push会被拒绝,得用强制推送来让远程和你的本地历史对齐:
- 直接执行强制推送命令(把
<你的分支名>换成实际分支,比如main):
git push -f origin <你的分支名>
⚠️ 划重点!如果这个分支是多人一起用的,一定要提前跟队友说一声!要是有人已经基于你原来的3个提交写了新代码,你强制推送后他们的本地代码会和远程冲突,处理起来挺麻烦的。
要是想更安全一点,可以用--force-with-lease替代-f,它会检查远程有没有你不知道的新提交,有的话就会拒绝推送,避免误删别人的工作:
git push --force-with-lease origin <你的分支名>
情况2:远程确实新增了2个提交,本地落后了
如果在你整理本地提交的这段时间里,队友往远程推了新提交,导致你的本地分支比远程落后2个,这时候得先把远程的新提交整合到你的本地分支里,而且要保持历史线性:
- 先拉取远程的最新代码(这一步不会直接合并到你的本地分支,只是更新本地的远程分支镜像):
git fetch origin
- 把你的本地分支变基到远程分支的最新版本上,这样你的合并后的单个提交会被放到远程新提交的后面,整个历史还是一条线:
git rebase origin/<你的分支名>
- 要是变基过程中碰到冲突,别慌,手动修改冲突的文件,然后执行:
git add . git rebase --continue
重复这个步骤,直到变基完成为止。
- 变基完成后,你的本地分支就同时包含了远程的新提交和你合并后的单个提交,这时候直接普通推送就ok了:
git push origin <你的分支名>
小建议
以后要是想整理提交历史再推送,尽量在自己的个人特性分支上操作,别直接碰主分支(比如main、master),这样就算搞砸了也不会影响整个团队的代码~
内容的提问来源于stack exchange,提问作者david
相关产品推荐
相关产品推荐

