12-git-8-reference(指针)

概述

所谓指针(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