概述:在使用git的过程中,我们常常会对其中的HEAD感到疑惑:HEAD是什么意思?表示当前分支吗?什么是处于游离态的commit点?等等,这些都和一个叫做detached head的状态有关,我们来看看它的真面目。
    
        通常情况下,HEAD指向一个分支;同时,每一个分支对应一个特定的commit(确切的说,一个分支上可以有多个commit,但是只有一个顶层commit,而且commit之间是简单的线性关系)。我们来看下面这个包含三个commit的例子,其中目前在master分支上。
                      HEAD (refers to branch 'master')
                        |
                       v
           a---b---c  branch 'master' (refers to commit 'c')
                 ^
                  |
             tag 'v2.0' (refers to commit 'b')

在这样的状况下,如果进行一次提交,当前分支将指向新的提交点。具体来说,git commit创建了一个新的commit id,它的父节点是的commit的id是C。这个时候,HEAD仍然指向master分支,而且指向commit id是d的提交点。
       
    $ edit; git add; git commit

HEAD (refers to branch 'master')
                             |
                             v
           a---b---c---d  branch 'master' (refers to commit 'd')
                ^
                |
             tag 'v2.0' (refers to commit 'b')

有时,如果能够检出到一个不在分支顶端的commit点是很有用的(通常情况下,我们直接运行命令git checkout mater,这样checkout到master的最新commit上);同样,如果能够创建一个不属于任何分支的提交点也是一件很有用的事情。运行接下来的两条命令,看看会发生什么。
       
    $ git checkout v2.0  # or
    $ git checkout master^^

HEAD (refers to commit 'b')
               |
               v
           a---b---c---d  branch 'master' (refers to commit 'd')
               ^
               |
             tag 'v2.0' (refers to commit 'b')    

注意,现在head已经指向commit b,这就是所谓的dedatched head状态。从这里我们也可以看出,head是当前index的状态,而不是当前分支(的最近commit节点)。这仅仅意味着head指向某个特定的commit点,而不是指向每一个特定的分支(的顶端节点)。如果我们此时提交一个commit,看看将要发生什么:

$ edit; git add; git commit


HEAD (refers to commit 'e')
                 |
                 v
                 e
                /
           a---b---c---d  branch 'master' (refers to commit 'd')
               ^
               |
             tag 'v2.0' (refers to commit 'b')

    注意,此时产生了一个新的提交点,但是它只能被head索引到,不属于任何一个分支。当然,我们还可以给在这个“无名分支”的基础上继续提交。
          
 $ edit; git add; git commit

HEAD (refers to commit 'f')
                      |
                      v
                 e---f
                /
           a---b---c---d  branch 'master' (refers to commit 'd')
               ^
               |
             tag 'v2.0' (refers to commit 'b')

     实际上,我们可以进行任何git的常规操作。但是,让我们开看看如果我们运行git checkout master将会发生什么:

$ git checkout master


HEAD (refers to branch 'master')
                 e---f     |
                /           v
           a---b---c---d  branch 'master' (refers to commit 'd')
               ^
               |
             tag 'v2.0' (refers to commit 'b')

 此时,我们一定要注意,e f已经处于无法被索引到的状态。最终e和f将被git的默认回收机制所回收,除非我们在它们被回收之前创建一个指向他们的索引。如果我们没有从commit f离开的话,可以用接下来的命令创建一个指向f的索引。        
   
$ git checkout -b foo   (1)
$ git branch foo        (2)
$ git tag foo           (3)

1.创建来一个foo分支,指向f,接着更新head指向分支foo,此时,我们不再处在detached head的状态
2.同样创建了一个foo分支,但是head仍然指向master分支,仍然处在detached head的状态。
3.创建了一个新标签foo,仍处于detached的状态。
        如果我们从f处离开,我们必须首先恢复他的主体名称,接着我们才可以创建指向它的索引。例如,为了看看最近的两个由head指向的commit点,我们可以使用如下的命令:   
        
$ git reflog -2 HEAD # or

$ git log -g -2 HEAD


参考文献:man  git-checkout

