如何回退远程仓库最后一次提交但保留本地未就绪提交?
场景1:远程分支是你个人使用的(无其他协作人员)
这种情况可以直接强制回退远程分支,同时保留本地未推送的提交,步骤如下:
临时保存本地未推送的提交(防止操作中丢失)
假设你当前在main分支,本地有一个未推送的提交,先创建一个临时分支保存它:git branch temp-save回退本地分支到远程需要回到的状态
远程的最后一次提交就是你之前推上去的那次,现在要回退到它的上一个版本,执行:git reset --hard HEAD~1这时候你的本地
main分支就回到了远程最后一次提交之前的状态。强制推送覆盖远程分支
把本地回退后的分支推送到远程,覆盖掉远程的最后一次提交:git push -f origin main注意:
-f是强制推送,只有在分支是你个人独用的时候才建议这么做,不然会打乱其他协作人员的工作。恢复本地未推送的提交
现在把之前临时保存的提交cherry-pick回当前分支:git cherry-pick temp-save完成后你可以删除临时分支:
git branch -d temp-save这时候你的本地
main分支就保留了那个未就绪的提交,而远程已经回退到了之前的版本。
场景2:远程分支是多人协作的(禁止强制推送)
如果这个远程分支还有其他人在使用,强制推送会引发问题,这时候应该用revert来撤销远程的最后一次提交,步骤如下:
临时保存本地未推送的提交
同样先创建临时分支保存本地的未就绪提交:git branch temp-save拉取远程最新状态并对齐本地分支
把本地分支重置到和远程完全一致的状态:git reset --hard origin/main创建撤销提交并推送到远程
执行revert命令,撤销远程的最后一次提交:git revert HEAD这时候会弹出编辑器让你填写撤销提交的说明,保存退出即可。然后把这个撤销提交推送到远程:
git push origin main这种方式是通过新增一个提交来抵消之前的改动,不会覆盖其他人的提交记录,对协作分支更友好。
恢复本地未推送的提交
最后把临时分支的提交cherry-pick回来:git cherry-pick temp-save再删除临时分支:
git branch -d temp-save现在本地依然保留着那个未就绪的提交,远程也完成了回退。
额外小提示
- 操作前最好用
git log --oneline查看提交历史,确认远程和本地的提交顺序,避免搞错要回退的版本。 - 如果本地还有未commit的改动,记得先用
git stash暂存,操作完再用git stash pop恢复。
内容的提问来源于stack exchange,提问作者Yassine Younes

