侧边栏壁纸
  • 累计撰写 94 篇文章
  • 累计创建 100 个标签
  • 累计收到 10 条评论

目 录CONTENT

文章目录
Git

Git学习-存档记录被误删的恢复办法

汤圆学Java
2022-01-26 / 0 评论 / 0 点赞 / 556 阅读 / 2,882 字
温馨提示:
本文最后更新于 2022-01-26,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

前言

存档区的相关内容前面有介绍,他就是用来存储暂时不想提交到git的修改,但是又不想在工作区显示,这时我们就可以通过git stash命令对其进行存档,然后在需要的时候再进行恢复;

但是有时候我们脑子一热,手一抖,就用git stash drop命令对存档区的内容进行了删除;

此时还可以亡羊补牢,为时不晚;

但是如果用git stash clear命令进行了清空操作,那么就无力回天了;

今天我们要介绍的就是通过git stash drop命令进行的误删除操作,该怎么恢复;

目录

  1. 情景复现
  2. 简单恢复
  3. 麻烦一点的恢复

正文

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清空操作,则无法再次恢复;

0

评论区