Git进阶系列 | 8. 用Reflog恢复丢失的提交

news2025/1/10 10:23:16

Git是最流行的代码版本控制系统,这一系列文章介绍了一些Git的高阶使用方式,从而帮助我们可以更好的利用Git的能力。本系列一共8篇文章,这是最后一篇。原文:Using the Reflog to Restore Lost Commits[1]

“Reflog”是Git不太为人所知的特性之一,但可能非常有用。有些人把它称为“安全网”,而我喜欢把它看作Git的“日记”,因为Git用它来记录HEAD指针的每次移动(例如,每次提交、合并、rebase、cherry-pick、reset等)。Git会将操作记录在Reflog中,使它成为一个有价值的日志,当出现问题时,这是一个很好的起点。

在“Git进阶”系列的最后一部分,我将解释git loggit reflog之间的区别,并展示如何使用reflog来恢复已删除的提交和已删除的分支。

Git进阶系列:

  1. 创建完美的提交
  2. Git中的分支策略
  3. 基于Pull Request实现更好的协作
  4. 合并冲突
  5. Rebase vs Merge
  6. 交互式Rebase
  7. Git中的Cherry-pick提交
  8. 用Reflog恢复丢失的提交(本文)

git loggit reflog有什么区别?

在之前的文章中,我建议使用git log命令检查事件并查看提交历史,这正是它的工作。它可以显示当前的HEAD及其祖先,即父提交,下一个父提交,等等。git log通过递归打印每个提交的父节点来回溯提交历史,这是代码库的一部分,这意味着在push、fetch、pull之后这些信息都会被复制。

另一方面,git reflog是一个私有的、与工作空间相关的记录。它不遍历祖先列表。相反,它显示一个有序列表,包含HEAD过去所指向的所有提交。这就是为什么可以把它看作某种“撤销历史(undo history)”,就像在文字处理器、文本编辑器等中看到的那样。

技术上来说,这个本地记录不是代码库的一部分,它与提交分开存储。Reflog是.git/logs/refs/heads/中的一个文件,用来跟踪每个分支的本地提交。Git的日志通常会在90天后被清理(这是默认设置),但是可以轻松调整Reflog的过期日期。要将过期时间更改为180天,只需输入以下命令:

$ git config gc.reflogExpire 180.days.ago
仓库配置文件(.git/config)包含变量reflogExpire,值为180.days.ago
仓库配置文件(.git/config)包含变量reflogExpire,值为180.days.ago

或者可以设置Reflog永不过期:

$ git config gc.reflogExpire never

提示: 记住,Git区分了代码库的配置文件(.git /config)、每个用户的全局配置($HOME/.gitconfig)和系统全局设置(/etc/gitconfig)。要为用户或系统调整Reflog的过期时间,请在上面所示的命令后面添加--system--global参数。

好了,现在我们有了足够的理论背景知识,接下来可以展示如何使用git reflog来纠正错误。

恢复删除的提交

想象一下下面这个场景: 在查看了提交历史之后,我们决定删除最后两次提交。勇敢的执行了一次git reset后,两个提交从提交历史中消失了……过了一会儿,我们发现犯了个错误,我们丢失了有价值的更改,完蛋了!

alt

真的要从头再来吗?不。换句话说,保持冷静,利用git reflog

所以,让我们尝试把事情搞砸,在现实生活中真的犯一下错。下图展示了我们最初在Tower中的提交历史:

alt

我们想要删除两个提交,并将“Change headlines for about and imprint”提交(ID: 2b504bee)作为master分支上的最后一个修改。我们需要做的就是将哈希ID复制到剪贴板,然后在命令行中使用git reset并输入哈希:

$ git reset --hard 2b504bee
alt

瞧。提交已经消失。现在,我们假设这是一个错误,并查看Reflog来恢复丢失的数据。在终端中输入git reflog查看日志:

alt

有没有注意到所有条目都是按时间顺序排列的,这意味着顶部是最近的(也就是最新的)提交。如果仔细看,会注意到几分钟前致命的git reset操作就在顶部。

日记似乎起作用了,这是个好消息。因此,我们用它来撤销最后一个操作,并在执行reset命令之前恢复状态。与前面一样,将哈希ID(在这个特定示例中为e5b19e4)复制到剪贴板,再次使用git reset,这完全有效。但在本例中,我将基于旧状态创建一个新分支:

$ git branch happy-ending e5b19e4

再看看图形化Git客户端:

alt

如你所见,已经创建了新的happy-ending分支,包含了之前删除的提交。太棒了,什么都没丢!

接下来看看另一个示例,用Reflog来恢复整个分支。

恢复删除的分支

下面的示例和第一个场景类似,我们要删除一些东西,只是这一次要删除的是整个分支。也许你的客户或团队领导告诉你要摆脱一个特性分支,也许你自己想要进行清理。糟糕的是,有个提交(图中的C3)没有被包含在任何其他分支中,所以肯定会丢失数据:

