当前位置:

首页 > 编程开发 > GitStash丢失后的完整找回指南

GitStash丢失后的完整找回指南

场景:本地分支有未提交的 git stash,合并远程分支后 stash 从列表消失,代码“不见了”。 事故还原 在本地分支 test-eslint-copy 上做了大量修改(props 清理、字段删除等) 用 git stash 暂存了这些改动 执行 git merge origin/test 合

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

GitStash丢失后的完整找回指南

事故还原

  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 <分支名>: ,用这个特征过滤:

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  --stat

第五步:恢复

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

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

# 恢复 stash
git stash apply 

关键原理

概念 说明
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 直接恢复。只要没跑 git gc,数据就还在。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
作者最新文章
编程开发
相关文章 更多
GitStash贮藏命令使用及说明
GitStash贮藏命令使用及说明

一、前言 做开发最怕什么?正热火朝天写着功能,代码改到一半,突然来一句“切到另一个分支修个紧急bug”。commit吧,功能都没写完,到处是半成品,怎么看怎么不干净;直接切,改了一半的代码就丢了,回头还得重新来。这进退两难的处境,相信每位Git使用者都深有体会。 解决方案其实很简单:git stas

用GitStash临时保存修改,轻松切换任务方式
用GitStash临时保存修改,轻松切换任务方式

Gitstash可临时保存工作区所有修改,使工作目录恢复干净,便于快速切换任务处理紧急Bug或缺陷。其常用命令包括:save/push可添加备注、list可查看存档列表、apply/pop可恢复指定存档、drop可删除无用存档,帮助开发者实现任务无缝衔接。

查看更多
精品专题 更多
装机必备
装机必备

正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

Windows
Windows

正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

PDF教程
PDF教程

正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

Mac软件 更多
Postman macOS版
Postman macOS版
Mac

Postman是一套面向API全生命周期的开发与测试平台,可在Mac上发送和调试多种协议请求,管理集合、环境及认证信息,并完成脚本测试、模拟服务、监控、文档发布和团队协作。它适合开发、测试及运维人员使用,提供个人免费方案。

Docker Desktop macOS版
Docker Desktop macOS版
Mac

Docker Desktop 是 Docker 官方为 Mac 提供的容器开发环境,集成 Docker Engine、命令行工具、Compose、Build、Kubernetes 与图形化管理界面。

Android Studio macOS版
Android Studio macOS版
Mac

Android Studio 是 Google 面向安卓应用开发提供的官方集成开发环境,基于 IntelliJ IDEA 构建。它整合智能代码编辑、Gradle 构建、界面预览、设备模拟、性能分析、调试测试及 APK 分析等工具。

WINDOWS 更多
Postman Windows版
Postman Windows版
Windows

Postman 是面向 API 全生命周期的开发与协作平台。Windows 桌面版可用于构建和发送 HTTP、GraphQL、gRPC、WebSocket、MQTT 等请求,并提供环境变量、集合、脚本测试、模拟服务、监控、文档及团队工作区等

Docker Desktop Windows版
Docker Desktop Windows版
Windows

Docker Desktop 为 Windows 开发者提供集成式容器环境,内置 Docker Engine、命令行工具、Compose、Build 与 Kubernetes 等组件,可在本机完成镜像构建、容器运行、日志查看和资源管理。

Android Studio Windows版
Android Studio Windows版
Windows

Android Studio 是 Google 面向 Android 应用开发提供的官方集成开发环境,以 IntelliJ IDEA 为基础,集成智能代码编辑、Gradle 构建、设备模拟、界面预览、调试测试及性能分析工具,