前言
存档区的相关内容前面有介绍,他就是用来存储暂时不想提交到git的修改,但是又不想在工作区显示,这时我们就可以通过git stash命令对其进行存档,然后在需要的时候再进行恢复;
但是有时候我们脑子一热,手一抖,就用git stash drop
命令对存档区的内容进行了删除;
此时还可以亡羊补牢,为时不晚;
但是如果用git stash clear
命令进行了清空操作,那么就无力回天了;
今天我们要介绍的就是通过git stash drop
命令进行的误删除操作,该怎么恢复;
目录
- 情景复现
- 简单恢复
- 麻烦一点的恢复
正文
1. 情景复现
下面我们来演示下误删除的操作流程;
1. 修改文件:
假设当前的git项目有一个a.txt文件,我们先修改这个文件:
$ vim a.txt
然后查看改动:git status
$ git status
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: a.txt
no changes added to commit (use "git add" and/or "git commit -a")
2. 存档:
接下来我们进行存档操作,将现有的改动记录隐藏起来:
$ git stash push -m "update a.txt"
Saved working directory and index state On master: update a.txt
查看存档记录:
$ git stash list
stash@{0}: On master: update a.txt
3. 误删:
接下来我们就进行误删操作:
$ git stash drop
Dropped refs/stash@{0} (82ea4fceac217205fff3aacd904d6b1491b46d3c)
可以看到,对应的存档记录被丢弃;
2. 简单恢复
如果在误删除之后,我们立即发现不对劲(命令行窗口还在),那么此时进行恢复还是比较简单的;
先查看刚才删除的记录:
$ git stash drop
Dropped refs/stash@{0} (427a488418a2fbe909fe7f6064c1cf120cfbd3a5)
再通过git show 查看具体的修改记录:
$ git show 427a4
commit 427a488418a2fbe909fe7f6064c1cf120cfbd3a5
Merge: e6fca5b e27d264
Author: jalon2015 <1121263265@qq.com>
Date: Wed Jan 26 11:48:44 2022 +0800
On master: update a.txt
diff --cc a.txt
index 7d092cb,7d092cb..554ed87
--- a/a.txt
+++ b/a.txt
@@@ -1,5 -1,5 +1,1 @@@
--12345
++54321
可以看到,这条记录就是刚才误删的,通过更新备注和修改内容来判断;
接下来,就可以通过git stash apply
进行恢复:
$ git stash apply 427a4
On branch master
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: a.txt
no changes added to commit (use "git add" and/or "git commit -a")
这里虽然用的是git stash apply,但实际上存档区还是空的,因为这里的恢复是将427a4这个记录恢复到工作区,并没有恢复到存档区
3. 麻烦一点的恢复
如果误删后,关闭了窗口,那么我们就忘记了刚才的删除记录;
此时就需要借助另一个命令来查找删除记录:git fsck --lost-found
$ git fsck --lost-found
Checking object directories: 100% (256/256), done.
dangling commit 427a488418a2fbe909fe7f6064c1cf120cfbd3a5
可以看到更上面一样的id: 427a488418a2fbe909fe7f6064c1cf120cfbd3a5
后面的恢复方法同上,就是git show查看具体的修改内容,git stash apply 427a4进行恢复;
git fsck 这个命令是用来验证数据库中对象的连通性和有效性,简单一点来说,就是可以查看被删除的记录;
这里的删除记录不止是存档区被删除的记录,也包括其他的删除记录,比如删除的commit记录等
这里还有一个相似的选项 --unreachable
,我们先简单介绍下这两个命令的区别:
-
--unreachable:打印不可达的对象
-
--lost-found:打印悬空的对象,属于不可达对象的子集
下面我们用图来解释下:
C--D--E <-- branch-a
/
A--B--F---G--H <-- branch-b
现在假设我们把分支a剥离出来,那么此时CDE都是不可达的,但是只有E是悬空的,因为C和D都有其他对象引用他们
不可达对象:没有其他对象指向他们;如果指向他们的对象是不可达的,那么被指向的对象还是不可达
悬空对象:没有其他对象指向他们;比如上面的E
总结
如果是git stash drop
误删除,那么是可以恢复的,就是通过git fsck --lost-found
找到对应的记录,然后git stash apply 记录id
进行恢复;
如果是git stash clean
清空操作,则无法再次恢复;
评论区