Git拉取后如何恢复拉取前的本地版本?
解决Git推送失败+恢复本地修改的步骤
一、先理清你遇到的问题
- 推送被拒原因:远程
master分支存在你本地没有的新提交(可能是其他人或你在其他终端推送的),你的本地分支版本落后于远程。Git为了防止直接推送覆盖远程的新内容,就会抛出non-fast-forward错误,要求你先整合远程的更改。 - pull后修改丢失+reset的影响:你执行
git pull后,Git自动合并了远程更新,导致本地修改被合并到新提交中(或未提交的修改被覆盖);后续的git reset改变了分支指针,但Git的reflog会记录所有操作痕迹,我们可以通过它恢复到之前的状态。
二、恢复到pull前的版本
查看所有操作历史,定位pull之前的提交:
git reflog输出示例:
abc1234 HEAD@{0}: reset: moving to HEAD~1 def5678 HEAD@{1}: pull origin master: Merge made by the 'ort' strategy. ghi9012 HEAD@{2}: commit: 你的本地修改提交信息这里的
ghi9012(或HEAD@{2})就是你执行git pull前的最后一次本地提交,记下这个哈希值。恢复到该版本:
git reset --hard ghi9012执行后,本地仓库和工作区就会回到pull前的状态,之前的本地修改会恢复。
三、正确处理后续推送
恢复后,用变基方式整合远程更新,避免多余的合并提交:
- 拉取远程最新内容并变基:
这个命令会把你的本地提交“挪”到远程最新提交的后面,相当于在远程的基础上重新提交你的修改。git pull --rebase origin master - 如果遇到冲突,Git会提示你解决,解决冲突后执行:
(若想放弃变基,执行git add . git rebase --continuegit rebase --abort) - 变基完成后,推送本地提交:
git push origin master
注意事项
git reset --hard会清除当前工作区和暂存区的所有改动,执行前务必确认要恢复的版本正确。- 以后如果有未提交的本地修改,先执行
git stash暂存,拉取完成后再用git stash pop恢复,能有效避免修改被覆盖。
内容的提问来源于stack exchange,提问作者Sebb
相关产品推荐
相关产品推荐

