HEAD是否以文件形式实现?

时间:2019-01-09 00:46:53

标签: git

HEAD是当前分支的符号引用。

我认为它是作为文件ref/heads/HEAD实现的(就像master被实现为ref/heads/master一样),但是没有这样的文件。

HEAD是否实现为文件?

谢谢。

1 个答案:

答案 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是当前分支的最后一次提交,您只需重置它即可,而无需触摸文件。