Git中的HEAD是什么?

1317

您可以看到Git文档中说:

分支必须在HEAD中完全合并。

但是Git中的HEAD究竟是什么?


11
请参考https://dev59.com/h3NA5IYBdhLWcg3wbNQ4#967611。 - VonC
有趣的是,“heads”和(命名的)“branches”之间几乎存在一对一的对应关系(请参见git ls-remote),但“HEAD”的定义似乎很难确定。git branch的文档简单地说明HEAD实际上是“当前分支的末端”。所有的混淆实际上都必须关于分支的定义 - 这是令人惊讶的微妙:我们到底是什么意思“branch”? - Brent Bradburn
_HEAD指的是你在工作树中所做更改所基于的提交。来源:gitrevisions manual - David Balažic
27个回答

1

我仍在探索git的内部机制,迄今已经了解到以下内容:

假设当前分支是master

  1. HEAD是位于.git/目录下的一个文件,通常看起来像这样:
% cat .git/HEAD
ref: refs/heads/master
refs/heads/master 是一个文件,通常包含 master 分支最新提交的哈希值:
% cat .git/refs/heads/master 
f342e66eb1158247a98d74152a1b91543ece31b4

如果你执行git log命令,你会看到这是主分支的最新提交:
% git log --oneline 
f342e66 (HEAD -> master,...) latest commit
fa99692 parent of latest commit

所以我的想法是,HEAD文件是一种方便的方式来跟踪最新提交,而不是记住长的哈希值。

0

分支实际上是一个保存提交ID(比如17a5)的指针。 HEAD是指向用户当前正在工作的分支的指针。

HEAD有一个引用文件,看起来像这样:

ref:

您可以通过访问您正在处理的存储库中的.git/HEAD.git/refs来检查这些文件。


0

这两个可能会让你感到困惑:

head

指向最近提交的分支的命名引用。除非使用包引用,否则通常存储在$GIT_DIR/refs/heads/中。

HEAD

当前分支,或者您的工作树通常是从HEAD指向的树生成的。HEAD必须指向一个head,除非您正在使用分离的HEAD。


0

4
在Stackoverflow上,仅提供链接作为答案通常是不被赞同的,请将相关信息直接嵌入您的答案中。 - HaskellElephant
2
这并不完全正确。HEAD 所指的内容取决于你是在讨论裸库还是非裸库。在非裸库的情况下,它实际上指的是当前检出的提交,这不需要有一个分支与之关联(即当处于分离的 HEAD 状态时)。 - user456814

0

HEAD 实际上只是一个存储当前分支信息的文件

如果你在 git 命令中使用 HEAD,那么你就是指向你当前的分支

你可以通过以下命令查看这个文件的数据:cat .git/HEAD


0

我自己还没有弄清楚,但是Silfheed链接关于“贴在节点上的便笺”的定义是我目前找到的最好的。

我想分享一下我对这个定义的印象,否则为什么要独自保留呢。 我真正理解它是指“贴在Git树空间中当前位置的贴纸”。我只是缺少这样一个术语 - GIT树中的当前位置,它有自己的属性,表明我们所处的位置。

像“引用”或“指针”这样的概念对我来说并不清楚。我觉得它们意味着一种新的抽象层次,从里面我们可以“引用”某些东西。这可能不是真的,但这是我目前的看法。


1
这并没有真正回答问题。如果您有不同的问题,可以通过点击提问来提出。如果您想在此问题获得新的答案时得到通知,您可以关注此问题。一旦您拥有足够的声望,您还可以添加悬赏以吸引更多关注。- 来自审核 - user12256545

-5
作为一个概念,头是分支中最新的修订版。如果您在未合并的情况下进行本地提交,则可能会在命名分支中创建多个头,从而创建一个未命名的分支。
为了拥有一个“干净”的存储库,您应该每个命名分支只有一个头,并且始终在本地工作后合并到命名分支。
这对于Mercurial也是适用的。

4
对于Mercurial而言这是正确的,但对于Git并非如此。 - Reinstate Monica -- notmaynard

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接