当前位置: 首页 > news >正文

简单介绍一下 git reflog

1. 使用场景

git reflog 用于记录和查看所有对 HEAD 引用所做的历史更改。它不仅记录每一次提交,还包括分支切换、合并、重置等所有可能影响 HEAD 的操作。即使丢失了提交或回滚操作,也可以通过 git reflog 找回和恢复这些操作。

2. 具体用法

1、查看 HEAD 的历史记录

git reflog

这会列出所有 HEAD 的变动记录。例如:

8d67418 (HEAD -> main) HEAD@{0}: commit: added feature X
abc1234 HEAD@{1}: checkout: moving from feature to main
def5678 HEAD@{2}: commit: implemented feature Y
6bde123 HEAD@{3}: merge feature-branch: merge code

每条记录包括:

1)提交哈希:对应的提交 ID。

2)索引编号:表示历史记录的顺序,HEAD@{0} 是最新的操作。

3)操作说明:描述操作的类型和内容,如 commit、checkout、merge 等。

2、恢复误删的提交

假设我们使用 git reset --hard 丢失了某些提交,但这些提交还在 reflog 里。

可以通过以下步骤找回:

1)查看 reflog 记录

git reflog# 假设为以下内容:
8d67418 (HEAD -> main) HEAD@{0}: reset: moving to HEAD~2
abc1234 HEAD@{1}: commit: added feature Z
def5678 HEAD@{2}: commit: fixed bug Y

2)恢复特定提交

git reset --hard def5678

这会将当前分支重置到 def5678,恢复丢失的提交。

3、回退到某个特定的状态

如果我们想回到某个历史状态,可以使用 git reflog 找到对应的记录,然后使用 git reset 或 git checkout:

1)查找目标记录

git reflog

假设发现了一个提交 abc1234 是我们想恢复到的状态。

2)使用 reset 回退或使用 checkout 创建新分支

git reset --hard abc1234
git checkout -b <new-branch-name> abc1234

4、恢复删除的分支

假如我们不小心删除了一个分支,但在 reflog 中还能找到它的最后一次提交。

# 1. 查找删除前的分支 HEAD
git reflog# 假设为如下记录:
1234567 HEAD@{0}: checkout: moving from deleted-branch to main
abc1234 deleted-branch@{1}: commit: final changes on deleted branch# 2. 恢复删除的分支
git branch deleted-branch abc1234

这会重新创建 deleted-branch 并指向 abc1234。

5、查看特定分支或引用的历史

git reflog show <branch-name>

git reflog 默认查看当前分支的全部修改记录,也可以指定分支或引用来查看它们的历史记录。

3. 总结

git reflog 是一个强大的 Git 命令,允许我们追踪和恢复任何操作记录。无论进行了哪些操作,reflog 都会记录它们,并且这些记录不会因为垃圾回收(git gc)而立即消失。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 10、MySQL-索引
  • centos7 启动python后端服务与停止服务的sh脚本
  • Django 自定义用户 VS 用户资料
  • SpringBoot排除默认日志框架
  • 机器学习知识点全面总结
  • VueRouter的使用
  • 可视化基础的设计四大原则
  • OpenCV图像滤波(5)二维卷积滤波函数filter2D()的使用
  • final finally finalize 区别?
  • 【多线程基础】指令、进程调度、了解计算机是如何进行工作的
  • TDengine Cloud 助力智源未来,引领能源管理革新
  • 服务器CPU架构有几种?分别应用到什么场景?有啥优缺点?
  • eBPF编程指南(一):eBPF初体验
  • 【网络】协议,OSI参考模型,局域网通信,跨网络通信
  • FFmpeg推流
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • HTTP中的ETag在移动客户端的应用
  • java多线程
  • Java多线程(4):使用线程池执行定时任务
  • MySQL主从复制读写分离及奇怪的问题
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • Redis 懒删除(lazy free)简史
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • 分享几个不错的工具
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 前端工程化(Gulp、Webpack)-webpack
  • 前端面试总结(at, md)
  • 前端学习笔记之观察者模式
  • 微信小程序开发问题汇总
  • ​LeetCode解法汇总307. 区域和检索 - 数组可修改
  • # Kafka_深入探秘者(2):kafka 生产者
  • #pragma multi_compile #pragma shader_feature
  • #pragma pack(1)
  • (10)ATF MMU转换表
  • (Bean工厂的后处理器入门)学习Spring的第七天
  • (PySpark)RDD实验实战——取最大数出现的次数
  • (搬运以学习)flask 上下文的实现
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (十) 初识 Docker file
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (杂交版)植物大战僵尸
  • .【机器学习】隐马尔可夫模型(Hidden Markov Model,HMM)
  • .bat批处理(五):遍历指定目录下资源文件并更新
  • .net core 外观者设计模式 实现,多种支付选择
  • .net framework 4.0中如何 输出 form 的name属性。
  • .NET Remoting学习笔记(三)信道
  • .net 使用$.ajax实现从前台调用后台方法(包含静态方法和非静态方法调用)
  • .Net多线程Threading相关详解
  • .Net环境下的缓存技术介绍
  • .NET开发人员必知的八个网站
  • .net实现头像缩放截取功能 -----转载自accp教程网
  • .net下的富文本编辑器FCKeditor的配置方法
  • @Autowired标签与 @Resource标签 的区别
  • [ element-ui:table ] 设置table中某些行数据禁止被选中,通过selectable 定义方法解决
  • [ vulhub漏洞复现篇 ] GhostScript 沙箱绕过(任意命令执行)漏洞CVE-2019-6116