Git Stash丢失后的完整找回指南

 更新时间:2026年04月29日 08:34:23   作者:NB_R  
文章详细描述了当本地分支有未提交的git stash,合并远程分支后 stash 从列表消失的事故处理方法,总结了根本原因、找回步骤、关键原理、概念说明、预防措施,并给出总结一句话,简要介绍了如何处理丢失的 stash,需要的朋友可以参考下

场景:本地分支有未提交的 git stash,合并远程分支后 stash 从列表消失,代码"不见了"。

事故还原

  1. 在本地分支 test-eslint-copy 上做了大量修改(props 清理、字段删除等)
  2. git stash 暂存了这些改动
  3. 执行 git merge origin/test 合并远程分支
  4. 合并后发现 git stash list 里没有了自己的 stash,改动"消失"

根本原因git stash 的记录存储在 refs/stash 引用链上。某些 git 操作(如带冲突的 merge、reset 等)会导致 stash 引用丢失,但 stash 的 commit 对象本身还在 git 对象库里,只是变成了"悬空对象(dangling commit)",没有任何引用指向它。

找回步骤

第一步:确认 stash list 里真的没了

git stash list

如果你的 stash 不在里面,继续下一步。

第二步:用 fsck 找出所有悬空的 commit

git fsck --unreachable 2>&1 | grep "unreachable commit"

这会列出所有"孤儿 commit",stash 就藏在里面。

第三步:过滤出属于你分支的 stash

stash commit 的 message 格式固定为 WIP on <分支名>: <hash> <commit message>,用这个特征过滤:

git fsck --unreachable 2>&1 | grep "unreachable commit" | awk '{print $3}' | while read c; do
  msg=$(git log -1 --format="%s %ci" $c 2>/dev/null)
  if echo "$msg" | grep -q "WIP on <你的分支名>"; then
    echo "$c | $msg"
  fi
done

<你的分支名> 替换成实际分支名,比如 test-eslint-copy

输出示例:

469b4f36... | WIP on test-eslint-copy: 23996d8 fix: 再次处理eslint问题 2026-04-28 10:03:30 +0800
bcb74bf5... | WIP on test-eslint-copy: 14aa429 Merge branch 'test' 2026-04-28 09:54:12 +0800

第四步:确认是不是你要的那个

根据时间戳判断,然后看改动内容:

git show <commit-hash> --stat

第五步:恢复

先处理工作区的干扰文件(如果有),再 apply:

# 如果有自动生成的文件挡路,先丢弃
git checkout -- src/dts/auto-imports.d.ts src/dts/components.d.ts

# 恢复 stash
git stash apply <commit-hash>

关键原理

概念说明
git stash本质是创建了 2~3 个特殊 commit,用 refs/stash 引用链串起来
stash 丢失只是引用链断了,commit 对象本身还在对象库
dangling commit没有任何引用指向的 commit,git fsck 可以找到
git gc垃圾回收,会清理 dangling 对象。找回操作要在 gc 之前做!

预防措施

合并前养成习惯:

# 合并前先把 stash 转成真正的 commit
git stash pop
git add .
git commit -m "wip: 临时保存"

# 合并完再 reset 回来
git merge origin/xxx
git reset HEAD~1  # 把临时 commit 变回工作区改动

或者更简单,用 --autostash

git merge --autostash origin/xxx

这样 git 会在合并前自动 stash、合并后自动 pop,不会丢。

总结一句话

stash 丢了不要慌,git fsck --unreachable 找悬空 commit,按时间戳认出来,git stash apply <hash> 直接恢复。只要没跑 git gc,数据就还在。

到此这篇关于Git Stash丢失后的完整找回指南的文章就介绍到这了,更多相关Git Stash丢失找回指南内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 基于Leaflet的VideoOverlay视频图层叠加实战教程

    基于Leaflet的VideoOverlay视频图层叠加实战教程

    这篇文章主要介绍了基于Leaflet的VideoOverlay视频图层叠加实战,本文首先介绍了DistortableVideo组件的相关知识,它的github仓库信息,相关源代码的目录说明,使用依赖信息,需要的朋友可以参考下
    2023-02-02
  • Redhat持久化日志实战示例详解

    Redhat持久化日志实战示例详解

    这篇文章主要为大家介绍了Redhat持久化日志实战示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-11-11
  • Vscode 打字特效插件Power Mode安装使用介绍

    Vscode 打字特效插件Power Mode安装使用介绍

    本文给大家推荐的是一款Vscode的打字特效的插件Power Mode的安装使用说明,插件非常的炫酷,推荐给大家,希望大家能够喜欢
    2020-02-02
  • git如何使用Sourcetree合并多次本地提交记录

    git如何使用Sourcetree合并多次本地提交记录

    这篇文章主要介绍了git如何使用Sourcetree合并多次本地提交记录,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-05-05
  • 调试JavaScript/VBScript脚本程序(IE篇)

    调试JavaScript/VBScript脚本程序(IE篇)

    JavaScript/VB Script脚本程序一般有两种执行方式,一种是嵌入在宿主程序里面执行,比如在IE浏览器里面执行;另外一种,在资源管理器里面双击执行(虽然还是通过另外一个程序解释执行,但是给人的感觉毕竟是直接运行)。
    2009-09-09
  • 网站性能优化之HTTP请求过程简述

    网站性能优化之HTTP请求过程简述

    网站性能优化中首要的一条就是要减少HTTP请求,那么为要减少HTTP请求呢?其实有些HTTP分析工具可以帮我们了解当浏览器请求一个资源时大致需要经历的哪些过程
    2011-12-12
  • htaccess语法教程

    htaccess语法教程

    前些天不小心删除了原来的博客系统,问过godaddy的客服,恢复数据需要150美元,另外还需要提供不少信息,我于是放弃,注册了这个nunumick.me,打算从头再来。
    2011-09-09
  • Linux/Ubuntu Git从安装到使用的方法步骤

    Linux/Ubuntu Git从安装到使用的方法步骤

    这篇文章主要介绍了Linux/Ubuntu Git从安装到使用的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • MASA Blazor入门详细教程

    MASA Blazor入门详细教程

    MASA Blazor是一个基于 Blazor Component 和 Material Design 的 UI 组件库,接下来通过本文给大家介绍MASA Blazor入门详细教程,感兴趣的朋友一起看看吧
    2022-04-04
  • URL编码表一览(推荐收藏)

    URL编码表一览(推荐收藏)

    有时候我们会碰到一些网页地址里面有一些%(百分号)组成的网址,其实这样的%与数字的组合就是一个符号。下面是URL编码表,大家可以对应下。
    2010-07-07

最新评论