提交代码时,新代码没保存到暂存区就拉取合并代码并且提交仓库了,发现问题以后只能说是万念俱灰,就差上楼顶了。抱着试试看的想法尝试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
的内容
总结
一定要保存代码先!!!!