Git HEAD及detached head

news2025/1/18 18:49:36

背景:最近在使用git checkout重置HEAD指向,偶尔会出现Detached HEAD提示,于是想探究一下具体的原理及过程,遂写下了这篇文章。一般checkout用于切换分支和检出历史的某个节点,或恢复工作区的文件,这三个功能。

一、定义

HEAD是一个文件,它记录的是你当前所在的分支,各个分支在引用自己的commitID,整体如下所示:

这图中有3个comit节点,HEAD指向master,master指向 节点 c  

如何查看当前的HEAD文件的内容?

通过查看 .git目录下的HEAD文件即可。

# 在master分支上
cat .git/HEAD
ref: refs/heads/master

# 切换分支
git checkout dev

# 在dev分支上
cat .git/HEAD
ref: refs/heads/dev

二、提交

当在master上进行git commit 操作,将会新增节点d,此时在master分支上,如下图所示:

注意:

当一个新的提交节点d被创建,它的父节点是节点c,然后master分支将引用这个新的节点d,然而HEAD一直指向的是master分支,所以HEAD也指向这个新的节点d。 

也就是说 master和HEAD是联动的,没有分离开来,HEAD一直指向的只是master,而不是具体commitID,这一点非常重要。

当什么时候会遇到 所说的 “detached head”状态呢?

# 检出 b 节点的信息,这里的b代表b节点,具体信息为 某个commitID
git checkout <commitID>

此时发生了 HEAD直接指向了 b 节点,而不是 HEAD指向某个分支。这种情况与HEAD的定义是不一样的,正确的是HEAD只能是指向某个分支而已,而不能指向某个节点,所以导致 detached head状态。

注意 git reset HEAD^ 或 git reset  commitID 不会导致 “detached head”状态,

有意思的是 git checkout 改动的只是HEAD指向,不改动master或其他分支的指向,此时将HEAD直接指向一个新的具体的commitID节点。

而 git reset 是改动的只是master的指向,改动后master指向一个新的具体的commitID节点,而HEAD指向master,也就相应的自动进行了移动。

HEAD --->>> master --->>> commitID

这里多说一句,如何master如何指向的最新的commitID呢?

# 查找refs中的文件
$ find .git/refs -type f
.git/refs/heads/master
.git/refs/heads/foo

# 查看文件master的内容
$ cat .git/refs/heads/master
cf8504c75e1c6fbb95035fa6697b733e3fbdd961

输出的是 master最新的节点 c 

三、修复detached head

假设当目前的HEAD指向b节点,并继续生成了 e 节点和 f 节点,如下图所示:

我也实地的在电脑上模拟了一下,git log --pretty=oneline信息如下:

先在master上依次提交了3个节点,分别为a、b、c 

然后将HEAD 指向 b节点,命令如下:

# 检出 b 节点信息
git checkout 46b53066

提示信息如下图所示(detached head状态):

 当HEAD指向b节点后,再次新增两个节点 e 和 f ,在分离状态下是可以进行任何git操作的,如下图所示:

 

 重点来了,目前只有HEAD指向的是 f 节点,其他没有任何分支指向这个 f 节点,当 HEAD切换到其他节点或切换到某个分支后,这些 e 和 f 节点将会被git垃圾回收进程删除。

如果你不想删除这些 e 和 f 节点,可以执行这个即可:

#  将创建foo分支,将HEAD指向 foo 分支, foo分支指向 f 节点
git checkout -b foo

git checkout -b foo  这样将 e 和 f 保存了下来,并且 修复了 detached head 问题。

我们看一下git log信息,如下图所示:

git log --graph --all --oneline         // 图形化显示 log,所有分支,一行显示

master分支和foo分支 在 b 节点进行了分叉,也可以求 共同节点,类似于 求两个单链表的第一个公共节点,命令如下:

git merge-base master foo   // 求 master分支和foo分支的第一个公共节点

46b530663f45b17b0ea7645ed69ee4e0ad76ec43  得出 b 节点的 hash值

总结:

     1. 所谓的分离HEAD状态,其实就是HEAD不指向某个分支,而是某个具体节点。

     2. 修复这种状态,在新建的节点f上新建分支foo就能解决这种状态,让HEAD重新指向分支

         也可以 根据你的业务需求,例如: 如果e 和 f 节点没有作用和意义,也无需手动删除,git垃圾回收进程会自动删除,你直接使用 git checkout master 将HEAD指向master分支执行后续的操作即可。

