误删stash的终极方案

最近由于几个项目同时改 bug的缘故,和stash 格外亲密 。 stash对多分支开发是真的友好,前提是你没误删 ······

这不,昨天切换分支的时候,不小心把stashB pop 到了A分支上,自己一看懵逼了,倒是手快直接撤销stash暂

存,然后把A的stash pop出来完成了A分支的开发 。 今天一看bug列表,都是B分支的,切过去改吧,一看stash

list里面已然没有B的暂存了。将尽一周的心血,没了 。 求助度娘,到下午已经解决完毕,现在记录一下涉及到的

知识点吧,另外发现,纯人工操作,特别耗时,我人工找回来用了将近三个小时一个一个去show commit_id 。

晚上回来整理写了一个bash脚本 。文末自取哦 。。不谢

1
2
3
4
5
6
7
8
9
10
11
12
13
14
git stash list //确认你的stash列表确实丢掉了你想要stash

接下来把下面每个命令敲打你的shell里
//显示出所有不可访问的对象,就理解成stash list里看不到的,暂时被放弃引用的。
//这里一般都很多,建议直接输出到文件里,方便查看 使用 git fsck --unreachable > stash.txt 
git fsck --unreachable  

//一个一个的查看哪个是被你误删的stash  <shr>指的是????列表内的id (示意图在下方)
在这里需要⚠️ 你只需要关心commit 类型的 blob和tree的是文件和文件夹,
一般无法stash apply 直接略过就好。一条一条的很难找,关键还是没有顺序的
git show <shr>          

找到你想找到的那条id 
git stash apply id  就到你丢失的工作区了 。

 

误删stash的终极方案

脚本

在你项目目录下新建一个find-stash.sh 文件

文件内复制以下内容、保存

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#!/bin/bash
# git fsck --unreachable > stash.txt
#!/bin/bash
#将结果输出到stash.txt文件内
# git fsck --unreachable > stash.txt
#从stash.txt文件里逐行读取数据
while read LINE
do
  #按空白符分割当前行字符串,拿到第二个数据,第二个是类型commit 或者blob或者tree
  temp_str=`echo $LINE|cut -d " " -f2`
  if [[ $temp_str = "commit" ]]; then
    #获取到commit_id
    commit_id=`echo $LINE|cut -d " " -f3`
    #把git show 的内容逐条放到commit_result.txt文件内
    git show $commit_id >> commit_result.txt
  fi
done < stash.txt

命令行执行 ./find-stash.sh

⚠️ 此时可能会提示 permission denied , 切换到系统root用户,执行 chmod 777 find-stash.sh

之后再 ./find-stash.sh

会看到项目文件里多出两个文件 stash.txt 和 commit_result.txt 在commit_result里搜索你要的条件,比如日期Nov 25 就是11月25号的stash,对比diff内容,符合需求 git stash apply commit_id 搞定

????

相关文章:

  • 2022-12-23
  • 2021-12-18
  • 2021-04-21
  • 2022-12-23
  • 2022-12-23
  • 2021-05-21
  • 2021-08-04
猜你喜欢
  • 2022-01-03
  • 2021-07-10
  • 2021-04-16
  • 2021-07-24
  • 2022-12-23
相关资源
相似解决方案