别等代码丢了才后悔!用`git fsck --lost-found`找回丢失提交的完整指南

git reset --hard origin/master 文件被删除后的恢复操作 【代码】git reset --hard origin/master 文件被删除后的回复操作。 阅读详情

别等代码丢了才后悔!用git fsck --lost-found找回丢失提交的完整指南

凌晨三点,你刚完成一个关键功能的开发,却在执行git reset --hard时手滑选错了提交哈希。屏幕一闪,过去三天的代码消失得无影无踪——这种噩梦般的场景,每个开发者都可能遇到。本文将带你深入Git的"急救室",掌握git fsck --lost-found这一数据恢复利器,把看似永久丢失的代码从死亡边缘拉回来。

1. 理解Git对象回收机制:为什么删除的代码还能找回

Git的设计哲学中有一个关键原则:几乎所有的操作都是可逆的。当你执行git commit时,Git会创建四种核心对象:

  • blob对象:存储文件内容
  • tree对象:记录目录结构和blob索引
  • commit对象:包含提交信息、作者时间和父提交指针
  • tag对象:为特定提交提供别名

这些对象存储在.git/objects目录中,通过SHA-1哈希值索引。关键在于,Git采用引用计数的垃圾回收机制:

# 查看.git目录结构
tree .git/objects -L 2
.git/objects
├── 12
│   └── 3456789abcdef0123456789abcdef01234567
├── info
└── pack

当你删除分支或重置提交时,Git只是移除了对这些对象的引用,而对象本身仍然存在于磁盘上,处于"悬挂"(dangling)状态。直到执行git gc(垃圾回收)后,这些无引用的对象才会被真正清除。

2. 实战恢复:五步找回误删的提交

2.1 紧急制动:停止所有Git操作

发现代码丢失后,立即停止所有Git操作。特别是避免:

  • 执行git gc或git prune
  • 创建新提交或分支
  • 运行自动化清理工具

这些操作可能触发垃圾回收,永久清除悬挂对象。

2.2 扫描丢失对象

使用--lost-found选项执行深度扫描:

git fsck --lost-found --no-reflogs

典型输出示例:

dangling commit 8d2c7f8e9c2325d4cc56467c9f8e3d72e2a8a9e3
dangling blob 12a45b6789cd0e1f23456789abcdef0123456789

2.3 分析找到的提交

检查每个悬挂提交的内容:

git show 8d2c7f8e9c2325d4cc56467c9f8e3d72e2a8a9e3

关键查看:

  • 提交信息
  • 变更文件列表
  • 作者和时间戳

2.4 恢复提交到新分支

确认目标提交后,创建新分支进行恢复:

git branch recovered-work 8d2c7f8e9c2325d4cc56467c9f8e3d72e2a8a9e3

2.5 验证恢复结果

切换到新分支并检查代码完整性:

git checkout recovered-work
git log --oneline -n 3

3. 高级恢复技巧与工具链配合

3.1 可视化辅助工具

结合gitk图形化界面更直观地定位丢失提交:

gitk --all $(git fsck --lost-found | grep 'dangling commit' | awk '{print $3}')

3.2 批量恢复策略

当存在多个相关提交时,可按时间范围筛选:

# 查找最近24小时内的悬挂提交
git fsck --lost-found | grep 'dangling commit' | awk '{print $3}' | 
xargs -I{} git show -s --format="%ct {}" {} | 
awk -v cutoff=$(date -d '24 hours ago' +%s) '$1 > cutoff {print $2}'

3.3 恢复单个丢失文件

如果只需要找回特定文件:

  1. 先找到包含该文件的blob对象
  2. 使用git cat-file导出内容:
git cat-file -p 12a45b6789cd0e1f23456789abcdef0123456789 > recovered_file.txt

4. 防患于未然:构建代码安全网

4.1 日常防护措施

措施命令/配置作用
开启refloggit config --global gc.reflogExpire=90.days延长操作历史保留期
定期备份git bundle create repo.bundle --all创建完整仓库快照
使用钩子.git/hooks/pre-gc阻止意外垃圾回收

4.2 自动化恢复方案

创建紧急恢复脚本git-rescue.sh:

#!/bin/bash
# 创建恢复目录
mkdir -p .git/rescue_$(date +%s)

