Git 代码删了没保存?教你保命100招

685 阅读3分钟

提交代码时,新代码没保存到暂存区就拉取合并代码并且提交仓库了,发现问题以后只能说是万念俱灰,就差上楼顶了。抱着试试看的想法尝试git恢复,还真找到并且恢复了,记录一下自救过程

我是git stash save失败,然后直接就git add .保存到本地

image.png

1672062667650.png

此时还是正确的,git stash list显示我的暂存区里有两个stash,然后我就脑残的推送到远程仓库了。推送完发现没有变化回头一看发现本地代码没有保存就被合并掉了。下面是我的一些尝试操作

0. 如果pop时的命令输出还存在的话

gut stash pop的时候,git会输出类似Dropped refs/stash@{0}(bf211a583bb8bf66fe4bc86a7394c0fdced39310)的结果,使用git stash apply bf211a583bb8bf66fe4bc86a7394c0fdced39310就可以恢复了

1. git log

1672063199214.png

git log能帮你找到某分支之前所有的提交记录, 然后就可以根据commit记录恢复到某个提交状态

2. git stash list

前提是你没有git stash clear,否则git stash list是空的

1672063499406.png

找到自己之前的暂存代码后,git stash apply stash@{id}, 恢复指定id的stash内容,同时不会删除恢复的缓存条目,使用git stash pop恢复最近的缓存到当前文件中,并且删除恢复的缓存条目

3. git fsck --unreachable

使用 git stash pop 其实并没有真正地将文件删掉的,而是删除引用而已,因此我们可以使用 git fsck 命令进行找回,搭配参数--unreachable,让 git-fsck 显示出所有不可访问的对象。

1672063817240.png

然后还是老一套,使用 git show 一个个对输出的对象进行查看

1672063875040.png 很明显可以看到输出,简单确认后你可以判断这个文件是不是你误删的,找到后进行备份转储。

git show 302063e31742cbce7c5fdb917edf520183154cc1 > D:\recovery\backup.txt

该命令可以将显示的内容输出到指定的路径

值得一提

在使用 git fsck –unreachable 命令输出的很多文件里面,有很多是带有 committree 的标识的,这些可以使用git stash apply加标记号进行找回。而blob的文件是只能手动拷贝的,或者像上面一样使用> 输出到指定的路径去

4. git fsck --lost-found

我的感受来说,上面的git fsck --unreachable是很强大,但是返回的结果太多了,并且需要一个一个查看寻找,给我的第一反应就是这得找到什么时候。因此我就又尝试了别的方法git fsck --lost-found

1672101652527.png

使用步骤与git fsck –unreachable 相同,都是通过git show查看id,在找到误删的代码之后,还是通过git stash apply {id}恢复代码,也可以通过git merge {id}还原,这样就还原了你的git stash dropgit stash clear的内容

总结

一定要保存代码先!!!!