detached HEAD state

Posted phoenix tree

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了detached HEAD state相关的知识,希望对你有一定的参考价值。

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的主要内容,如果未能解决你的问题,请参考以下文章

HEAD detached from refs/heads/master

分离头指针(detached HEAD)

Git之detached HEAD

Git HEAD detached from XXX (git HEAD 游离) 解决办法

git checkout之一 HEAD基本和detached 状态

使用 FragmentTransaction.attach() 和 detach() 时不保留 Fragment ui