# 捕获所有悬挂对象
git fsck --lost-found 2>&1 | tee .git/rescue.log

# 保存原始引用状态
git show-ref > .git/rescue_refs.txt

# 打包对象防止被清理
git pack-refs --all

4.3 团队协作规范

  • 禁止直接推送--force到共享分支
  • 重要合并前创建临时备份分支
  • 使用git revert而非git reset撤销公共提交

记住,最好的恢复策略是从不需要恢复。养成git push频繁提交的习惯,就像程序员版本的"保存按钮强迫症"。当真的遇到数据灾难时,保持冷静——Git的设计给了你充足的安全网,而git fsck --lost-found就是那张藏在工具包底部的万能恢复卡。

恢复因git reset --hard 但未提交全部文件到仓库导致的文件丢失问题 问题描述: git commit 时 只上传了部分文件,但是直接进行了--hard版本穿梭,导致工作区、暂存区的文件都消失或被覆盖的问题。 我当时将所有文件都add到了暂存区,但只commit了一个pom.xml文件(当时脑子不知道怎么想的),随后进行了版本回退,reset --hard 到了一个只有.idea文件夹的初始版本,导致我项目中的src文件夹、target文件夹都消失了(超多文件,心态直接炸裂),并且仓库中不存在 拥有src文件夹的版本,无法通过git reflog和reset 解决 原因 阅读详情

相关推荐

模拟IC实战—30天精通Sigma-delta(Σ-Δ) ADC 行为级建模与仿真

本文为模拟IC工程师提供了一套为期30天的Sigma-delta ADC行为级建模与仿真实战指南。文章深入浅出地阐释了Sigma-delta ADC如何通过过采样和噪声整形两大核心技术实现高精度转换,并重点演示了如何使用Python从零搭建一阶和二阶调制器模型,进行性能仿真与关键指标分析,为后续电路级设计提供清晰的性能预算和架构指导。

weixin_29237635的博客 400

[git] git fsck --lost-found命令用法

在修改代码的修改,有时候切换branch时不小心把修改的内容干掉了,这时候可以使用git fsck --lost-found命令,把刚修改的内容找回来。 xxx$ git fsck --lost-found Checking object directories: 100% (256/256), done. Checking objects: 100% (237/237), done. dangling commit 8d9e9caada0279be9135d78bf67acac926f26416 然后g

楼中望月 6780

别再乱用标签了!深度解析Unity Addressables标签(Labels)的三种高级用法与性能影响

本文深度解析Unity Addressables标签(Labels)的三种高级用法与性能影响,包括标签组合查询、Pack Together by Label打包策略及运行时性能优化。通过实战代码示例和性能数据对比,帮助开发者实现精细化资源加载控制与包体优化,提升项目效率。

weixin_30500105的博客 509

git fsck --lost-found

找回因误操作删除的 已add 未commit代码

RendingDer的博客 1676

ESP32编译卡在‘Cannot establish a connection to the component registry’?别急着重装,先试试这两个国内镜像配置

本文详细解析了ESP32编译过程中常见的‘Cannot establish a connection to the component registry’报错问题,并提供了国内镜像源的配置方案。通过对比Gitee、清华大学、阿里云和中科大等镜像源的性能,帮助开发者快速解决网络连接问题,提升编译效率。文章还包含手把手的配置教程和进阶技巧,适用于ESP-IDF开发环境的优化。

weixin_34088048的博客 341

Abel逆变换及其求解方法

Abel逆变换常应用在轴对称的、光学薄的火焰、羽流或等离子体重建。

weixin_49783507的博客 8380

一次惊险的git操作

这个命令,我的理解可以解决丢步的情况,比如reset到了更早的commit,把那之后的commit给整没了,此时可以用这个命令恢复。的输出是没有问题的,所以想来想去,觉得问题应该就是出在powershell的默认编码上,后来一通搜索,在github这个。时,发现有很多文件不想加到git仓库,也就是在工作区执行了add,但是还没有commit,此时脑袋一热,执行了。参数,则把缓存区的内容恢复到工作区,注意此时工作区的修改不会被取消,即如果工作区删除了文件,那执行。,然后就悲剧了,工作区的修改全没了。

