为什么git有些commit记录,只有git reflog可以看到,git log看不到?

news2024/9/22 21:46:33

在这里插入图片描述

文章目录

      • 原因分析
        • 1. `git log` 只能显示 **可达的** 提交
        • 2. `git reflog` 记录所有引用的变更
      • 常见导致 `git log` 看不到提交的原因
        • 1. `git reset` 操作
        • 2. `git rebase` 操作
        • 3. 分支删除
        • 4. `git commit --amend`
        • 5. 垃圾回收(GC)*
      • 如何恢复 `git log` 看不到的提交?
      • 总结

在 Git 中,有些提交记录只能通过 git reflog 查看,而 git log 无法显示。这种情况通常是因为提交历史已经发生了某种形式的“变更”,导致这些提交不再是当前分支或其他引用(如标签、远程分支)的可达提交。

原因分析

1. git log 只能显示 可达的 提交

git log 的工作机制是基于 可达性(reachability)原则。它只会显示从当前分支 HEAD 或其他引用(如标签、远程分支)可达的提交。所谓“可达”,指的是从某个提交开始,通过提交的父子关系可以沿链条一直追溯到该提交。

  • 如果一个提交从当前分支的链条上“消失”了(例如通过 git resetgit rebase 等操作导致提交链被重写或分支被删除),那么这些提交将不再被视为“可达”。
  • git log 不会显示这些提交,因为它只展示当前分支上的提交历史。
2. git reflog 记录所有引用的变更

git reflog 不同,它记录的是 本地引用(HEAD、分支等)的所有变化,无论提交是否可达。因此,git reflog 可以看到很多“隐藏”的提交,包括被 git resetgit rebase 覆盖掉的提交、误操作后丢失的提交,甚至是分支被删除后的提交。

只要你在本地进行过操作,git reflog 会记录:

  • 提交、合并、拉取等操作。
  • 分支的切换(checkout)。
  • 重置(reset)或变基(rebase)。
  • HEAD 指针的移动。

即便你删除了一个分支或者重置了当前分支,git reflog 依然能显示这些操作的历史。

常见导致 git log 看不到提交的原因

1. git reset 操作

git reset 是一种常用的操作,用于回滚分支到某个特定的提交。它有三种模式:--soft--mixed--hard。其中,git reset --hard 不仅会回滚分支指针,还会重置工作目录。

如果你使用了 git reset --hard 回退到某个较早的提交,那么中间的提交将不再被当前分支所引用,也就是说,这些提交就 不可达 了。在 git log 中你将看不到这些提交,但 git reflog 依然记录了它们。

示例:

git reset --hard HEAD~3  # 回滚到3个提交之前

在执行这个操作后,最近的 3 次提交虽然丢失了,但可以通过 git reflog 找回。

2. git rebase 操作

git rebase 是一个用于重写提交历史的操作,它会将提交重新应用到新的基点上。过程中,原有的提交会被替换为新的提交,这样就导致了原来的提交从分支历史中“消失”。

即使 git log 不再显示这些被替换的提交,它们仍然会保留在 git reflog 中,直到这些提交被垃圾回收(GC)。

3. 分支删除

当你删除一个分支时,该分支上最后的提交不再被任何引用指向,导致这些提交成为“悬空”提交(dangling commit)。这些提交虽然无法在 git log 中看到,但在 git reflog 中,分支的删除和之前的提交历史仍然可以被追踪。

示例:

git branch -d feature_branch

删除 feature_branch 后,你不能再通过 git log 看到该分支的提交记录,但 git reflog 仍然会记录你删除该分支的操作。

4. git commit --amend

使用 git commit --amend 修改最近一次提交时,实际上会创建一个新的提交,原来的提交被替换掉。git log 只能显示修改后的提交,而 git reflog 可以看到原始提交及修改过程。

5. 垃圾回收(GC)*

