Git HEAD

虽然使用Git很多年,但是仍然对head没有清晰的认识。head属于隐藏于Git内部的东西,网上很多介绍head的文章也总是说不清道不明,所以记录一下。

1、Git HEAD 存放位置

HEAD 其实是一个指针,内容是 .git/HEAD 文件里面的内容,它存储着当前分支的名字,我们可以打这个文件看一看:

1
ref: refs/heads/master

由此,我们可以得知当前所处于 master 分支。如果我们继续往下走:打开 refs/heads/master 文件,一串密码映入眼帘:

1
7e136f508b982790db5686482075c60ee3ee4fed

正如每个git入门教程里说的,这个 refs/heads/master 里存储其实就是当前commit的引用

其实,我们可以看下面的这张示意图,对于header的理解将会一目了然:

可以理解为一个仓库就是一颗树,每个分支则是不同的树枝,树枝上有不同的节点(代表每一个commit),而commit之前也有父子关系,HEAD指针则是指向commit id,HEAD所在的commit就是目前本地仓库的状态。

那平时我们提交commit则是增加节点,同时HEAD指针后移。但git的强大,不止如此,还可以通过reset、checkout、revert、merge和rebase等操作指令,花式移动指针,游走于整颗commit树。

2、Git HEAD 的作用

2.1、Git HEAD 的作用一:显示当前所出于哪个分支

我们查看git提交日志的时候,会经常碰到head,如下所示:

1
2
$ git log
commit c4f9d71863ab78cfca754c78e9f0f2bf66a2bd77 (HEAD -> master)

如上所示,HEAD -> master 告诉我们当前处于 master 分支。

2.2、Git HEAD 的作用二:指代当前分支的最新提交的commit id

当我们进行新的提交时,HEAD会自动更新到最新的提交上。也就是说,HEAD始终指向当前分支的最新提交。这有助于我们跟踪代码变更并回溯到特定的提交。

有时候,我们commit提交代码后,发现这一次commit的内容是有错误的,面对这种情况有两种解决方法:

  • 解决方法1:修改错误内容,再次commit一次
  • 解决方法2:使用git reset命令撤销这一次错误的commit

此时,该head出场了,它常常与reset连用,如下所示:

1
$ git reset HEAD <file>

因为head表示当前分支的最新提交的commit id,上述命令的目的是将文件file恢复到指定的commit id。


Git HEAD
https://flepeng.github.io/044-Git-41-核心概念-Git-HEAD/
作者
Lepeng
发布于
2021年3月8日
许可协议