【学了就忘】Git操作 — 67.分离头指针状态

1、什么是分离头指针状态

Git在使用的时候有一种状态,叫做分离头指针状态,也叫detached HEAD

我们之前的更新中可以了解到,在Git中HEAD指针指向分支,而分支是指向提交。所谓的分离头指针状态就是HEAD指针不再指向分支,而是直接指向某个commit。

正常状态结构图:


分离头指针状态结构图:

即:分离头指针状态就是指HEAD指针脱离了分支指针。

2、复现分离头指针场景

(1)查看当前版本库状态

1)查看当前工作的分支

当前工作在master分支上。

2)查看当前版本库日志

(2)场景复现

可能这个时候,我们对其中某一个commit很感兴趣。

比如:对temp分支提交的temp2.txt文件很感兴趣,想切换到temp分支上去研究一下。

在切换分支的时候,会出现这么一种情况。要执行git checkout 分支名命令,但是执行了git checkout + commit_id。不小心把分支名称的位置,写成了你感兴趣的那个提交的ID了。

如下图所示:

说明上图中出现一长串信息:

  • Note: checking out '40e2e66'.:Git正在基于这个commit,做一个切换分支(checkout)的活动。
  • You are in ' detached HEAD' state. You can look around, make experimental changes,and commit them, and you can discard any commits you make in this state without
    你正处在分离头指针的状态,你可以做一些变更产生commit,或者你也可以把这些commit丢弃掉。
    (就是在分离头指针的状态下你可以继续做开发,然后继续产生commit,而且不会影响其他分支)

解释一下:

  • 分离头指针状态的含义,其实本质上是说我们现在正工作在一个没有分支的状态下
  • 不好的方面:
    在这分离头指针状态下,你可以继续产生commit,并且不会影响到其他的分支。如果你有需要切换到其他的分支需求,这个时候一旦切换,那分离头指针状态下开发出来的commit,因为没有branch和他挂钩,这些没有branch挂钩的commit,最后很可能被Git当作垃圾给清除掉,所以这个是他危险的地方。
    也就是说如果你想变更工作分支,请先把这些提交和某个分支挂钩,此时这些commit,Git是永远不会把他清除掉的,这就是分离头指针使用的时候需要注意的地方。
  • 好的一方面:
    就是我们想做一些变更,而这个变更你只是尝试性的变更,没准实践下来你觉得效果不好,你完全随时可以把他扔掉,扔掉就是你不要去理会他,你切换到新的分支就可以了,这就是分离头指针状态带来的好处。

上面的提示信息也进行了说明:

If you want to create a new branch to retain commits you create, you maydo so(now or later) by using -b with the checkout command again.

Example: git checkout-b <new-branch-name>

如果您想创建一个新的分支来保留您创建的提交,您可以(现在或以后)通过使用git checkout -b命令来实现。

示例:git checkout -b <new branch name>

最后还提示你:

HEAD is now at 40e2e66 temp分支提交文本temp2.txt

提示HEAD指针正在指向的位置是,40e2e66对应的commit上。

3、分离头指针状态下操作

上边场景中,我们已经进入了分离头指针状态。我们进行一些操作,看看会有什么情况发生。

(1)修改temp2.txt文件内容

在文件中添加一行66666666666666。

(2)查看Git暂存区文件状态

可以看到Git又在提示我们,HEAD detached at 40e2e66
说明此时的HEAD指针没有指向任何的分支,而是指向了某一个没有分支的commit。

(3)提交此次变更

可用一种偷懒的方式,但不推荐使用,从工作区直接提交到版本库中。
执行命令$ git commit -am '修改temp2.txt文件内容'

(4)查看一下Git版本历史情况

这里请大家留意一下HEAD的位置,之前的HEAD出现,总是和某一个分支绑在一起的,此时这个HEAD并没有任何的分支绑定,这个就叫分离头指针的状态。

(5)查看一下本地仓库分支情况

也证明了此时正工作在分离头指针状态

4、分离头指针状态不好的情况

(1)假如这个时候,需要去做其他的任务,要切换到master分支。

执行命令$ git checkout master

可以从上图中看到,Git会发出一段警告:

  • Warning:you are leaving 1 commit behind,not connected to any of your branches:
    25d5574 修改temp2.txt文件内容
    说有一个提交,ID值25d5574的commit ,未连接到任何分支,也就是这个commit没有加入到任何分支。
  • If you want to keep it by creating a new branch,this may be a good time to do so with:
    git branch <new-branch-name> 25d5574
    这里还再一次友情提示你,如果您想创建一个新的分支来保留它,那么现在可能是一个很好的时机。
    执行git branch <new-branch-name> 25d5574 命令来创建。
  • Switched to branch 'master':并且在最后告知你,你已经切换到master分支了。

(2)查看想在的分支情况

我们操作到上面步骤,不做任何操作,通过gitk --all来查看现在的分支情况。

发现图中的Git历史树中,并没有看到我们之前提交的25d5574commit。

说明在Git眼中,你没有把一个commit跟某个分支绑定,也没有把这个commit跟某个tag绑定。那在Git的眼里,这种commit都是不重要的,是日后都要被清除的。

(3)保留分离头指针状态下修改的内容

如果这个时候我突然觉的这个commit很重要,(此时已经切换了分支),还可以继续按照他的指示信息。

执行命令$ git branch newbar 25d5574

再创建一个分支,把之前的commit保留下来。

之后,在通过gitk工具查看一下。

这个修改temp2.txt文件内容的commit又出现了,并被保存在新创建的分支上。

(图中的分支线条乍一看,可能优点乱,按照分支线路慢慢看,是能看明白的)

5、总结

  • 分离头指针状态指的是,HEAD指针不再指向分支,而是直接指向某个commit。
  • 一个变更(提交)没有基于任何的branch(分支)去操作时,当你进行分支切换的时候,在分离头指针上产生的commit,很可能会被Git当作垃圾清理掉。如果你认为这些变更是重要的,要切记一定要和某个分支绑定在一起。
  • 通过上边练习的例子,我们发现在使用Git的时候,一定学会好好的看Git给出的提示。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容