首页 > 其他分享 >为什么git有些commit记录,只有git reflog可以看到,git log看不到?

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

时间:2024-09-21 09:22:08浏览次数:3  
标签:reset git log reflog 提交 commit 分支

在这里插入图片描述

文章目录


在 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的精彩世界!

标签:reset,git,log,reflog,提交,commit,分支
From: https://blog.csdn.net/yikezhuixun/article/details/142410998

相关文章

  • Mini-git,了解文件如何存储在 Git 对象中
    昨天,我开始自己实现Git的核心功能之一——具体来说,文件是如何存储的、Git对象是什么、以及哈希和压缩的过程。我花了4个小时来开发,在这篇文章中,我将向您介绍我的思考过程和方法。当您提交文件时会发生什么?当您在Git中提交文件时,会在幕后发生几个重要步骤:文件压......
  • POLIR-Society-Sociology-Individual-Social Identity Theory: 社会身份理论
    POLIR-Society-Sociology:社会学Individual:SocialIdentityTheory:社会身份理论InSociology,WehavethisSocialIdentifyTheory,Whichisabouthowwedefineourselvesasindividualperson,ShowcasingWhowewanttobeandHowotherpeopleseeusasaperso......
  • Git 撤销合并
    合并时冲突合并时存在冲突,冲突未解决或者解决到一半不想解决了,或者解决完冲突了但是还没提交,想要回退到合并前的状态,使用gitmerge--abort来退出合并。该命令会尝试恢复到合并前的状态。注意在合并前,最好把改动暂存或者提交,总之就是尽可能保持工作目录干净再合并,否则可能会有些......
  • git
    git是一个强大的版本控制系统,用于跨多个用户管理代码并跟踪不同版本之间的更改。安装:从以下路径下载并安装githttps://git-scm.com/download/win登录后复制安装后,git可以通过各种命令用作版本控制系统。您可以为计算机上的特定文件夹配置git,从而允许您管理对现有文件的所有更改......
  • git使用“保姆级”教程2——初始化及工作机制解释
    1、设置用户签名解释:签名的作用就是用来:标识用户,以区分不同的开发人员简单来说:用来标识"你是谁",在提交代码时,会显示提交代码的是谁,把设置的信息一起提交上去设置://建议最好global全局设置,这样可以在任何文件下使用git时,都不用重新设置用户签名了gitconfig--glo......
  • 模仿glog风格的log实现
    需求实现一个类似glog风格支持<<链式调用的log库。代码利用的析构函数的特性,每次LOG结束后会自动调用,完成消息拼接。#include<string>#include<iostream>classLOG{public:LOG(intlv){level=lv;body="";}template<typename......
  • centos(linux): logrotate常用功能
    一,测试配置是否正确?-d:打印debug信息-v:显示详细的输出信息[[email protected]]#logrotate-d/etc/logrotate.d/secure-v二,配置/var/log/secure按天分割/etc/logrotate.d/secure/var/log/secure{missingokdailyrotate90notifemptydatee......
  • GitLab将会持续支持FluxCD
    GitOps是一种云原生应用程序交付新范式。通过Pull的方式,捕捉云原生应用程序和基础设施部署清单的变更,然后自动将变更部署到目标Kubernetes集群上。极狐GitLab作为早期就支持GitOps的DevOps工具,通过KubernetesAgentServer的方式实现GitOps。后来选择了和业界成熟且开......
  • 使用MyFlash的mysqlbinlog工具查看MySQL binlog的原始SQL语句
    要使用myflash的mysqlbinlog工具查看MySQLbinlog的原始SQL语句,你可以按照以下步骤操作:确保你的MySQL服务器已经开启了binlog,并且binlog格式设置为ROW。这可以通过设置binlog_format=row和binlog_row_image=full在MySQL配置文件中实现。安装myflash工具。你可以从GitH......
  • 【Git】Git Commit Angular规范详解
    在团队协作开发中,保持Git提交记录的一致性和清晰性对于维护项目的可读性和历史追溯至关重要。Angular团队提出了一套详细的CommitMessage格式化规范,旨在解决这一问题。下面将详细介绍如何遵循Angular规范来编写Git提交信息,并探讨其带来的好处。Angular规范的核心要素Angu......