alt

我们来实际执行这个操作,稍后再恢复分支:

alt

在删除分支feature/login之前,需要先切换出来。(正如截图中所示,这是当前的HEAD分支,不能在Git中删除HEAD分支。)所以,我们要切换分支(到master),然后删除feature/login:

alt

好吧,假设我们的客户或团队领导改变了主意,现在又需要feature/login分支(包括它的提交)了,怎么办?

看看Git的日记:

$ git reflog
776f8ca (HEAD -> master) HEAD@{0}: checkout: moving from feature/login to master
b1c249b (feature/login) HEAD@{1}: checkout: moving from master to feature/login
[...]

我们又很幸运,最后一项显示了从feature/loginmaster的切换。我们尝试返回到之前的状态,将哈希ID b1c249b复制到剪贴板,接下来,基于期望的状态创建一个名为feature/login的分支:

$ git branch feature/login b1c249b
$ git branch -vv
  feature/login b1c249b Change Imprint page title
* master        776f8ca Change about title and delete error page

太棒了,分支死而复生,仍然包含了我们认为已经丢失的有价值的提交:

alt

如果使用像Tower这样的桌面GUI,可以简单的按下CMD+Z来撤销最后一个操作,就像文本编辑器或文字处理器一样。

保持冷静,保证记录

Git的Reflog可以成为真正的救星!如你所见,很容易将丢失的提交甚至整个分支从坟墓中带回来,只需要在reflog中找到正确的哈希ID,其他都是小菜一碟。

如果想更深入了解高级Git工具,可以免费查看“Advanced Git Kit[3]”: 这是关于分支策略、交互式Rebase、Reflog、子模块等主题的短视频集合。

本文是“Git进阶”系列的最后一部分,希望你喜欢这些文章。编码快乐!

References:
[1] Using the Reflog to Restore Lost Commits: https://css-tricks.com/using-the-reflog-to-restore-lost-commits/

你好,我是俞凡,在Motorola做过研发,现在在Mavenir做技术工作,对通信、网络、后端架构、云原生、DevOps、CICD、区块链、AI等技术始终保持着浓厚的兴趣,平时喜欢阅读、思考,相信持续学习、终身成长,欢迎一起交流学习。
微信公众号:DeepNoMind

- END -

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/685853.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

常见的未授权漏洞批量检测工具

常见的未授权漏洞检测 命令行版已放出支持多线程,批量扫描,指定服务扫描,命令行版地址https://github.com/xk11z/unauthorized_com GUI版unauthorizedV2已更新,可批量ip检测导出结果 项目包含 1 、FTP 未授权访问&#xff08…

SadTalker AI模型使用一张图片与一段音频便可以自动生成视频

SadTalker模型是一个使用图片与音频文件自动合成人物说话动画的开源模型,我们自己给模型一张图片以及一段音频文件,模型会根据音频文件把传递的图片进行人脸的相应动作,比如张嘴,眨眼,移动头部等动作。 SadTalker,它从音频中生成 3DMM 的 3D 运动系数(头部姿势、表情),…

webstorm配置vue开发环境

🌳🌳🌳前言:本文章针对于如何用IDE和webstorm运行一个别人的vue项目进行步骤记录。 📙参考:(10条消息) idea配置vue开发环境_idea配置vue运行环境_drinkworld的博客-CSDN博客https://blog.csdn.net/drinkwo…

VSCode ssh ubuntu20显示图像界面

1、在vscode中安装 Remote X11(SSH) 2、在本地端安装MobaXterm 点击Settings-->Configurations-->X11,设置如下: 3、在服务端修改 ~/.bashrc文件,在末尾添加 export DISPLAY"192.168.0.201:0.0" 其中引号中内容为本地端IP地…

英伟达股价能否凭借AI进一步上涨到500美元?

来源: 猛兽财经 作者:猛兽财经 猛兽财经在之前的关于英伟达的分析中(5月2日),就认为英伟达在人工智能方面的增长潜力还没有完全释放出来,并认为英伟达的股价将会很快涨到300美元,结果到了6月…

代码随想录二刷 day34 | 贪心之1005.K次取反后最大化的数组和 134. 加油站 135. 分发糖果

1005.K次取反后最大化的数组和 题目链接 解题思路: 两次贪心 如何可以让数组和最大呢? 局部最优:让绝对值大的负数变为正数,当前数值达到最大,整体最优:整个数组和达到最大 如何转变K次正负,让…

CASS打印地形图操作

1、打开地形图,如下: 2、在“工程应用”菜单栏中,选择“查询两点距离及方位”,如下: 3、量取地形图的大致范围大小,如下: 读取图上距离,用于设置纸张大小。 4、点击左上角打印图形&…

