Git stash clear/drop 后数据仍存在于对象库中,可通过 git fsck 找出 dangling commit 并用 git show 查看内容,再用 git stash apply、git checkout 或新建分支方式恢复。

Mac 上执行 git stash clear 或 git stash drop 后,stash 记录从 stash 列表消失,但实际数据仍保留在 Git 对象数据库中,只要没触发垃圾回收(默认 30 天内不会清理),就能通过对象引用找回被删的 stash 内容。
确认 stash 是否真的丢失
先运行 git stash list。如果输出为空,不代表代码没了——这只是引用被移除了。Git 仍保留着 dangling commit 对象,下一步就是把它揪出来。
打开终端,进入项目根目录,确保当前是你要恢复的仓库。
找出被删 stash 对应的 dangling commit
执行以下命令:
git fsck --no-reflog --unreachable | grep 'dangling commit'
这会过滤出所有孤立的 commit 对象,它们就是 stash 被删后残留的“尸体”。每行末尾的哈希值(如 dangling commit a1b2c3d...)就是关键 ID。注意:不要选 dangling blob 或 dangling tree,只有 dangling commit 才可能包含你 stash 的完整变更快照。
【必须跳过 reflog】 因为 Mac 上某些 Git 配置默认禁用 reflog(尤其通过 Homebrew 安装的新版 Git 或启用 core.logAllRefUpdates=false 时),所以不能依赖 git reflog 查 stash 记录,--no-reflog 是保险做法。
逐个检查 dangling commit 内容
对每个可疑 commit ID,运行:
git show --name-only <commit-id>
只看改动了哪些文件路径,快速判断是不是你的 stash。如果路径吻合,再加 -p 看补丁细节:
git show -p <commit-id>
按 ↓ 键翻页,按 q 退出查看。Mac 终端默认支持这些按键操作,无需额外配置。
把 stash 内容恢复到当前工作区
方法一:直接应用变更(推荐)
执行:git stash apply <commit-id>
它会把该 commit 中的改动像普通 stash 一样解包到工作区和暂存区,不删除原对象,可反复试错。
方法二:只取特定文件
如果你只想恢复某个文件,比如 src/api/client.js,运行:
git checkout <commit-id> -- src/api/client.js
这一步会覆盖当前工作区中的同名文件,请确保你没在该文件上做新修改,否则会被冲掉。
方法三:新建分支检出(适合大范围恢复)
第一步:创建临时恢复分支
git switch -c recover-stash-temp
第二步:强制检出该 commit 的全部内容
git reset --hard <commit-id>
此时整个工作区变成 stash 当时的状态,你可以复制需要的文件,或直接提交为新 commit。


