参考资料:

       1.  detached_head

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

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

相关文章

OpenHarmony JS Demo开发讲解

项目结构 打开entry→src→main→js&#xff0c;工程的开发目录如图所示 其中&#xff0c; i18n文件夹&#xff1a;用于存放配置不同语言场景的资源&#xff0c;比如应用文本词条&#xff0c;图片路径等资源。en-US.json文件定义了在英文模式下页面显示的变量内容&#xff0c…

Java 泛型为什么设计成是可以擦除的

Java 泛型是 Java 5 引入的一种类型安全的编程机制&#xff0c;它允许在编译时指定泛型类型参数&#xff0c;从而提高代码的类型安全性和可读性。然而&#xff0c;Java 泛型的实现方式是通过类型擦除来实现的&#xff0c;这也引发了一些争议。本文将介绍 Java 泛型为什么设计成…

2023年某科技公司前端开发初级岗的面试笔试真题(含选择题答案、问答题解析、机试题源码)

📚关于该专栏: 该专栏的发布内容是前端面试中笔试部分真题、答卷类、机试等等的题目,题目类型包括逻辑题、算法题、选择题、问答题等等,除了内容的分享,还有解析和答案。真实来自某些互联网公司,坐标广东广州。 🔥🔥🔥 持 续 更 新 🔥🔥🔥 😉专栏博主: 黛…

HCIP-7.1交换机ARP、VLAN之间的三层通信技术学习

交换机ARP、VLAN之间的三层通信技术学习 1、ARP1.1、 地址解析过程1.2、ARP报文格式1.3、ARP表项1.4、免费ARP1.5、 VLAN间ARP代理1.5.1、解决同网段&#xff0c;不同广播域内主机互通问题&#xff1b;1.5.2、解决同网段&#xff0c;不同VLAN之间主机互通问题。1.5.3、解决同网…

Ignore insecure directories and continue [y] or abort compinit [n]?

问题&#xff1a; 在Mac终端中使用Zsh作为默认shell时&#xff0c;有时会弹出以下提示信息&#xff1a; Ignore insecure directories and continue [y] or abort compinit [n]? 这个提示出现的原因是因为Zsh在加载时会检查所有的目录是否安全&#xff0c;并拒绝加载不安全的…

【LeetCode: 62. 不同路径 | 暴力递归=>记忆化搜索=>动态规划 】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

卡尔曼滤波器简介——概述

关于卡尔曼滤波器 大多数现代系统都有许多传感器&#xff0c;可以根据一系列测量来估计隐藏&#xff08;未知&#xff09;状态。例如&#xff0c;GPS接收器提供位置和速度估计&#xff0c;其中位置和速度是隐藏状态&#xff0c;卫星信号到达的差分时间是测量值。 跟踪和控制系统…

ChatGPT的进化版?AutoGPT怎么用

AutoGPT是什么 首选给大家介绍&#xff0c;ChatGPT与AutoGPT的区别 目前AutoGPT被称为最接近AGI的人工智能&#xff0c;它是ChatGPT的进化版&#xff1f; “ChatGPT” 只能提供2021年9月之前的信息&#xff0c;所以你问它告诉我今天的天气&#xff0c;它回答不了 “AutoGPT” …

AutoGPT不靠谱,微软推出升级版!可编辑自主规划过程

夕小瑶科技说 原创 作者 | iven 火遍全网的AutoGPT[1]在Github收藏量突破十万。这种自我规划、自我执行的智能体首次关注人工智能模型内部的自我调整与优化。 但是有不少网友发现&#xff0c;AutoGPT的表现不稳定&#xff0c;死循环是最常见的现象。此外&#xff0c;AutoGPT执…

输入指令为±10V或4~20mA型伺服阀控制器

工作电压 19~35 VDC&#xff08;常规24VDC&#xff09; 最大功率消耗 &#xff1c;25VA 空载电流 ≤100mA&#xff08;24V&#xff09; 差分信号输入 0~10 V&#xff0c;输入阻抗≥100KΩ 4~20 mA&#xff0c;输入阻抗100Ω &#xff08;出厂前需指定&#xff0c;现场不可…

免费的ERP系统哪个好?这款让管理更高效

