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的更多相关文章
- git: fatal: Not a git repository (or any of the parent directories): .git
在看书 FlaskWeb开发:基于Python的Web应用开发实战 时,下载完源码后 git clone https://github.com/miguelgrinberg/flasky.git 试着 ...
- git submodule 使用
这个是备忘录,原网页: https://medium.com/@porteneuve/mastering-git-submodules-34c65e940407 http://cncc.bingj.c ...
- git reset soft,hard,mixed之区别深解
GIT reset命令,似乎让人很迷惑,以至于误解,误用.但是事实上不应该如此难以理解,只要你理解到这个命令究竟在干什么. 首先我们来看几个术语 HEAD 这是当前分支版本顶端的别名,也就是在当前分支 ...
- git的简单使用
Git-csm.com 安装git http://www.git-scm.com/download [liujianzuo@mylab ~]$ yum install git 已加载插件:faste ...
- git分支管理和stash
1 创建分支$ git branch 分支名 2切换到分支$ git checkout 分支名 3查看提交git log --oneline --decorate --graph --all 4 轻量 ...
- git plumbing 更加底层命令解析-深入理解GIT
原文: http://rypress.com/tutorials/git/plumbing 本文详细介绍GIT Plumbing--更加底层的git命令,你将会对git在内部是如何管理和呈现一个项目r ...
- git remotes
简单地说,一个remote repository是一个非本地的repo.它可以是在你公司网络上的另外一个git repo,也可以是在internet上,甚至在你本地文件系统中的一个repo,关键点是它 ...
- git workflow常用命令
git init git status git add readme.txt git add --all Adds all new or modified files git comm ...
- Using Git Submodules
NOTE: Following content is directly reprinted from http://patrickward.com/2013/01/09/using-git-submo ...
随机推荐
- 洛谷——1115 最大子段和(区间DP)
题目描述 给出一段序列,选出其中连续且非空的一段使得这段和最大. 输入输出格式 输入格式: 输入文件maxsum1.in的第一行是一个正整数N,表示了序列的长度. 第2行包含N个绝对值不大于10000 ...
- BUG_ON&&WARN_ON&BUILD_BUG_ON
转载:http://wenx05124561.blog.163.com/blog/static/124000805201223112811490/ 一.BUG_ON Linux中BUG_ON,WARN ...
- Learn How To Attach PL/SQL Library In Oracle Forms
To attach a PL/SQL library in the Oracle Forms follow the following steps:1. Click on Attached Libra ...
- 误删docker0网桥之后怎么办呢?
今天,在搭建k8s node节点环境的时候,好巧不巧,执行了如下命令: [root@hxin221 ~]# ifconfig docker0 down &>/dev/null [root ...
- ScutSDK 0.9版本发布
ScutSDK简介: ScutSDK是和Scut游戏服务器引擎,简化客户端开发的配套SDK,她彻底打通了Scut开源游戏服务器引擎与客户端引擎(如Cocos2d-x/Quick-x/Unity3D)项 ...
- 如何简单去掉dede后台的验证码 dedecms5.7 验证码怎么去掉
很多朋友都在找,如何去掉dede后台的验证码,每次登陆都很繁琐. 现在教大家一个dedecms5.7 验证码怎么去掉的最直接的方法: 在dedecms5.7[验证码安全设置]里,说修改后 ...
- ajax跨域解决办法
在使用jquery的ajax作请求时,http://127.0.0.1:8080,类似这样的一个本地请求,会产生跨域问题, 解决办法一: jsonp: var url= "http://12 ...
- 报错:LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 1>
这段时间忙于看文献,没用过VS了. 今天用着用着就报错了: LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 1> 问度娘,大神给出了解决方法 ...
- 2017.2.20 activiti实战--第一章--认识Activiti
学习资料:<Activiti实战> 第一章 认识Activiti 内容概览:讲解activiti的特点.接口概览.架构等基本信息. 1.3 Activiti的特点 1.使用mybatis ...
- python 查询,子查询以及1对多查询
1.添加数据: # 方法1:对象.save() book = Book(**kwargs) book.save() # 方法2:类.create(**kwargs) Book.create(**kwa ...