detached HEAD意义详解相关推荐

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

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

  2. ROC曲线绘制原理即AUC的意义详解

    云走雾走走行程,救苦救难救灾星 有求必应,出古洞四海扬名,在深山修真养性 ROC曲线绘制原理即AUC意义详解 ROC曲线绘制原理 ROC曲线常常用来判定一个分类器的分类效果,想要探究ROC曲线的绘制原 ...

  3. 变量声明和函数声明的意义详解

    版权声明:本文为博主原创文章,未经博主允许不得转载. C语言为什么要规定先声明变量呢?为什么要指定变量的名字和对应的数据类型呢? (1)建立变量符号表.     通过声明变量,编译器可以建立变量符号表 ...

  4. 冷水机组相关温度、压力参数意义详解

    ​ 1.蒸发压力与蒸发温度 在冷水机组运行中,蒸发温度.蒸发压力与冷水带入蒸发器的热量有密切关系.冷负荷大时,蒸发器冷水的回水温度升高,引起蒸发器温度升高,对应的蒸发压力也升高.相反,当冷负荷减少时, ...

  5. Java向下转型的意义详解

    基础知识多肽回顾: 1.多肽是方法的多肽,不是属性的多肽(多肽与属性无关). 2.多肽的存在有三个必要条件:继承.方法重写.父类引用指向子类对象. 3.父类引用指向子类对象后,用该父类引用调用子类重写 ...

  6. ps命令与top命令参数意义详解

    文章目录 1.ps -l 2.ps aux 3.top 面试经常被问道,特别是top. 1.ps -l 参数 解释 F 代表这个程序旗标 (process flags),说明这个程序的总结权限,常见号 ...

  7. MOSES系统训练中间过程和意义详解

    关于Moses训练的那些事 前面已经将moses从编译到训练测试的整体流程过了一遍,想必大家对这个工具有了一个大致的理解.这里再详细说一些东西,可能能帮助大家对moses有更深的认识. 也许你在训练过 ...

  8. top命令各个参数代表意义详解

    top命令是Linux下常用的系统性能分析工具,能实时查看系统中各个进程资源占用情况 第一行: 当前时间.系统启动时间.当前系统登录用户数目.平均负载(1分钟,10分钟,15分钟). 平均负载(loa ...

  9. 数控编程:CNC数控编程加工中功能字意义详解

    序段由次序号字.准备功用字.尺度字.进给功用字.主轴功用字.刀具功用字.辅佐功用字和程序结束符组成.此有插补参数字等.每个字都由字母开头,称为"地址". 各个功用字的含义如下: ( ...

最新文章

  1. php BC高精确度函数库
  2. 线上比赛中关于视觉AI组与信标组补充说明
  3. 什么是面向对象(OOP)
  4. RDD的几种创建方式
  5. mysql连接指定时区_MySQL创建JDBC连接时区问题
  6. 优先队列——二项队列(binominal queue)
  7. 交叉熵损失函数分类_逻辑回归(Logistic Regression)二分类原理,交叉熵损失函数及python numpy实现...
  8. 杨澜给80后女孩子的14个忠告
  9. html5 本地mysql_html5本地数据库(一)
  10. python xml第三方库_我应该使用哪个python XML库?
  11. 354. 俄罗斯套娃信封问题--(每日一难phase2--day9)
  12. Enjin ERC-1155和游戏多重宇宙
  13. 京东商品分类API接口-(cat_get-获得jd商品分类API接口),京东分类API接口
  14. Bootstrap Timepicker
  15. android star法则简历,优秀简历的STAR原则
  16. PPG_Projector第一种方法:FindA
  17. 关于文件句柄数和文件描述符的区分
  18. 2018 Mossad Challenge
  19. REDSHIFT学习笔记-渲染设置2_AOVOpt
  20. Java实现 LeetCode 292 Nim游戏

热门文章

  1. 大学物理·第14章【相对论】
  2. CDH大数据平台 ModuleNotFoundError: No module named ‘_sqlite3‘
  3. Mac下的终端神器iTerm的插件之PowerLine配置(下)
  4. java到期时间_计算书本到期时间(Java)
  5. WindowsScript
  6. 世界三大顶级音响_世界顶级音响有哪些?
  7. AVD上网设置(ADSL宽带)
  8. Java 打印等边三角形
  9. 基于Unity的2d动画游戏-------------------c#开发
  10. 微软出品·kubernetes学习路线