1个回答

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
回复

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