Git 的垃圾回收机制(git gc)会清理那些没有被引用且过期的对象。当一个提交没有任何分支、标签等引用指向它时,经过一段时间后,这些提交可能会被垃圾回收从 Git 数据库中删除。不过在被 GC 删除之前,git reflog 仍然能看到这些提交。

如何恢复 git log 看不到的提交?

如果你在 git log 中看不到某个提交,但它在 git reflog 中依然存在,你可以通过以下方法恢复这些提交:

  1. 使用 git reset 恢复到某个提交

    • git reflog 中找到想要恢复的提交哈希值。
    • 然后使用 git resetgit checkout 恢复。

    例如:

    git reflog
    # 找到需要恢复的提交,假设是 abc1234
    git reset --hard abc1234
    
  2. 创建一个新的分支指向该提交
    如果你不想影响当前的分支,可以创建一个新的分支指向丢失的提交:

    git branch recovered-branch abc1234
    

    这样你就能在新的分支上查看并操作该提交的历史。

总结

  • git log 只显示当前分支上的 可达提交,即有分支或标签引用的提交。
  • git reflog 记录了所有本地引用(如 HEAD)的变化,能够显示 git log 看不到的提交,尤其是那些通过 resetrebase、分支删除等操作被“丢失”的提交。
  • 可以通过 git reflog 找到丢失的提交,并通过 git reset 或创建新分支来恢复这些提交。

git reflog 是一个非常有用的工具,特别是在你需要恢复意外丢失的提交时。


结束语
Flutter是一个由Google开发的开源UI工具包,它可以让您在不同平台上创建高质量、美观的应用程序,而无需编写大量平台特定的代码。我将学习和深入研究Flutter的方方面面。从基础知识到高级技巧,从UI设计到性能优化,欢饮关注一起讨论学习,共同进入Flutter的精彩世界!

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

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

相关文章

QT实现升级进度条页面

一.功能说明 在Qt中实现固件升级的进度条显示窗口,你可以通过创建一个自定义的对话框(Dialog)来完成。这个对话框可以包含一个进度条(QProgressBar)、一些文本标签(QLabel)用于显示状态信息&am…

学生管理系统1.0版本

学生管理系统1.0版本有5个功能,即添加学生、删除学生、修改学生、查看全部学生、退出系统。 里面对添加重复学号、删除和修改不存在的学号等问题都有相应的解决办法。 代码区: Student.java package student;//快捷键Altinsert public class Student …

iOS 消息机制详解

应用 解决NSTimer、CADisplayLink循环引用。 二者都是基于runloop的定时器,由于处理事件内容不一样,runloop 每运行一次运行耗时就不一样,无法准确的定时触发timer的事件。 NSProxy 与 NSObject 如果继承自NSProxy 直接开始消息转发&…

【comfyUI工作流】一键生成专属欧美漫画!

现在你不需要在webui上手动设置一堆的参数 来将自己的照片转绘成欧美漫画插画 可以通过我制作的工作流一键完成转绘,更加效率便捷, 而且不需要你懂什么专业的AI绘画知识,会打开工作流,上传图片就可以 工作流特点 真实照片一键…

linux StarRocks 安装

一、检查服务器是否支持avx2,如果执行命令显示空,则不支持,那么安装后无法启动BE cat /proc/cpuinfo |grep avx2我的支持显示如下: 二、安装 docker run -p 9030:9030 -p 8030:8030 -p 8040:8040 -p 9001:9000 --privilegedtrue…

开源PHP导航网源码/精美简约网址导航收录网站/QQ技术导航程序

源码简介: 一款给力的开源PHP导航网源码,它不仅外观精美简约,还是个网址导航收录网站/QQ技术导航程序哦! 在信息爆炸的时代,找网页就像大海捞针一样难。但是有了像PHP 导航网这样的神器,一切都变得简单了…

Gin框架入门(1)--路由搭建与Json处理

背景知识 为什么要使用Go框架 如果不使用框架,在创建服务器和调用端口时会遇到各种各样“奇怪”的问题(就是出错的排查方向可能达到十几种),而且这些问题很难有相似性。同时作为适应于微服务的一门语言,代码的规范化…

