HEAD
是当前分支的符号引用。
我认为它是作为文件ref/heads/HEAD
实现的(就像master
被实现为ref/heads/master
一样),但是没有这样的文件。
HEAD
是否实现为文件?
谢谢。
答案 0 :(得分:3)
HEAD文件位于根目录(搜索.git / HEAD),其内容是当前分支尖端的“指针->提交引用->”。
在分支母版上:
$ cat .git/HEAD
ref: refs/heads/master
在分支issue_99:
$ cat .git/HEAD
ref: refs/heads/issue_99
如您所见,HEAD包含指向另一个引用的指针。 您还可以通过以下方式获得此值:
$ git symbolic-ref HEAD
refs/heads/issue_99
如果查看目标引用,则将获得SHA-1值:
$ cat .git/refs/heads/issue_99
92fff2a187ff1a35fa8a721c31465fad289998bb
提交对象时,该对象属于您所在的分支(issue_99),并且该分支带有您在此处看到的SHA-1的指纹。
简单来说,HEAD表示“当前分支”,它定义了指向引用的指针。 结帐时,您只需更新该指针。
请参阅:git reference
为更好地理解,请查看.git / refs内:它包含对提交对象哈希值的引用,格式为人类可读。 因此,在此目录中,您可以找到分支,遥控器和标签。 就我而言:
$ ls -F .git/refs/
heads/ remotes/ tags/
请注意,heads在存储库中包含名为我的本地分支的文件。
在我们的示例中:
$ ls .git/refs/heads/
issue_99 master
它们包含您通常看到的提交哈希:
git log -1 issue_99
commit 92fff2a187ff1a35fa8a721c31465fad289998bb
Author: deeper-x <albertodeprezzo@gmail.com>
Date: Mon Jan 7 10:46:13 2019 +0100
fancy description of fooBar commit
回到我们的.git / HEAD文件,您会看到为什么将其视为“特殊”引用:它象征性地引用了当前分支的尖端(在refs /容器内部的“ ref”)。
现在您了解了为什么,例如,当您想要从阶段(未阶段)删除文件,进行修改时,可以使用:
git reset HEAD myFooBar.c
很容易理解发生了什么:HEAD是当前分支的最后一次提交,您只需重置它即可,而无需触摸文件。