背景:最近在使用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

Git HEAD及detached head相关推荐

  1. 【git 基础】detached HEAD意义详解 (非顶端分支的理解)

    概述:在使用git的过程中,我们常常会对其中的HEAD感到疑惑:HEAD是什么意思?表示当前分支吗?什么是处于游离态的commit点?等等,这些都和一个叫做detached head的状态有关,我们来 ...

  2. git问题:head detached at xxxx

    项目merge request老是失败,发现是有冲突,为了解决冲突,需要在本地拿到远程分支test上的代码,直接git co test,会发现查看git br 时,出现head detached at ...

  3. Git 提交 HEAD detached from xxx

    在远程提交代码到git时,git push后无法提交,显示 HEAD detached from [分支名] 该提示说明head是游离状态 游离状态提交会新开一个匿名分支且提交是无法可见保存的,一旦切 ...

  4. Git detached HEAD解决方案_张童瑶的博客

    git提交出现 Detached HEAD 解决方案 原文地址:http://yaoyaoman.cn/blog/archives/172 利用 游离状态 的那个 版本号创建一个新的分支, git b ...

  5. git detached head解决方法

    今天要新建一个项目,由于就一个简单页面,就用自己之前已经搭好的一个demo上面改. 复制,粘贴.改个名字,又是一个好工程! 但是,我忽略了这个工程我提交到了git上,然后复制的时候,连着init文件夹 ...

  6. git head指向老版本_Git HEAD detached from XXX 解决

    Git 中的 HEAD 可以理解为一个指针,我们可以在命令行中输入 cat .git/HEAD 查看当前 HEAD 指向哪儿,一般它指向当前工作目录所在分支的最新提交. cat .git/HEAD r ...

  7. git detached HEAD解决方案

    detached HEAD 状态是指 HEAD 指针不指在任何分支的索引(比如 master.dev). 进入 detached HEAD 状态后 git 会创建一个临时分支. 如果想退回直接 git ...

  8. git 为什么会出现detached head

    在 Git 中,detached head 状态是指你的当前的 HEAD 指针指向的不是一个分支,而是一个单独的提交.这通常是因为你切换到了某个提交的历史记录上,或者是因为你在分支上 cherry-p ...

  9. 基于Git rebase修改历史提交信息

    说明 关于为什么要修改历史提交的作者信息和提交信息,我就不多说了,也许是项目规范要求,也许是自己强迫症,总之是有这样的需求. 开始之前先说明一下: 本文介绍的方法只适用于本地仓库,提交到远程以后,我没 ...

最新文章

  1. 怎样查看端口占用情况
  2. ccxprocess启动项可以禁用么_macOS 删除烦人的CCXProcess.app
  3. shell part2
  4. .NET Core和.NET Standard有什么不同
  5. Hibernate缓存级别教程
  6. 给侄子推荐的中学教辅资料清单
  7. Mybatis-Plus 使用自定义注入器后,查询条件中不再添加逻辑删除字段限定条件
  8. Vs 2008 解决方案的目录结构设置和管理
  9. 直播项目之仿全民TV(已开源)
  10. 手写字体研究-matlab
  11. 计算机专业电脑内存,电脑内存大小是否和速度有关?
  12. 多线程的实现和使用场景
  13. (SELECT SUBSTRING(AreaCode FROM 0 FOR 5)FROM sysarea) = '810103'
  14. 【UE4笔记】蓝图联机游戏制作
  15. 蓝色至深蓝色固体CY5.5琥珀酰亚胺脂Cyanine5.5 NHS ester,Cyanine5.5 SE,CY5.5 NHS,1469277-96-0
  16. Fotor 在线设计工具 在线设计网站
  17. VPP调试trace显示
  18. selenium +eclipse+firefox/chrome 环境全套搭配
  19. 成功安装高通Chromatix工具
  20. 三菱PLC FX5U与FX5U 直间modbus tcp 通讯

热门文章

  1. 初学者之路———————语义信息
  2. 20190924——功能类:弹出窗口,让用户输入值
  3. 无谓的通宵加班之后的思索
  4. android之简单的BMI计算器
  5. 天线学习笔记——波导中微波模式的理解(TE/TM/TEM)
  6. 正在看【一分钟经理人】这本书的一点点总结
  7. [Jquery] ------- input checked选中失效不能渲染效果
  8. C#|论文|毕业论文|毕业论文格式|毕业论文范文|毕业论文参考
  9. ESP32 ARDUINO RS485 DE/RE#流向控制编程
  10. OFD及PDF普通电子发票-批量解析V2.0.1