VS Code中突然无法查看访问stashed changes 如何恢复Git暂存内容
Stash丢失的常见诱因
Stash无法访问通常和.git目录异常直接相关,正常的stash条目会以特殊merge commit的形式存储在git对象库中,引用记录保存在.git/refs/stash文件内,常见触发丢失的场景包括:
- VS Code打开的路径不是原仓库根目录,git识别到的仓库实例和你之前操作的不一致
.git/refs/stash文件被误删、被同步盘(OneDrive/iCloud等)同步时损坏,或是被安全软件误拦截- 手动执行过带强制清理参数的
git gc操作,将stash对应的无引用对象清除 - 仓库切换过git版本、或是执行过重置.git目录的操作,导致原有stash引用丢失
按优先级执行恢复操作
第一步:先校验当前仓库路径
在VS Code内置终端执行以下命令,确认当前识别到的仓库根目录是否正确:git rev-parse --show-toplevel
如果输出路径和你之前存储stash的工作目录不一致,关闭VS Code重新打开正确的仓库根目录,再执行git stash list确认stash是否恢复可见。
第二步:从reflog中检索stash记录
只要stash对应的git对象没有被物理删除,所有stash操作都会在git引用日志中留下记录,不受refs/stash文件损坏的影响:
- 先执行stash专属reflog查询:
git reflog show stash - 如果输出中存在类似
stash@{0}: WIP on <分支名>: <提交哈希> <提交说明>的条目,直接复制对应条目的哈希值,执行git stash apply <哈希值>即可将stash内容恢复到工作区;如果需要把条目重新加回stash列表,执行git stash store <哈希值>即可。 - 如果上述命令提示stash引用不存在,执行全量reflog查询:
git reflog
在输出结果中筛选提交信息以WIP on开头的条目,这类条目就是历史stash生成的提交,拿到哈希后按上述apply命令恢复即可。
第三步:全量扫描悬空commit定位stash
如果reflog已被清理,直接扫描git对象库中所有未被引用的commit,stash提交的说明固定以WIP on开头,可以快速定位:
- 执行命令列出所有无引用的commit:
git fsck --unreachable --no-reflogs | grep commit - 遍历输出的每一个commit哈希,查看提交基础信息确认是否为目标stash:
git log --oneline -1 <commit哈希> - 找到目标stash对应的哈希后,执行以下命令恢复内容:
git stash apply <commit哈希>
注意:stash是特殊的merge类型提交,如果要用cherry-pick恢复,必须加
-m 1参数指定主父提交,即git cherry-pick -m 1 <commit哈希>,否则会触发merge冲突报错。
第四步:物理损坏兜底方案
如果上述命令都无法定位到stash内容,说明.git目录下的对应对象文件已经损坏或被删除,可以查找本地同步盘的文件历史版本、仓库的本地备份,提取旧版本.git目录下的objects文件夹和refs/stash文件,覆盖回当前仓库后再重复上述恢复步骤。
内容的提问来源于stack exchange,提问作者benlee38b
相关产品推荐
相关产品推荐

