概述
所谓指针(reference),只是一个链接,用来指向其他物体,方便引用。Git有三种指针,但是所有指针归根结底都是指向某个commit。
分类
HEAD指针
头指针:指向目前所在的Branch,用来区分目前在哪个分支。
查看HEAD 指向
cat .git/HEAD
结果:ref: refs/heads/master
可以看出HEAD指针指向的是refs/heads/master文件,即master分支
如果 HEAD 指向的是一个引用,可以通过以下命令查看它的指向
git symbolic-ref HEAD
Branch指针
分支指针:指向某个commit。每次该分支有新的commit,指针就会变动,指向当前分支的最新提交。
当我们从master新建一个test分支时,git只会创建一个test分支指针,并且让test分支指针指向master分支对应的最新的提交。
查看master分支文件的内容
cat .git/refs/heads/master
可以看到,这个文件的内容是一串哈希码,而这个哈希码正是master分支上最新的提交所对应的哈希码。
分离头
通常情况下,HEAD指针总是通过分支指针,间接的指向了当前分支的最新提交。
不通常的情况便是分离头(detached HEAD):就是头指针和分支指针分开了,HEAD指针没有指向分支指针,而是直接指向了某个提交。
我们随便检出到某个提交,都可以进入分离头状态
git checkout cbd3348
分离头的应用
由于刚才我们直接检出了’cbd3348’这个提交,所以,我们处于分离头状态,而且当前仓库中各个文件的内容也回到了’cbd3348’这个提交对应的状态。此时创建了两个新提交,这两个新提交与分叉点之前的提交组成了一条匿名分支,没有任何一个分支标签指向这个匿名分支。我们现在有两个选择,如下:
选择一:丢弃这个匿名分支
直接检出到任何一个别的分支,就相当于放弃了这些提交
选择二:保留这个匿名分支
只需要将这些提交创建成一条新的分支就行了
git checkout -b newtest
git branch newtest dca15df