首先,我们需要明白什么是分离头指针?那从字面意思来解刨可以分为分离和头指针两段,那我们就要知道什么是头指针,然后我们要搞明白头指针从哪里分离,这样分离头指针我们就弄清楚了。
我们依然使用之前的示例工程做演示。工程的Github地址为https://github.com/AlleriaWindrunner/git-learning.git。
什么是分离头指针
那什么是头指针呢?在使用Git的过程中,小伙伴们有去注意吗?其实在探秘Git文件系统之.git目录的时候我们有提到过,接下来我们先一起回忆一下吧。HEAD头指针也称为HEAD头文件,它存储本地仓库当前指向的分支信息。我们也可以打开.git目录下的HEAD文件查看下里面的信息:
HEAD文件里面的内容ref: refs/heads/master就表示当前的头指针指向master分支也就是当前你在Git上的所有操作都是基于或者说都会反映在master分支上。
我们还可以通过执行git log命令来查看下Git 的提交历史记录确认这一点:
细心的小伙伴一定看到了在最新的一次 commit 后面Git有提示你(HEAD -> master, origin/master)这样的标示,这里也明确的表示了当前的头指针指向master分支。对于头指针你只要理解为它始终指向当前你操作的分支就可以了,弄懂了头指针的概念,接下来我们就再理解下什么是分离头指针。
什么是分离头指针
通过上面的演示我们知道了头指针始终指向我当前操作的分支,那我假设出现这样一种场景,就在上面查看Git历史记录的时候,我对其中某一次commit感兴趣了,我把这次commit checkout出来了:
这个时候我们看到Git开始提示我们了:
注意:正在检出 '538dcb27e15bf3ac7095'。
您正处于分离头指针状态。您可以查看、做试验性的修改及提交,并且您可以通过另外的检出分支操作丢弃在这个状态下所做的任何提交。
如果您想要通过创建分支来保留在此状态下所做的提交,您可以通过在检出命令添加
参数 -b 来实现(现在或稍后)。例如:
git checkout -b <新分支名>
HEAD 目前位于 538dcb2 Update:add url of article and new direcotry
这个时候我们再来使用git log和git status命令来查看下历史记录和状态信息:
看到这里我相信小伙伴都明白了,所谓的分离头指针就是指当HEAD头指针不再指向任何一个分支,因为我们日常对于Git的使用都是基于分支的,而是指向其它的Git对象的时候就叫做分离头指针状态。例如上面的演示中我们的头指针就指向了一个commit对象。
分离头指针的使用技巧
当我们知道了什么是分离头指针之后,那其实很多小伙伴会问当出现了分离头指针该怎么办呢?其实分离头指针并不是什么可怕的问题,你可按照Git的提示使用git checkout -b <新分支名>来保存你当前在分离头指针对象上的提交,你也可以不管它,Git过一段时间就自行将其清除掉。比如当你想基于某一次commit新增一些功能的时候,你就可以用的上分离头指针了,你可以checkout出这次commit然后在上面做修改,如果满意你就创建一个新分支保存下新的修改,如果你不满意就直接checkout回你想使用的分支就行了,新的修改都不用去管了,Git会自动帮你处理掉。