误合并超前branch与过时本地master并推送,如何回退恢复修改?
嘿,这种踩坑的经历我太熟了!别慌,咱们一步步把问题掰扯清楚,先把同事的提交找回来,再把你的分支和master正确合并,最后再给你几个避免下次掉坑的小技巧:
紧急修复:找回被覆盖的同事提交
Git其实不会轻易删掉提交,只是把master分支的指针移到了你合并后的版本上,咱们先把指针移回去:
查看本地master的操作日志,找到同事提交还存在的那个版本哈希:
git reflog show master你会看到一串类似
abc123 HEAD@{2}: merge your-branch: Fast-forward的记录,找到合并前指向同事最后提交的那条记录,记下它的哈希值(比如def456)。把本地master切回那个正确的版本:
git checkout master git reset --hard def456注意
--hard会清空当前master分支的未提交修改,如果有未保存的内容,先 stash 起来:git stash,之后再用git stash pop恢复。把修复后的master推回远程,这里一定要用安全的强制推送:
git push origin master --force-with-lease千万不要用直接的
--force,--force-with-lease会检查远程master有没有其他人在你之后又做了修改,能避免误覆盖更多内容。
正确合并你的开发分支到最新master
现在master已经恢复正常了,咱们重新把你的分支和最新的master合并:
- 拉取远程最新的master到本地:
git checkout master git pull origin master - 切回你的开发分支:
git checkout your-feature-branch - 选择合适的方式合并master内容:
- 如果你想保持提交历史整洁,用rebase(会把你的提交放在master最新提交的后面):
遇到冲突就修改文件,然后执行git rebase mastergit add .和git rebase --continue,直到完成。 - 如果不想改动提交历史,用普通merge:
git merge master
- 如果你想保持提交历史整洁,用rebase(会把你的提交放在master最新提交的后面):
- 最后把你的分支推到远程(如果之前已经推过,可能需要
git push origin your-feature-branch --force-with-lease),之后再正常发起合并到master的操作就行。
未推送时的撤销方法(给下次备用)
如果下次你只是合并了过时的本地master,但还没推到远程,那处理起来更简单:
直接撤销这次合并操作,回到合并前的状态:
git reset --hard HEAD~1
然后拉取最新master,重新合并就好。
避免再踩坑的小习惯
- 每次准备合并或推送master之前,先执行
git pull origin master拉取最新代码,养成肌肉记忆! - 尽量不要直接在master分支上开发,用独立的feature分支,合并前先同步最新master。
- 可以给Git加个pre-push钩子,检查本地分支是否和远程同步,避免误推过时版本。
内容的提问来源于stack exchange,提问作者J S
相关产品推荐
相关产品推荐

