天天看点

Git学习系列15 HEAD ORIG_HEAD FETCH_HEAD detached HEAD

终于重新回到了git开始的地方,探究下本地git代码仓库中.git目录。

本篇对标题中的几个概念进行简单说明。

1 HEAD

HEAD可以指向分支,也可以指向提交。

这里先说指向分支的情况。

下图为HEAD指向本地master分支。

Git学习系列15 HEAD ORIG_HEAD FETCH_HEAD detached HEAD

查看.git目录下的HEAD

Git学习系列15 HEAD ORIG_HEAD FETCH_HEAD detached HEAD
Git学习系列15 HEAD ORIG_HEAD FETCH_HEAD detached HEAD
Git学习系列15 HEAD ORIG_HEAD FETCH_HEAD detached HEAD

说明HEAD其实就是指向master分支,而master中存放的就是最新的commit(40位的sha-1值)。

2 ORIG_HEAD

在上图的.git目录可以看到还有一个ORIG_HEAD文件

Git学习系列15 HEAD ORIG_HEAD FETCH_HEAD detached HEAD

查看内容,其实存放的也是commit。当进行一些有风险的操作的时候,如reset、merge或者rebase,Git会将HEAD原来所指向commit对象的sha-1值存放于ORIG_HEAD文件中。这里不做深入测试分析。

3 FETCH_HEAD

在上图的.git目录可以看到还有一个FETCH_HEAD文件

Git学习系列15 HEAD ORIG_HEAD FETCH_HEAD detached HEAD

FETCH_HEAD表示某个branch在服务器上的最新状态。

每一个执行过fetch操作的项目都会存在一个FETCH_HEAD列表,其中每一行对应于远程服务器的一个分支。

当前分支指向的FETCH_HEAD, 就是这个文件第一行对应的那个分支。存在两种情况:如果没有显式的指定远程分支, 则远程分支的master将作为默认的FETCH_HEAD;如果指定了远程分支, 就将这个远程分支作为FETCH_HEAD.

4 detached HEAD

当执行 git checkout commit的时候,也就是指向提交,会变成detached HEAD的状态。

Git学习系列15 HEAD ORIG_HEAD FETCH_HEAD detached HEAD

此时查看分支的话,大概显示如下:

Git学习系列15 HEAD ORIG_HEAD FETCH_HEAD detached HEAD

此时如果不留心,继续进行修改提交,可能会被git回收,从而丢失代码。最好的做法是新建一个分支,再进行代码相关操作。例如,我进行如下操作:

Git学习系列15 HEAD ORIG_HEAD FETCH_HEAD detached HEAD

我切换到commit d53a,注意git的提示文字,git checkout -b new-branch-name,就能在d53acommit上新建一个分支,例如我新建了temp1分支。