社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Git

恢复被删除的Git stash 记录

马哥Linux运维 • 5 月前 • 61 次点击  


一、问题

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

二、知识点

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

  1. 检查对象完整性: 确保所有的对象(提交、文件树、文件等)在物理上存在且没有损坏。如果有对象损坏,git fsck 将报告并显示问题。

  2. 寻找不可达对象: Git 使用引用来跟踪对象,如果某个对象没有任何引用指向它(即不可达对象),git fsck 会发现并报告这些不可达的对象。

  3. 查找丢失的对象引用: 它会检查是否存在引用(比如分支、标签等),但没有对应的对象存在。这可能是因为删除了对象或引用指向了一个不存在的对象。

  4. 输出报告: 将列出发现的问题,并提供相应的修复建议或提示。

三、复制一个副本

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

四、查看 unreachable 列表

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

git fsck --unreachable

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

git fsck --unreachableChecking object directories: 100% (256/256), done.unreachable blob 08a0724cff104d83f3c261b68487e5b5dfb0bc92unreachable blob 09e0e7369d8c60923a53c8097674dde7f71a0cc0unreachable blob 0b00205b03a9d5a7c311907b968d41da09ee0662unreachable blob 0ba035459d1ce597a1cbba64a5f1073c467af198unreachable blob 0f8093bb5835971fad89f8274387d15d38eba9c7unreachable blob 11205462d9730314c6ac8f0320ef0c6247af4b7a
五、将 unreachable 内容提取到编辑器中

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

六、 认识 unreachable 分类

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

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

七、git show +  展示信息

git show <sha>

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

八、恢复

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

git stash apply + <sha>

可能会出现如下的错误:

fatal: '' is not a stash-like commit
解决办法:使用 merge 命令

# 如果有合并冲突,解决冲突git merge +<sha>

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

九、小结

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

链接:https://juejin.cn/post/7310143510102867977

(版权归原作者所有,侵删)


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/165474
 
61 次点击