Published on

恢复丢弃的 git stash 数据

在开发中我们会经常切换一些分支,而切换时候你本地会有一些更改了的代码,但是这些代码还没有写完整,所以我们一般会进行 git stash save 本地保存一下。 然后等后面代码切换回来之后,再 git stash pop。 这天正常 git stash save 之后,脑袋一抽 命令输成了 git stash clear。当时心中暗道: “md! 坏了”。 平复下后,感觉应该是能找回的,毕竟有 git reflog 这种东西,遂在网上寻找解决方案。

方案1

首先,如果你执行的是 git stash drop 命令,终端会输出这条 stash 的 hash。 你直接 git stash apply {hash} 就可以了。如下图所示:

img

那么直接可以完结撒花了。

方案2

如果你执行的是 git stash clear,那就需要使用 git fsck 命令慢慢找回了。 git fsck 加上 --unreachable 参数,可以显示出所有不可访问的对象。

接下来我执行 git fsck --unreachable,可以看到如下图所示:

img

这么多 commit hash , 关键它还是无序的,我并不知道那个是误删除的,只能一个一个去 git show {hash}

我这里下载了 vscode 插件 Gitlens Inspect。可以在终端 command + 鼠标左键 查看。 一个一个查看,终于找到了它

img

使用下面这条命令可以更直观的看到。

git log --graph --decorate --pretty=oneline --abbrev-commit --all $(git fsck --no-reflogs | grep commit | cut -d' ' -f3)
img

找到了之后,直接 git stash apply {hash} 就可以了,终于可以真正的 完结撒花✿✿ヽ(°▽°)ノ✿了。

什么?你想问我采用了什么方法? 因为我存 stash 的目的就是临时切分支改个bug,当我 clear 之后,我很 慌张 冷静。 上网搜了上面的解决方案略显麻烦,我很幸运,clear之后没有对代码进行其他操作,直接 command + z 就撤销回来了。【狗头】【狗头】【狗头】

最后,一个大的功能还是建议分成小功能定期提交,最后这个大功能可以通过 git rebase -i 合并成一个 commit,这样也更直观一些,并且之前小功能的 commit 也可以在详细信息里看到。 我刚毕业的第一份工作,我的导师就建议我,每天下班最好提交下代码,不是为了检查你的工作量,而是防止电脑磁盘坏掉或者你某天误删除了代码,毕竟你不知道明天和意外哪个先来。