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

news/2024/9/23 20:16:31/

在这里插入图片描述

文章目录

      • 原因分析
        • 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 无法显示。这种情况通常是因为提交历史已经发生了某种形式的“变更”,导致这些提交不再是当前分支或其他引用(如标签、远程分支)的可达提交。

原因分析

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

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

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

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

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

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

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

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

git_reset__29">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 找回。

git_rebase__41">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 仍然会记录你删除该分支的操作。

git_commit_amend_57">4. git commit --amend

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

5. 垃圾回收(GC)*

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

git_log__65">如何恢复 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.ppmy.cn/news/1529471.html

相关文章

OJ在线评测系统 登录页面开发 前端后端联调实现全栈开发

前端 登录页面就是一个让用户输入账号和密码的表单 使用acro组件 先写布局 <a-form-item field"userAccount" label"账号"><a-input v-model"form.userAccount" placeholder"请输入账号" /></a-form-item><a-…

STM32 通过软件模拟 I2C 驱动 24Cxx 系列存储器

目录 一、AT24CXXX 系列存储器介绍1、基本信息2、寻址方式3、页地址与页内单元地址4、I2C 地址5、AT24CXX 的数据读写5.1 写操作5.1.1 按字节写5.1.2 按页写 5.2 读操作5.2.1 当前地址读取5.2.2 随机地址读取5.2.3 顺序读取 二、代码实现1、ctl_i2c2、at24c3、测试程序 I2C 相关…

C语言编译四大阶段

目录 一、引言 二、预处理阶段 三、编译阶段 四、汇编阶段 五、链接阶段 六、总结 本文将详细介绍C语言编译的四个阶段&#xff0c;包括预处理、编译、汇编和链接。通过学习这些阶段&#xff0c;读者可以更好地理解C语言程序的编译过程&#xff0c;提高编程效率。 一、引…

Linux自主学习篇

用户及权限管理 sudo 是 "superuser do" 的缩写&#xff0c;是一个在类 Unix 操作系统&#xff08;如 Linux 和 macOS&#xff09;中使用的命令。它允许普通用户以超级用户&#xff08;root 用户&#xff09;的身份执行命令&#xff0c;从而获得更高的权限。 useradd…

gin参数绑定panic错误分析

gin参数绑定panic错误分析 经过长期实践 func (e *SubscribeApi) FnExample(c *gin.Context) {//获取参数并检验var req *request.FnReqif err : c.ShouldBindQuery(&req); err ! nil {response.FailWithMsg(c, "Parameter validation error: "err.Error())retu…

VS code EXPLORER 中不显示指定文件及文件夹设置(如.pyc, __pycache__, .vscode 文件)

VS code EXPLORER 中不显示指定文件及文件夹设置 引言正文方法1打开方式1打开方式2 方法2 引言 VS code 号称地表最强轻量级编译器&#xff0c;其最大的优势在于用户可以根据自己的需求下载适合自己的 extension。从而定制个性化的编译器。然而&#xff0c;本人今天遇到了一个…

spark 广播和累加器

广播变量允许开发者将一个较大的、只读的变量缓存到每个工作节点&#xff08;Executor&#xff09;的内存中&#xff0c;而不是在每个任务&#xff08;Task&#xff09;中复制一份。这样做可以显著减少数据的传输量&#xff0c;提高计算效率&#xff0c;特别是在处理大型数据集…

如何使用 Helm 管理 Kubernetes 集群

Helm 是 Kubernetes 的包管理工具&#xff0c;简化了在 Kubernetes 上安装、更新、管理应用的流程。通过 Helm&#xff0c;开发者可以快速部署复杂的应用程序&#xff0c;类似于使用 apt、yum 或 Homebrew 安装软件包。在本文中&#xff0c;我们将详细介绍如何安装和配置 Helm&…