Git 的 HEAD 是什么

1,283 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第 1 天,点击查看活动详情

HEAD 是什么

我们使用 Git 时经常看到 HEAD,那么这个 HEAD 是什么呢?

其实 HEAD 就是你当前的分支。可以很简单的验证,随便找一个 Git 仓库,然后输入下面的命令

git log --graph

你可以看到 HEAD -> 你当前所在的分支

head 是什么

对,HEAD 不是 head,大小写不一样,内容也不一样。要搞清楚 HEAD 是什么,得先知道 head 是什么。head 就是你每个分支的最新的一次提交。

git-HEAD-1.png

他们都保存在你的 Git 仓库下的 .git/refs/heads 目录下,head 具体存放的内容就是对应提交的 commit id

.git/refs/heads/main  --> commit id: 8
.git/refs/heads/feature/1  --> commit id: 4
.git/refs/heads/feature/2  --> commit id: 11
.git/refs/heads/feature/3  --> commit id: 6
.git/refs/heads/feature/4  --> commit id: 14

HEAD 的本质

我们发现,其实 head 就是各个分支的最新的一次提交,或者理解成分支也行。但是它其实是分支的,因为可以根据这个头往上找,一直遍历出完整的分支。

HEAD 的本质就是一个指针,指向你当前的分支。

git-HEAD-2.png

HEAD 存放在 .git/HEAD 文件里。

.git/HEAD --> ref: refs/heads/main

它的内容就是指向分支(head)的引用,只是在切换分支的时候它的内容会根据当前所在的分支而变化。

detached HEAD

那什么是 detached HEAD 呢?有这样的一种场景,假如我想切换到 6 这个提交,然后基于它重新改一些东西,我们可以使用下面的命令。

git checkout 5 (commit id)

那这个时候 HEAD 指向哪儿呢?我们知道,HEAD 是指向当前分支的,可是 5 这个提交并不是任何一个分支的头,不存在 head,那我引用什么呢。那这个时候我们就称 HEAD 是游离的,因为它并不指向现存的任何分支,而是指向某个提交。

.git/HEAD --> commit id: 5

你学废了吗?下课!

记得关注点赞交个朋友!不定期更新自己学到的小知识~