blog.boringhex.top 874

全面解析智能座舱芯片参数:高通 (SA8295)vs 联发科,真实案例一行行讲给你听!

使用场景推荐芯片中低端车型 + 1屏导航语音SA8155P / MT8628(性价比高)中控+副驾+仪表+全景影像SA8255P / MT8678(性能强)高阶自动驾驶+域控融合SA8295P(顶级安全+算力)

weixin_43199439的博客 2084

git fsck 恢复误删 stash 贮藏的数据

可以通过 git show 来查看是否是自己想要的代码,排列顺序是最新的在最上面。stash 之后的内容没有应用到代码上就直接给删除了。找到想要的代码 id 后,执行 git merge 来恢复代码。执行完之后会得到很多 id ,其中会标明哪个是 commit。

赵凯月的博客 820

Python爬取公交线路信息及站点shp数据 文末附数据下载地址

三、现在已经获取到了各个线路名称、链接,以及所途径的上下行站点,那么接下来就应该对开始对第三页url进行信息采集,即本次爬虫的最终目的:爬取所有站点的GPS坐标数据。但坑就坑在,二环一号线属于环线,所以只有左侧有站点数据,而其他非环线车次的站点数据分有上下行,如果用正则匹配,则分不清楚到底哪些是上行站点哪些是下行站点。以前爬过百度地图,当时用的是API平台,加上网站比较规范,所以标签节点什么的都比较清晰,但这次由于特殊原因所选择的网站为公交网,废话不多说直接开始吧。checi=二环一号线。

J_Giser的博客 1318

提示词编写:从新手到专家的进阶之路

本文旨在为提示词编写者提供一条从新手到专家的进阶之路。我们将详细探讨提示词编写的背景与意义、基础与进阶技巧、实战应用以及最佳实践。通过逐步深入的分析与实操,读者将掌握提示词编写的核心要点,提高编写效率和作品质量。提示词是用于引导人工智能生成文本的关键词或短语,它包含了作者想要传达的主题、情感和细节。随着人工智能技术的普及,自动化写作工具逐渐应用于各行各业。为了提高写作效率,项目团队决定开发一款基于人工智能的自动化写作工具。成功开发了一款自动化写作工具,生成文本质量较高。

AI天才研究院 1087

git 找回丢失的对象 找回commit

译者注: 原书这里只有两个链接: Recovering Lost Commits Blog Post,  Recovering Corrupted Blobs by Linus 我根据第一个链接,整理了一篇博文,并把它做为原书补充。 在玩git的过程中,常有失误的时候,有时把需要的东东给删了。 不过没有关系,git给了我们一层安全网,让们能有机会把失去的东东给找回来。 L

爱钓鱼的程序猿 641

LoRA 完整解析:从理论到实践

LoRA(低秩适应)是一种高效的大模型微调方法,通过添加少量可训练参数(低秩矩阵)来适配新任务,避免全参数微调的高成本。其核心是将权重更新ΔW分解为两个小矩阵B×A的乘积,大幅减少训练参数量(仅0.1-1%)。LoRA基于内在维度假设,通过低秩约束捕捉核心任务信息,兼具效率与效果。实际应用中,常用配置为秩r=16-32,目标模块选择注意力层的q_proj和v_proj,学习率比全参数微调大10倍(约1e-4)。优势包括参数高效(内存降低60-80%)、多任务适配灵活、保留预训练知识等,已成为大模型微调的主流

echo的博客 1416

git blame && git fsck –lost-found

git中把commit删了后,并不是真正的删除,而是变成了悬空对象(dangling commit)。我们只要把把这悬空对象(dangling commit)找出来,用git rebase也好,用git merge也行就能把它们给恢复。 这里最重要的一个命令就是:git fsck...

209

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Git add而未commit的代码找回

Git add而未commit的代码找回 执行 git fsck --lost-found 命令; 进入.git文件夹中,拷贝lost-found/other 文件夹到其他任意位置; 查看拷贝文件夹中的文件内容,将其重命名为之前名称(文件名字无法找回,只能手动重命名,图片等文件直接重命名即可使用),放回之前路径下。 ...

LittleGlassHeart的博客 1995

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Git回退已经提交commit的(还未推送push的)代码及撤回代码回退

