是不是有过这种经历?手一抖敲了 git push -f,刷新远程仓库一看,之前的代码全没了,瞬间冷汗直冒?就像新手想快速搞定代码提交却捅了篓子,急得团团转。别慌,小编之前也犯过这错,摸索出几个能把代码找回来的法子,今天就手把手教你,3 步就能搞定,一起往下看吧!
先说说:代码为啥会丢?
用 git push -f 的时候,Git 会用你本地的代码强行覆盖远程仓库。要是你本地代码比远程的旧,或者漏了别人的提交,一推就把新的给覆盖了,看起来就像代码丢了。但其实 Git 这东西挺聪明的,一般不会真把代码彻底删了,只是藏起来了,咱们得想办法把它找出来。
3 步快速恢复法,亲测有效
第一步:找到丢失的代码版本号
首先得知道丢的代码是哪个版本。打开命令行,敲这个命令:
git reflog
这个命令能列出你本地所有的操作记录,包括每次提交、切换分支啥的。找一找在你执行 git push -f 之前,最后一次正常提交的记录,前面会有一长串字母加数字的字符串,那就是版本号,记下来(不用全记,前 7 位就行)。
举个例子,你可能会看到这样的记录:
a1b2c3d (HEAD -> main) HEAD@{0}: push -f
e4f5g6h HEAD@{1}: commit: 修复了登录 bug
那 e4f5g6h 就是你要找的版本号,因为它是 push -f 之前的最后一次提交。
第二步:用版本号恢复代码
找到版本号后,敲这个命令创建一个新分支,把丢失的代码恢复到这个分支里:
git checkout -b 恢复的分支名 版本号
比如:
git checkout -b recover-branch e4f5g6h
这样就新建了一个叫 recover-branch 的分支,里面就是你丢失的代码了,赶紧看看是不是对的。
第三步:把恢复的代码推回远程
确认代码没问题,就可以把这个分支推到远程仓库,再合并回主分支:
git push origin 恢复的分支名然后去 GitHub 或者 GitLab 上,用这个恢复的分支给主分支发个合并请求,合并完代码就回来了。
不同情况,选对方法更省事
情况 | 推荐方法 | 难度 | 优点 |
---|---|---|---|
刚丢没多久,本地有记录 | 用 reflog 找版本号恢复 | 简单 | 速度快,不用联网 |
本地记录丢了,远程有其他分支 | 从其他分支拉取 | 中等 | 适合多人协作时用 |
彻底找不到版本号 | 联系仓库管理员查备份 | 稍难 | 最后一招,成功率高 |
有人可能会问,要是 reflog 里没找到记录咋办?那可能是你清理过本地记录,这时候可以试试 git log origin / 你的分支名,看看远程仓库有没有残留的记录,有时候能找到意外惊喜。
这些坑,恢复的时候别再踩了
- 别再用 git push -f 了!恢复代码的时候要是再强行推,可能会把新的记录也搞丢,用普通的 git push 就行。
- 恢复后先检查代码!合并回主分支前,一定要看看恢复的代码对不对,别把错的又推上去了。
- 多人协作时多沟通!要是你覆盖的是同事的代码,恢复后最好跟人家说一声,免得两边代码又冲突。
小编觉得,Git 这东西虽然有时候让人头疼,但只要知道它的脾气,出了问题也不怕。平时用 git push -f 一定要三思,非用不可的话,先备份个分支,或者跟同事打个招呼。真丢了代码也别慌,按这几步来,大概率能找回来。
希望这些方法能帮到你,要是你有其他恢复代码的妙招,欢迎在评论区分享,让大家都学学~