概述:在使用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

【git 基础】detached HEAD意义详解 (非顶端分支的理解)相关推荐

  1. detached HEAD意义详解

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

  2. 【转】ASP.NET验证控件详解(非空验证,比较验证,范围验证,正则表达式,自定义验证)...

    [转]ASP.NET验证控件详解(非空验证,比较验证,范围验证,正则表达式,自定义验证) ASP.NET验证控件详解 现在ASP.NET,你不但可以轻松的实现对用户输入的验证,而且,还可以选择验证在服 ...

  3. LSTM入门必读:从入门基础到工作方式详解 By 机器之心2017年7月24日 12:57 长短期记忆(LSTM)是一种非常重要的神经网络技术,其在语音识别和自然语言处理等许多领域都得到了广泛的应用

    LSTM入门必读:从入门基础到工作方式详解 By 机器之心2017年7月24日 12:57 长短期记忆(LSTM)是一种非常重要的神经网络技术,其在语音识别和自然语言处理等许多领域都得到了广泛的应用. ...

  4. 英语词源基础之后缀-ion详解: -ion,-tion,-ction,-ption,-ation,-ition的区别

    英语词源基础之后缀-ion详解 来自古法语名词后缀-ion,表情况或状态,来自拉丁语名词后缀-io的宾格形式-ionem,表情况或状态,来自词干元音i+onem. 在拼写上,该后缀在英语中包括拼写形式 ...

  5. 2014计算机应用基础试题及答案,2014年计算机应用基础试题及答案详解.doc

    2014年计算机应用基础试题及答案详解.doc 计算机应用基础2资料 一.单选题 1.第一台电子计算机是1946年在美国研制成功的,该机的英文缩写名是______.答案: A A:ENIAC B:ED ...

  6. Android基础总结: Camera2详解之一 API学习

    Camera2的API出来有些年头了,只是赶项目多次使用,没时间好好总结,年终了,正好结合google的官方Camera2demo 和开发中使用的情况,做个详细梳理,研究总结之后,才发现Camera2 ...

  7. 【Java基础】HashMap原理详解

    [Java基础]HashMap原理详解 HashMap的实现 1. 数组 2.线性链表 3.红黑树 3.1概述 3.2性质 4.HashMap扩容死锁 5. BATJ一线大厂技术栈 HashMap的实 ...

  8. 电子元器件从入门到精通pdf_电子元件入门基础,常用电子元器件详解大全作用-涨知识必读...

    1.电子元器件筛选的必要性 电子元器件的固有可靠性取决于产品的可靠性设计, 在产品的制造过程中, 由于人为因素或原材料. 工艺条件. 设备条件的波动, 最终的成品不可能全部达到预期的固有可靠性. 在每 ...

  9. ELKElasticSearch5.1基础概念及配置文件详解【转】

    1. 配置文件 elasticsearch/elasticsearch.yml 主配置文件 elasticsearch/jvm.options jvm参数配置文件 elasticsearch/log4 ...

最新文章

  1. [PyTorch] rnn,lstm,gru中输入输出维度
  2. 自然语言推理:微调BERT
  3. Java 学习笔记 ------第二章 从JDK到IDE
  4. 用Flutter + Dart快速构建一款绝美移动App
  5. 自动驾驶技术之——虚拟场景数据库研究
  6. android界面怎么优化字符串,android应用性能优化
  7. Java对象容器——对象数组
  8. java C# objective-c AES对称加解密
  9. 计算机网络:VLAN和VXLAN
  10. 最近学习安卓中总结的一些知识点
  11. 固高运动控制卡学习8 --高速硬件捕获
  12. 阿里巴巴矢量图标库 iconfont 的使用方法
  13. 使用 Auto-TS 自动化时间序列预测
  14. Matlab快速傅里叶变换
  15. linux 安装串口驱动安装失败,z-tek(求救Z-TEK串口安装失败,提示:该设备的驱动程序未被安装(代码28)这个inf中的服务安装段落无效?)...
  16. 反汇编工具OD(OllyDebug)
  17. ffmpeg安装之mac安装
  18. 推荐一个好用的Mac精品软件下载站
  19. win8计算机睡眠无法唤醒,win8.1系统休眠后无法唤醒的解决方法
  20. arduino旋转编码器控制步进电机

热门文章

  1. 【服务端渲染】NuxtJs 综合案例
  2. 常用网站URL规划分析
  3. springMVC操作mongoDB增删改查
  4. java的getshape()_JAVA(Swing)中的镜像形状
  5. python 提升工作效率_Python那些事——5个提升生产效率的Python开发和配置的小技巧...
  6. vue 设置输入法隐藏_iPhone键盘的12种隐藏用法,超好用!可惜没几个人知道!
  7. ubuntu16.04源码安装node
  8. 阅读后这篇文章后,python正则表达式完全弄懂了
  9. Python 35个内置函数,你都ok吗?
  10. python正则表达式中原生字符r的作用