已经开始难过了,我提交后没有推送就按照上文提示进行了代码回退,结果idea里面没得我最后一次提交的代码。然后我开始了第二轮操作,(这句命令会在本地项目.git文件夹下出现lost-fou。原文链接(原文写的是已经推送push的代码),就可以看到日志里你最后一次提交的代码了。

qq_61726905的博客 6785

git版本回退后,导致已经add的代码丢失

git add . 后把代码提交到了暂存区,但是git status后看到很多是之前写的,不想提交,又不想一个一个撤回,想着版本回退一下,结果导致新写的功能代码直接全部丢失,无奈只能看有没有方法,经过寻找,发现可以找回。 运行如下代码: git fsck --lost-found 然后到项目文件下找到隐藏文件.git, 然后进入ost-found下的other,在里面就可以找到丢失的文件了 记录一下,以免忘记,如有帮助也可点赞收藏! ...

木子的博客 1931

修改后的代码只进行了git add操作不小心给他恢复了怎么找回来

发现了很多乱码名字的文件并且没有后缀,你没有猜错,这些就是git add 过得文件,我们手动改后缀是可以查看内容的(找到文件再改)一份干净的代码在main.js里加了一行console.log(666),并且只进行了git add。然后我们去项目的.git下找到这个目录 .git\lost-found\other。这个文件呢,就是最后add的那个文件了,我们直接复制过去就恢复更改了!我们看那个改变的main.js 文件大小,2.我们可以直接改文件后缀,然后打开即可。也就是说可能是这几个,我们怎么确认呢,

纸飞机博客 3261

git 暂存的代码丢弃后,如何找回

git 代码找回

yyXieDaiMa的博客 1693

Git-丢失的 commit 是真的消失了吗?

当然没有,它只是被挂了起来 丢失的 commit 变成了 dangling commit 所谓“丢失的 commit”其实并没有消失,而是成为了一个 dangling commit(悬挂的提交?有点奇怪的翻译,意思是没有任何分支指针或头指针指向它,于是被悬挂了起来),等待 Git 回收。 而关于 Git 回收,Git 虽然会不定时地自动运行称为 “git auto gc” 的命令,但...

浅浅同学的开发笔记 1万+

git找回commit

由于一些原因,本地仓库中的一个commit没有提交到远程仓库,原来丢失commit一般通过git reflog这条命令可以吧head最近到更新显示出来, 但是好像只能显示22条Head的更新,Google了一下找到了下面的命令git fsck --lost-found这条命令就是找到哪些没有提交的commit,如图 这条命令打印的commit没有规律,只能通过git show一个一个查看,效率

lchj_yyl的博客 632

git stash误使用drop删掉本地保存,再恢复代码一次记录

前言:在使用git时候我们会临时切换一些分支,而切换时候你本地会有一些更改了的代码,但是这些代码还没有写完整,所以我们一般会进行git stash 本地保存一下。然后等后面代码切换回来之后...

良知犹存的博客 1686

如何恢复 git reset --hard 删除的文件

昨天,不小心使用了下面的Git命令,结果导致了文件被删除了,花了很大力气才恢复出来。 起因: 刚提交了代码,发现还有些文件忘记提交了,于是想revert这个提交。 随便从网上搜了篇文章,然后执行 git reset --hard xxx  结果 ... 发现工作区最近这几天的改动,新创建的文件都没有了。 $ git status # On branch master # Ch

清风冰竹 1万+

git 因强制切换分支导致未commit的文件丢失解决方案

打开git bash执行命令git fsck --lost-found 在.git/lost-found/other/ 可以看到一堆文件,点进去一个一个查看所需文件就行

weixin_51422660的博客 1654

git 高级使用

git

xyznol的博客 402

git恢复不小心删除的文件

git fsck --lost-found查找未提交而被删除的记录.git show + 查找的删除记录文件,确认需要恢复的内容git merge+查找的删除记录文件,合并被删除的记录

DuanZeting的博客 1256
上一篇: PiDiNet vs 传统CNN:边缘检测性能对比与实战评测
下一篇: 电能质量分析不求人:手把手教你用FLUKE 1775搞定谐波测量与THD计算
code8
博客等级 码龄17年 65粉丝 1720原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值