在Git中,HEAD是指当前所在的分支或提交
HEAD是什么意思?
在学习Git期间,经常会遇到一个关键词叫做”HEAD”,比如取消索引等情况。
$ git reset HEAD
当你切换到远程分支的时候
$ git checkout remotes/origin/main
Note: switching to 'remotes/origin/main'.
:省略
$ git status
HEAD detached at origin/main
nothing to commit, working tree clean
git reset HEAD 可以取消索引,因此看起来像是最新提交,但实际上此时 HEAD detached,所以在 git log 中看到最新提交的解释不清楚。
所以我进行了一番调查。
HEAD 指向当前所在的分支的指针。
如果你认为这句话的意思已经很清楚了,那么看这篇文章对你来说没有学习的必要了。感谢你的努力。
如果对上述内容仍然不太明白的话,请再陪伴一会儿。要理解上述内容的意思,首先需要理解分支。
我认为即使是刚开始使用Git的人也可以很容易地理解分支的概念。分支是指为了能够同时并行地修改和更改同一项目中的文件而创建的一种方式,其中包括主分支和其他分支。
然而,实际上的分支只是指向特定时间点的提交文件的指针而已。提交文件是记录某个时间点版本的文件,对吧?指向这个提交文件的就是分支。请看下面的内容。
98ca9 → 34ac2 → f30ab这是按顺序创建的提交文件。而f30ab是主分支和测试分支所引用的。分支仅仅是引用某个时点的提交文件而已。
回到话题之前,”HEAD” 是指向分支的一个指针,就像图中所示。准确地说,它指向当前所在的分支。因此,”HEAD” 可以通过分支访问提交文件的信息。
如果你理解这个,你也能理解开头的话。
当使用git reset HEAD命令时,索引的更改被撤消,原因是索引的信息通过HEAD与分支所指向的提交保持一致(即提交后暂存的信息被清除)。
以下的状况意味着指针已经移动到远程分支的提交文件上,但本地没有该分支。
$ git checkout remotes/origin/main
Note: switching to 'remotes/origin/main'.
:省略
$ git status
HEAD detached at origin/main
nothing to commit, working tree clean
换言之,HEAD直接引用远程仓库指向的提交文件,而无需通过分支进行中转。因此,我们能够看到提交历史记录。
顺便一提,git checkout的功能太多了,所以分解成了只能用来移动分支的git switch命令。如果你试图使用git switch直接移动到远程分支,会被告知无法移动。
$ git switch remotes/origin/main
fatal: a branch is expected, got remote branch 'origin/main'
hint: If you want to detach HEAD at the commit, try again with the --detach option.
如果想在分离HEAD的状态下进行切换,那么据说可以使用–detach选项。就像这样,现在无法使用没有选项的switch命令直接移动到远程分支。似乎不推荐在没有分支的情况下引用提交。
在这篇文章中,提到了”HEAD”是指向当前分支的指针。只要记住这一点,在初学阶段就不会被”HEAD”这个概念绊倒。
以上,辛苦了。