1 detached HEAD state指的是什么

正常情况下,HEAD指向一个branch,而branch又指向一个commit。

detached HEAD state指的是HEAD指针没有指向任何的branch,比如说它指向了一个commit。比如我在某次commit处设置了一个tagXXX,然后我git checkout tagXXX,这个时候,我的HEAD就会指向这个commit。

2 detached HEAD state时我能做什么

我也可以提交,这个时候,commit链就在git checkout这个commit的基础上展开,但是如果直接离开到一个branch上的话,这些commits就会被当成garbage,被git garbage collection routine所回收。但是,我们也可以保留这些commits,又下面三种方式:

$ git checkout -b foo ,创建一个branch指向这个commit链,然后HEAD指向这个branch,于是HEAD就不是处于detached state。
$ git branch foo,创建一个branch指向这个commit链,但是HEAD还是处于detached state。
$ git tag foo,创建一个tag指向这个commit链,HEAD还是处于detached state。

3 为什么git checkout origin/XXX远程分支的时候会让HEAD进入detached state?

因为HEAD不能指向远程分支,它只能指向本地的某个commit或者本地分支。当"git checkout 远程分支",HEAD就会直接指向远程分支指向的commit了,HEAD指向commit就会进入detached HEAD state。

这个时候可以

git checkout -b web-zach --track
HEAD就恢复正常,并且local brach web-zach就会跟踪远程分支origin/web-zach。

当我git checkout [remote branch]了之后,出现了"detached HEAD state",然后我去看HEAD文件里面是什么,cat .git/HEAD,输出直接是一个commit id,即

af7c2b39936019e386189a0bc80f5c85db637e2e。

我git checkout -b new-branch remote-branch -t之后,cat .git/HEAD,输出是一个分支,如下:

ref: refs/heads/strategy-pattern-and-sort,这个分支并且track了对应的远程分支。


4 detached HEAD state的危害

一旦出现detached HEAD state,切换分支之后,提交很可能就丢失了,被git回收了。因此要尽量避免出现这个状态。

遇到bug,要到一个老的commit版本去看一下,可以在这个commit的基础上新建一个branch,问题解决了之后删除即可。

git checkout -b new-branch-name commit

5 git checkout的本质

"git checkout branch-name"在于告诉git自己想要在哪个版本上工作,执行了这条命了之后,git会把这个版本的文件都放在working copy文件夹中。

detached HEAD state的更多相关文章

  1. git: fatal: Not a git repository (or any of the parent directories): .git

    在看书 FlaskWeb开发:基于Python的Web应用开发实战 时,下载完源码后 git clone https://github.com/miguelgrinberg/flasky.git 试着 ...

  2. git submodule 使用

    这个是备忘录,原网页: https://medium.com/@porteneuve/mastering-git-submodules-34c65e940407 http://cncc.bingj.c ...

  3. git reset soft,hard,mixed之区别深解

    GIT reset命令,似乎让人很迷惑,以至于误解,误用.但是事实上不应该如此难以理解,只要你理解到这个命令究竟在干什么. 首先我们来看几个术语 HEAD 这是当前分支版本顶端的别名,也就是在当前分支 ...

  4. git的简单使用

    Git-csm.com 安装git  http://www.git-scm.com/download [liujianzuo@mylab ~]$ yum install git 已加载插件:faste ...

  5. git分支管理和stash

    1 创建分支$ git branch 分支名 2切换到分支$ git checkout 分支名 3查看提交git log --oneline --decorate --graph --all 4 轻量 ...

  6. git plumbing 更加底层命令解析-深入理解GIT

    原文: http://rypress.com/tutorials/git/plumbing 本文详细介绍GIT Plumbing--更加底层的git命令,你将会对git在内部是如何管理和呈现一个项目r ...

  7. git remotes

    简单地说,一个remote repository是一个非本地的repo.它可以是在你公司网络上的另外一个git repo,也可以是在internet上,甚至在你本地文件系统中的一个repo,关键点是它 ...

  8. git workflow常用命令

    git init git status git add readme.txt git add --all         Adds all new or modified files git comm ...

  9. Using Git Submodules

    NOTE: Following content is directly reprinted from http://patrickward.com/2013/01/09/using-git-submo ...

随机推荐

  1. SQLite中使用全文搜索FTS

    SQLite中使用全文搜索FTS   SQLite支持全文搜索.通过全文搜索功能,可以方便用户快速进行查找.在iOS中,GRDB.FMDB等SQLite框架均支持FTS技术,如FTS3.FTS4等.各 ...

  2. (持续集成)win7上部署Jenkins+MSBuild+Svn+SonarQube+SonarQube Scanner for MSBuild (一)

    一.Jenkins介绍 jenkins是一个广泛用于持续构建的可视化web工具,持续构建说得更直白点,就是各种项目的”自动化”编译.打包.分发部署.jenkins可以很好的支持各种语言(比如:java ...

  3. shell脚本 linux脚本

    linux:shell 脚本 如果判断当前时间 是不是12点之前 用date命令先取得当前的时间(仅取小时数) : date '+%H'     #按24小时制取hour (00..23) 然后与12 ...

  4. SecureCRT字体大小随屏幕调节设置

  5. Jenkins配置git进行构建失败:Error cloning remote repo 'origin'的解决思路

    说明:这个没有实际的解决方法,只提供一个思路去解决. 操作系统:windows 背景:在配置的节点之后,由于是windows的系统,运行git克隆地址,使用的是SSH协议地址.出现如下的错误: Err ...

  6. 怎样去主动拿一个锁并占有?synchronized关键字即可

    怎样主动去拿一个?synchronized关键字即可 怎样去释放一个锁呢?要求锁对象主动释放,打乱占有当前锁的线程即可

  7. php从数据库选取记录形成列表(首页调用)

    <ul class="e1"> <?php $querySel = "select ID,Tit,Addtime from news where DSh ...

  8. 2017.2.7 开涛shiro教程-第六章-Realm及相关对象(四)

    原博客地址:http://jinnianshilongnian.iteye.com/blog/2018398 根据下载的pdf学习. 第六章 Realm及相关对象(四) 1.Subject的代码结构 ...

  9. eclipse 如何把java项目转成web项目

    经常在eclipse中导入web项目时,出现转不了项目类型的问题,导入后就是一个java项目. 解决步骤: 1.进入项目目录,可看到.project文件,打开. 2.找到<natures> ...

  10. robotframe使用之时间控件

    robotframe使用之时间控件 正常的页面,时间控件会写在一个iframe里面,所以robotframework找不到对的ID或者xpath等. 要解决这个问题必选先显示iframe. 使用关键字 ...