误删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 就到你丢失的工作区了 。 |
脚本
在你项目目录下新建一个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 搞定
????