【算法题】神奇的斐波那契数列(Fibonacci sequence)、青蛙跳台阶问题、矩阵中的路径

神奇的斐波那契数列和青蛙跳台阶问题 一、神奇的斐波那契数列1.1、题目描述1.2、递归算法1.3、迭代法1.4、小结 二、青蛙跳台阶问题2.1、题目描述2.2、思路2.3、动态规划法2.4、小结 三、矩阵中的路径3.1、题目描述3.2、思路3.3、代码实现3.4、小结 总结 一、神奇的斐波那契数列…

卫星地图应用经典实例项目(7个)

本文会介绍引用一些非常好的卫星地图等相关的应用,一方面给大家增加见识,另一方面会提供一些设计开发的思路以及代码。 文章目录 热气球追踪系统googlemap实现卫星轨迹satvis卫星Cesium系统NASA的worldview系统项目Esri-Satellite-Map基于leaflet的卫星轨迹绘制项目地球当前…

关于Altium Designer 差分线规则设置的方法纠偏

本文适用于AD20以后版本。在AD的原理图及pcb的4年设计学习中,入门课是学校的AD09,简单的两层板绘制。后来因工作需要,就报了培训班,学习了基于AD19的相关使用方法。后来在很多的项目开发中,逐渐发现之前从书本、培训课…

Qt QGraphicsScene模块实现圆点绘制在所有窗体的最前方,实现圆点的“彩色拖尾”效果以及“选中方框”效果

文章目录 前言1、效果2、代码实现2.1 思路2.1.1 “拖尾”效果2.1.2 “选中方框区域”效果2.2 代码 总结 系列文章: (一)Qt 将某控件、图案绘制在最前面的方法,通过QGraphicsScene模块实现 (二)Qt QGraphics…

【SCI/SSCI/EI录用案例】仅26天录用,1天见刊

【Unionpub学术】录用/见刊/检索案例:2023年6月10日-2023年6月16日 2区材料类SCI 【期刊简介】IF:3.5-4.0,JCR2区,中科院3区 【检索情况】SCI 在检,正刊 【征稿领域】降解材料及其相关技术的研发,如聚合物基轻质材…

PyTorch 2简介:卷积神经网络

介绍 在本系列的上一部分中,我们使用了CIFAR-10数据集,并介绍了PyTorch的基础知识: 张量及其相关操作数据集和数据加载器构建基本的神经网络基本模型的训练和评估 我们为CIFAR-10数据集中的图像分类开发的模型只能在验证集上达到53%的准确率&…

Observability:为 Logstash 输出配置 SSL/TLS - Elastic Agent

在我之前的文章 “Observability:如何把 Elastic Agent 采集的数据输入到 Logstash 并最终写入到 Elasticsearch”,我详细介绍了如何使用 Elastic Agents 采集数据并把数据通过 Logstash 发送至 Elasticsearch。细心的开发者可能注意到从 Elastic Agents…

Jmeter(三) - 从入门到精通 - 测试计划(Test Plan)的元件(详解教程)

1.简介 上一篇中我已经教你如何通过JMeter来创建一个测试计划(Test Plan),那么这一篇我们就将JMeter启动起来,创建一个测试计划(Test plan),然后现在给大家介绍一下测试计划(Test P…

Redis和数据库保持数据一致性方案

Redis和数据库一致性又称为“双写一致性”,在分布式系统中,由于多个节点之间的并发读写操作,可能导致数据不一致的情况发生。本文将着重介绍如何通过使用Redis与数据库相结合的方案来实现数据一致性。 数据不一致产生的原因: 首先…

Android应用开发(5)Activity生命周期

Android应用开发学习笔记——目录索引 参考android官网: https://developer.android.google.cn/reference/android/app/Activity.html activity 生命周期的阶段 | Android 开发者 | Android Developers activity生命周期(这篇足够了)_…

pycharm中插件的使用;

pycharm中插件的使用; 1.英语翻译插件 Translation 使用方法 在pycharm中输入英文,右键,例如输入port想知道这个意思, 中文 也是一样的 2.pycharm的中文界面插件,安装后就是中文界面了

VSCode编译器环境下,调试3d-tiles-validator

VSCode编译器环境下,调试3d-tiles-validator 1. 源代码环境准备2. VsCode环境装备3. 调试 1. 源代码环境准备 参照3d-tiles-validator仓库的README.md文件 Clone the repository into the current directory:git clone https://github.com/CesiumGS/3d-tiles-vali…

Dubbo3.0.7+Nacos2.0.3整合服务注册及发现

Dubbo3的新特性和修改这里就不再赘述了&#xff0c;个人认为主要是注册的颗粒度的改变&#xff0c;把之前的接口级改成了应用级&#xff0c;减少了注册列表的数量更易于维护。 服务端&#xff1a; pom.xml <dependencies><dependency><groupId>org.spring…