阅读本文你将了解&#xff1a;ERP是什么&#xff1f;解决什么问题&#xff1f;ERP选型的参考维度&#xff1f;零代码ERP系统解决哪些场景问题&#xff1f; 题目提到“免费”&#xff0c;其实很难有软件可以真正做到。 商业化市场决定了没有一家厂商可以不落俗套。因而我们要探…

[架构之路-177]-《软考-系统分析师》-17-嵌入式系统分析与设计 -2- 系统分析与设计、低功耗设计

目录 1 7 . 4 嵌 入 式 系 统 开 发 17.4.1 开发平台 1 . 交叉开发环境 2 . 交叉编译环境 17. 2 开发流程 1. 过程模型 2 . 分析与设计方法 17.4.3 软硬件协同设计 1 . 软 硬 件 协 同 设 计 方 法 2 . 协 同 设 计 工 具 17.4.4 系统分析与设计 1 . 需求分析 2 .…

CI/CD: GitLab Runner安装注册配置管理

点击上方蓝字⭐️关注“DevOps云学堂”&#xff0c;接收最新技术实践 今天是「DevOps云学堂」与你共同进步的第 21 天 本文是《GitLabCI实践》教程部分内容 GitLab Runner是一个开源项目&#xff0c;用于运行您的作业并将结果发送回GitLab。它与GitLab CI结合使用&#xff0c;G…

计算机网络学习10(ARP协议详解)

ARP 协议&#xff0c;可以说是在协议栈中属于一个偏底层的、非常重要的、又非常简单的通信协议。 开始阅读这篇文章之前&#xff0c;你可以先看看下面几个问题&#xff1a; ARP 协议在协议栈中的位置&#xff1f; ARP 协议在协议栈中的位置非常重要&#xff0c;在理解了它的工…

Linux 内存 pt.1

哈喽大家好&#xff0c;我是咸鱼 今天我们来学习一下 Linux 操作系统核心之一&#xff1a;内存 跟 CPU 一样&#xff0c;内存也是操作系统最核心的功能之一&#xff0c;内存主要用来存储系统和程序的指令、数据、缓存等 关于内存的学习&#xff0c;我会尽量以通俗易懂的方式…

R语言的基本数学运算

目录 一、对象命名原则 二、基本数学运算 2.1 四则运算 2.2 余数和整除 2.3 次方或平方根 2.4 绝对值 2.5 exp()与对数 2.6 科学符号e 2.7 圆周率与三角函数 2.8 四舍五入函数 2.9 近似函数 2.10 阶乘 三、R语言控制运算的优先级 四、无限大 五、非数字&#xf…

OpenCV 实战3 对图像画框、获取图像像素位置

一、函数介绍 opencv中进行鼠标操作主要用到setMouseCallback这个函数&#xff0c;如下&#xff1a; void setMouseCallback(const String& winname, MouseCallback onMouse, void* userdata 0); winname&#xff1a;窗口名称 onMouse&#xff1a;鼠标响应函数&#x…

直击德国PLS展,联诚发倾力打造沉浸式视觉盛宴!

当地时间4月25-28日&#xff0c;备受关注的2023德国法兰克福国际专业灯光音响展ProlightSound&#xff08;以下简称“PLS展”&#xff09;在德国法兰克福盛大召开。联诚发携多款创新产品及多领域的应用解决方案精彩亮相&#xff0c;为全球客户打造沉浸式视觉盛宴&#xff0c;展…

HNU-计算机系统-实验1-PrototypeSystemLab

《计算机系统》 原型机实验报告 班级&#xff1a;计科21XX 学号&#xff1a;20210801XXXX 姓名&#xff1a;wolf 目录 1 实验项目一 1.1项目名称 1.2实验目的 1.3实验资源 2 实验任务 2.1原型机I 2.1.1练习内容 2.1.2思考问题 2.2原型机II-扩充指令集 2.2.1…

《编程思维与实践》1040.字符串消除

《编程思维与实践》1040.字符串消除 题目 思路 每次消除都可能会受到第一次插入字符的影响,所以难以直接判断在哪个位置插入哪个字符后消除的字符数最多. 因此考虑暴力枚举: 在每个位置依此插入A,B,C 对所有情况消除的字符数进行比较,求出最大值. 对于字符串的插入可以利用str…