持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第 1 天,点击查看活动详情
HEAD 是什么
我们使用 Git 时经常看到 HEAD,那么这个 HEAD 是什么呢?
其实 HEAD 就是你当前的分支。可以很简单的验证,随便找一个 Git 仓库,然后输入下面的命令
git log --graph
你可以看到 HEAD -> 你当前所在的分支。
head 是什么
对,HEAD 不是 head,大小写不一样,内容也不一样。要搞清楚 HEAD 是什么,得先知道 head 是什么。head 就是你每个分支的最新的一次提交。
他们都保存在你的 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 的本质就是一个指针,指向你当前的分支。
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
你学废了吗?下课!
记得关注点赞交个朋友!不定期更新自己学到的小知识~