记git stash误删除后的一次恢复

我想把来龙去脉都好好理理。事情是这样的:

今天更改了一些文件,现在临时需要修一个其他分支的bug。临走前看了一眼自己今天的工作量。

记git stash误删除后的一次恢复_第1张图片

这里写图片描述
嗯现在新建分支去修bug
万恶的起源在这里。。。
在今天的工作量中我新建了几个文件并且移动了几个文件,未add的文件不阻止切换分支,并且在所有分支上都显示为未跟踪
记git stash误删除后的一次恢复_第2张图片
我基于以前都是用gitignore和git add .这两个命令来进行文件跟踪,所以下意识的直接来了一句这个。。。。
记git stash误删除后的一次恢复_第3张图片
这下麻烦了。。。所以要把它们从刚刚的add中删了,

为在暂存库里删除而不是直接删除文件git rm 要加–cached参数
记git stash误删除后的一次恢复_第4张图片
这里写图片描述
这两句命令完成了上面的任务

好吧,既然这样,我就想着回到我正在工作的分支上把它们add进去吧。
这里写图片描述

其实这一步运行了也不要慌,git提示了dropped的引用,此时只需要git merge 3658c5e2f1bbf67b2ec70bdfe0b3a067e50bdadd就可以恢复了
记git stash误删除后的一次恢复_第5张图片

然而我当时接着又慌了,慌乱之中又运行了一次傻傻的命令:
这里写图片描述

我当时并没有直接去查命令行
于是就去网上搜,有一个确实行之有效的博客:
https://www.cnblogs.com/exmyth/p/6213129.html
这个博客提出的方法确实可以使用

原理就是
1、使用git的fsck功能参数用–lost-found(呃今天就就懂了这一个)
git fsck –lost-found
这个命令的功能是找出“悬空的提交”。
git中把commit删了后,并不是真正的删除,而是变成了悬空对象(dangling commit)。我们只要把把这悬空对象(dangling commit)找出来
用git rebase也好,用git merge也行就能把它们给恢复。
这里最重要的一个命令就是:git fsck –lost-found
(参考自http://blog.csdn.net/wh_19910525/article/details/7842503)。
而刚刚运行的git stash drop其实就是产生了个悬空对象。只需想办法把他弄回来就好
2、上面也提了使用git merge合并这个悬空对象。当然如果直接知道引用的话,把drop的引用merge回来就行了。而第一篇文章案例与我的区别就是,我能找到引用,而那位同志没找到。所以他只能通过git fsck –lost-found来查找引用并且恢复。这个命令还是挺坑,我当时也不知道,跟着这篇文章也去翻了一下,一通乱找还却第二个引用没找到。。。后来回去好好看看我干了些啥事才弄清楚情况。

现在代码已经恢复完成~~下来就要去切分支改bug了。并且,在这之前还要提醒自己:恢复stash不是drop是pop。我还有一个想法,刚刚我drop了两次,所以merge了两次,我想把代码留着,这两个提交干掉,这也是我接下来的工作。

感觉今晚收获挺大,对git又有了进一步了解。所以写出来与大家共享。


我随便一搜就把接下来的工作干完了。。。
https://www.cnblogs.com/lyy-2016/p/6509707.html
就是使用git reset –mixed 加上commit的码。只是在版本库中回退,而不更改当前代码,也就是说你打开文件后还是现在的样子,但版本库认为你已经回到了老版本,并且做了很多改动到现在的样子。hard就是回退时把当前文件系统中的代码也给回退了也就是说你打开文件后会变成那次提交时的样子。
soft我一时半会没搞清楚。先留着吧,目前是够用了。


总结

1、用git误删了不要慌,即使是stash这种保护机制最低的特性,也是有办法恢复的。
2、恢复方法就是回去看你drop的索引,用git merge合并就行了
3、别把drop当成pop。

你可能感兴趣的:(记git stash误删除后的一次恢复)