恢复被删除的Git stash 记录

一、问题

有时候在 git stash 非常有用,但是我们你能由于一些错误的操作,导致将 git stash 中内容被删除掉,误删 stash.

二、知识点

git fsck 命令用于检查 Git 仓库中的对象的完整性和一致性。它可以发现和报告一些潜在的问题,比如损坏的对象、丢失的对象引用等。

  1. 检查对象完整性: 确保所有的对象(提交、文件树、文件等)在物理上存在且没有损坏。如果有对象损坏,git fsck 将报告并显示问题。
  2. 寻找不可达对象: Git 使用引用来跟踪对象,如果某个对象没有任何引用指向它(即不可达对象),git fsck 会发现并报告这些不可达的对象。
  3. 查找丢失的对象引用: 它会检查是否存在引用(比如分支、标签等),但没有对应的对象存在。这可能是因为删除了对象或引用指向了一个不存在的对象。
  4. 输出报告: 将列出发现的问题,并提供相应的修复建议或提示。

三、复制一个副本

为了安全和不熟练操作 git stash 的同学,将当前项目准备一个副本,在副本中进行操作,防止第一个现场丢失。

四、查看 unreachable 列表

切换到副本中,所有的操作放在副本进行:

ts 复制代码
git fsck --unreachable

查看所有 unreachable 的记录, 如同下面的例子:

sh 复制代码
git fsck --unreachable
Checking object directories: 100% (256/256), done.
unreachable blob 08a0724cff104d83f3c261b68487e5b5dfb0bc92
unreachable blob 09e0e7369d8c60923a53c8097674dde7f71a0cc0
unreachable blob 0b00205b03a9d5a7c311907b968d41da09ee0662
unreachable blob 0ba035459d1ce597a1cbba64a5f1073c467af198
unreachable blob 0f8093bb5835971fad89f8274387d15d38eba9c7
unreachable blob 11205462d9730314c6ac8f0320ef0c6247af4b7a

五、将 unreachable 内容提取到编辑器中

最好准备一个编辑器,将所有的内容复制出来,因为这个列表可能很长,在终端展示有限,也不好搜索,将其复制出来放在编辑器中(vscode)在内过多的时候有查找等优势。

六、 认识 unreachable 分类

类型 描述
Commit 不再有分支或标签指向的提交
Tree 不再有提交指向的文件树
Blob 不再有文件树指向的文件对象
Tag 不再有分支或提交指向的标签
unreachable 一般表示 Git 对象的一部分,但由于没有引用指向它们,因此被视为不可达

这里我们重点关注 commit 对象。

七、git show + <sha> 展示信息

ts 复制代码
git show <sha>

根据返回的信息,判断是不是我们需要恢复的内容,根据个人经验, commit 是我们需要恢复的内容可能比较大

八、恢复

有目标的 sha key, 然后切换到 stash 的分支, 执行:

sh 复制代码
git stash apply + <sha>

可能会出现如下的错误:

sh 复制代码
fatal: '<sha>' is not a stash-like commit

解决办法:使用 merge 命令

sh 复制代码
# 如果有合并冲突,解决冲突
git merge +<sha>

在副本中已经完成,相同的操作在目标项目中重新实现一次即可。

九、小结

本文主旨在恢复删除的 git stash 存储的内容,从副本出发,结合 git fsck 命令获取 unreachable 列表,然后,根据自己的项目 使用 git show <sha> 查看 unreachable 对象中的内容,找到目标对象,然后使用 git stash apply <sha> 或者 git merge <sha> 进行合并。如果这些操作符合我们的目标,在正式项目中重新演绎一次即可。

相关推荐
安且惜几秒前
带弹窗的页面--以表格形式展示
前端·javascript·vue.js
无限进步_35 分钟前
【C++】大数相加算法详解:从字符串加法到内存布局的思考
开发语言·c++·windows·git·算法·github·visual studio
GISer_Jing1 小时前
AI驱动营销:业务技术栈实战(From AIGC,待总结)
前端·人工智能·aigc·reactjs
小马爱打代码2 小时前
SpringBoot:封装 starter
java·spring boot·后端
STARSpace88882 小时前
SpringBoot 整合个推推送
java·spring boot·后端·消息推送·个推
Marktowin3 小时前
玩转 ZooKeeper
后端
GIS之路3 小时前
GDAL 实现影像裁剪
前端·python·arcgis·信息可视化
AGMTI3 小时前
webSock动态注册消息回调函数功能实现
开发语言·前端·javascript
蓝眸少年CY3 小时前
(第十二篇)spring cloud之Stream消息驱动
后端·spring·spring cloud
IT WorryFree3 小时前
Git for Windows v2.52.0 发布说明
windows·git