如何恢复被删除(drop)的 stash

恢复被 drop/clear 的 stash:git fsck --unreachable 找孤立提交,逐个 git show 确认后用 git stash apply <哈希> 恢复。对象被清理后无法在本仓库恢复,重要改动应尽早转成分支。

最佳实践
Git 提交历史与版本恢复示意

被 drop 的 stash 在对象仍保留时可能找回:stash 本质是提交对象,删除只是去掉引用。用 git fsck --unreachable(或 --lost-found)列出孤立提交,逐个 git show 确认,找到后 git stash apply <哈希> 恢复。

恢复流程

# 1. 找孤立提交(stash 的提交通常有多个父节点)
git fsck --unreachable 2>/dev/null | grep commit

# 2. 逐个确认内容
git show <哈希> --stat
# 支持该选项的 Git 可连同未跟踪文件查看;用 -u/-a 创建的 stash 才可能含这些文件
git stash show --include-untracked -p <哈希>

# 3. 确认是它之后恢复
git stash apply <哈希>

缩小搜索范围

# 按提交日期倒序查看孤立提交(不自动限制为一周)
git fsck --unreachable | grep commit | cut -d' ' -f3 |
  while IFS= read -r h; do git show -s --format='%ct %H %s' "$h"; done |
  sort -nr | head

stash 提交的提交信息形如 "WIP on main: ...",含你 stash 时的 -m 备注,按说明关键词筛更快。

预防比恢复重要

  • 重要改动别长期躺 stash:git stash branch 分支名 创建分支并应用改动,再检查并提交;它不会自动生成保存改动的新提交;
  • stash clear 前务必 stash list 过一遍;
  • 超过一天还用不到的 stash,提交到 wip 分支推上去。

常见问题(FAQ)

Q:多久之内能找回?

能否恢复取决于对象是否仍在、reflog 和垃圾回收设置。gc.pruneExpire 常见默认值是两周,但它不是误删后的保证恢复窗口;不要主动运行 prune 或 gc,尽早检查对象。

Q:apply 回来的 stash 哈希和原来一样吗?

apply 会把对象中的改动应用到工作区,不会自动新增 stash 列表条目。若确认该对象确实是 stash,可另用 git stash store <哈希> 重新加入列表。

Q:gc 已经跑过了还有救吗?

运行过 gc 不等于该对象已被删除,仍应检查是否存在。对象确实被 prune 后,需依靠包含该对象的备份或其他已保存副本;普通 clone/push 通常不传输本地 stash,不能假定其他克隆有它。

参考资料

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台