git stash问题?

作者站长头像
站长
· 阅读数 10

我不小心把一条stash的记录给drop删除掉,我该怎么恢复这条记录?不记得id是多少。

回复
1个回答
avatar
test
2024-06-30

试了一下,这个回答 里面的方法可以做到。

如果你还能找到被你 drop 掉的那个 commit id ,你可以直接使用 git stash apply <commit id> 来找回来。

如果你找不到那个 commit id,可以在 git-bash 里面执行

git fsck --no-reflog | awk '/dangling commit/ {print $3}'

或者在 Powershell 里面执行

git fsck --no-reflog | select-string 'dangling commit' | foreach { $_.ToString().Split(" ")[2] }

根据拿到的 commit id ,然后执行前面的的 git stash apply <commit id> 就行了。


我是在 Powershell 下运行的,可以看到 drop 后 reflog 是没有记录的,但是 drop 后会显示那个 commit ID (3ee9d39dfb246e78d0cd74df73700abc3dfd26ce) 在后面。如果你的窗口还没关,那可以直接用这个 commit ID 执行 apply 就行了,如果你已经关闭了,就按照后面的步骤来就好了。

我这里执行 git fsck --no-reflog | select-string 'dangling commit' | foreach { $_.ToString().Split(" ")[2] } 有多个 commit ID 那是因为我前面测试的记录,最后删除的那个在最下面。

当然,你还可以在 apply 之前使用 git show <commit> 来查看这个内容。

$ git stash -m test1
Saved working directory and index state On dev-20230726: test1

$ git stash list
stash@{0}: On dev-20230726: test1

$ git stash drop 0
Dropped refs/stash@{0} (3ee9d39dfb246e78d0cd74df73700abc3dfd26ce)

$ git reflog
e967789 (HEAD -> dev-20230726, origin/dev-20230726) HEAD@{0}: reset: moving to HEAD
e967789 (HEAD -> dev-20230726, origin/dev-20230726) HEAD@{1}: reset: moving to HEAD

$ git fsck --no-reflog | select-string 'dangling commit' | foreach { $_.ToString().Split(" ")[2] }
Checking object directories: 100% (256/256), done.
Checking objects: 100% (11568/11568), done.
05c24e1aac36af540983f41ca93742cf1d65bb42
3ee9d39dfb246e78d0cd74df73700abc3dfd26ce

$ git stash apply 3ee9d39dfb246e78d0cd74df73700abc3dfd26ce
回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容