提交代码时,新代码没保存到暂存区就拉取合并代码并且提交仓库了,发现问题以后只能说是万念俱灰,就差上楼顶了。抱着试试看的想法尝试git恢复,还真找到并且恢复了,记录一下自救过程
我是git stash save失败,然后直接就git add .保存到本地
此时还是正确的,git stash list显示我的暂存区里有两个stash,然后我就脑残的推送到远程仓库了。推送完发现没有变化回头一看发现本地代码没有保存就被合并掉了。下面是我的一些尝试操作
0. 如果pop时的命令输出还存在的话
在gut stash pop的时候,git会输出类似Dropped refs/stash@{0}(bf211a583bb8bf66fe4bc86a7394c0fdced39310)的结果,使用git stash apply bf211a583bb8bf66fe4bc86a7394c0fdced39310就可以恢复了
1. git log
git log能帮你找到某分支之前所有的提交记录, 然后就可以根据commit记录恢复到某个提交状态
2. git stash list
前提是你没有git stash clear,否则git stash list是空的
找到自己之前的暂存代码后,git stash apply stash@{id}, 恢复指定id的stash内容,同时不会删除恢复的缓存条目,使用git stash pop恢复最近的缓存到当前文件中,并且删除恢复的缓存条目
3. git fsck --unreachable
使用 git stash pop 其实并没有真正地将文件删掉的,而是删除引用而已,因此我们可以使用 git fsck 命令进行找回,搭配参数--unreachable,让 git-fsck 显示出所有不可访问的对象。
然后还是老一套,使用 git show 一个个对输出的对象进行查看
很明显可以看到输出,简单确认后你可以判断这个文件是不是你误删的,找到后进行备份转储。
git show 302063e31742cbce7c5fdb917edf520183154cc1 > D:\recovery\backup.txt
该命令可以将显示的内容输出到指定的路径
值得一提
在使用 git fsck –unreachable 命令输出的很多文件里面,有很多是带有 commit 和 tree 的标识的,这些可以使用git stash apply加标记号进行找回。而blob的文件是只能手动拷贝的,或者像上面一样使用> 输出到指定的路径去
4. git fsck --lost-found
我的感受来说,上面的git fsck --unreachable是很强大,但是返回的结果太多了,并且需要一个一个查看寻找,给我的第一反应就是这得找到什么时候。因此我就又尝试了别的方法git fsck --lost-found
使用步骤与git fsck –unreachable 相同,都是通过git show查看id,在找到误删的代码之后,还是通过git stash apply {id}恢复代码,也可以通过git merge {id}还原,这样就还原了你的git stash drop和git stash clear的内容
总结
一定要保存代码先!!!!