【计算机组成原理】主存储器深度解析

📢博客主页:https://blog.csdn.net/2301_779549673 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📢本文由 JohnKi 原创,首发于 CSDN🙉 📢未来很长&#…

基于SpringBoot+Vue的时尚美妆电商网站系统

作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、SSM项目源码 精品专栏:Java精选实战项目源码、Python精…

Windows下安装Neo4j流程

Neo4j简介 Neo4j 是一个基于图形结构的 NoSQL 数据库,专门用于存储和管理图数据。与传统的关系型数据库不同,Neo4j 使用 图(graph)的形式来表示数据,其中数据点(称为 节点)通过 边(…

GUI编程19:贪吃蛇小游戏及GUI总结

视频链接:21、贪吃蛇之界面绘制_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1DJ411B75F?p21&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 1.游戏中用的的图片素材 1.贪吃蛇游戏的主启动类StartGame; package com.yundait.snake;import j…

【ArcGISPro】配置模块

ArcGIS Pro 配置类似于加载项,但提供了扩展应用程序的其他方法。它可以帮助您设计更贴近您组织品牌和工作流的 ArcGIS Pro 版本。 托管配置是比 Add-in 更高级别的自定义。 配置可以提高加载项安全级别并添加非管理员指定的已知文件夹。 配置可以提供比插件更广泛…

全国832个贫困县名单及精准扶贫脱贫数据(2016-2020.11)

自党的十八大以来,通过全党全国各族人民的共同努力,中国成功实现了现行标准下9899万农村贫困人口的全部脱贫,832个贫困县全部摘帽。 摘帽名单 2016年-2020.11全国832个贫困县名单及精准扶贫脱贫数据整理(大数据)https…

图解 TCP 四次挥手|深度解析|为什么是四次|为什么要等2MSL

写在前面 今天我们来图解一下TCP的四次挥手、深度解析为什么是四次? 上一片文章我们已经介绍了TCP的三次握手 解析四次挥手 数据传输完毕之后,通信的双方都可释放连接。现在客户端A和服务端B都处于ESTABLISHED状态。 第一次挥手 客户端A的应用进…

笔尖划出秋季的声息

笔尖划出秋季的声息 进入秋分,天气渐趋凉爽,天空青蓝明朗,难言伤感。 九月,把一些句子记录好,明年拿出来晒一晒,秋季也就有了答案。 1、经历 9月6日,台风“摩羯”席卷而过粤西,…

尚品汇-秒杀商品定时任务存入缓存、Redis发布订阅实现状态位(五十一)

目录: (1)秒杀业务分析 (2)搭建秒杀模块 (3)秒杀商品导入缓存 (4)redis发布与订阅实现 (1)秒杀业务分析 需求分析 所谓“秒杀”&#xff0…

STM32CSDK生成代码报错

STM32CubeMX not found 在使用STM32CSDK时报错 STM32CubeMX not found - ver. “5.2.0” or higher is required Download STM32CubeMx 解决方案 重新安装STM32CubeMX,选择为所有用户安装 MotorControl reference pack not found: 解决方案 1.选择合适的STM32…

Python语法(二)——函数

文章目录 函数语法格式函数参数链式调用嵌套调用函数递归变量作用域 函数 一段可以被重复使用的代码片段 求数列的和, 不使用函数 # 1.求1-100的和 sum 0 for i in range(1, 101):sum i print(fsum {sum})# 2.求300-400的和 sum 0 for i in range(300, 401):sum i print(…

为什么推荐使用英文版LabVIEW

在LabVIEW开发中,中文版和英文版主要在界面语言、功能习惯以及社区支持等方面存在差异。以下是两者的特点以及推荐使用英文版的原因: 中文版特点: 界面和帮助文档为中文:对于中文母语开发者来说,中文版LabVIEW的界面和…

在 Windows 11 中,可以通过修改注册表来更改系统的自动更新时间设置

regedit 计算机\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings FlightSettingsMaxPauseDays 36524