2023-04-02 05:00:03

Git中的HEAD是什么?

您可以看到Git文档中这样说

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

但Git HEAD到底是什么?


当前回答

假设这不是一种叫做“分离HEAD”的特殊情况,那么,正如O'Reilly Git书第2版第69页所述,HEAD的意思是:

HEAD总是指当前节点上最近的提交 分支。当您更改分支时,HEAD将被更新为引用新的分支 布兰奇的最新提交。

so

HEAD是当前分支的“尖端”。

注意,我们可以使用HEAD表示最近的提交,使用HEAD~表示提示之前的提交,使用HEAD~~或HEAD~2表示更早的提交,以此类推。

其他回答

看看http://git-scm.com/book/en/Git-Branching-What-a-Branch-Is

图3 - 5。HEAD文件指向你所在的分支。

我还在弄清楚git的内部结构,到目前为止,我已经弄清楚了这个:

假设当前的分支是master。

HEAD是你的.git/目录下的一个文件,通常看起来像这样:

% cat .git/HEAD
ref: refs/heads/master

Refs /heads/master本身是一个文件,通常包含master最新提交的哈希值:

% cat .git/refs/heads/master 
f342e66eb1158247a98d74152a1b91543ece31b4

如果你做git日志,你会看到这是master的最新提交:

% git log --oneline 
f342e66 (HEAD -> master,...) latest commit
fa99692 parent of latest commit

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

Git中的HEAD是什么?(概念)

HEAD是一个指向当前签出分支或提交的指针,它回答了一个问题:我现在在存储库的哪个位置?或者,换句话说,它是Git知道在哪个提交上镜像本地工作树的方式,以及您当前是否在一个分支上工作(附加的)或没有(分离的)。

分离的头

HEAD可以处于附加或分离两种状态之一,这取决于是否签出了分支。默认状态是附加的,其中对历史的任何操作都会自动记录到HEAD当前引用的分支。

在分离状态下,可以在不影响任何现有分支的情况下进行实验更改。请参见下面的信息图,说明在附加状态和分离状态下提交的区别。

一个常见的误解是,消息You are in 'detached HEAD' state是错误的语气,而实际上它只是描述HEAD是如何引用当前快照的。

可以使HEAD处于分离状态的操作:

签出一个特定的提交,即。 $ git checkout 14ko3 显式地签出一个远程分支,即。 $ git checkout origin/master 使用分离标志切换到一个分支,即。 $ git主开关——分离 签出一个标签,即 $ git checkout v1.0.1 执行交互式重基,或包含冲突更改的常规重基

从分离到依附的状态

要从分离状态切换到附加状态,您可以从所在的位置创建一个新分支,或者切换回现有的分支。

注意:如果你切换到另一个现有的分支,在分离状态下创建的任何提交最终(垃圾收集后)都会被丢弃,而不是首先在一个新的分支中持久化你的更改。

检查HEAD的状态

可以通过不同的方法来确定HEAD当前处于哪个状态,这里有两个选项。

使用显示 $ git show HEAD—一行 14ko3 (HEAD, master) C1 #如果附加,输出将是 14ko3 (HEAD -> master) C1 使用状态 $ git状态 HEAD在14ko3分离

HEAD到底是什么?(技术)

如果您想显式地查看HEAD引用了什么,您可以检查. Git /HEAD文件,这是Git内部用于管理HEAD的实际文件。该文件包含分支的名称或提交散列,这取决于是否分离HEAD。

$ cat .git/HEAD
ref: refs/heads/master

# If detached, the output would have been
14ko36e295f1a98ec57397b3acc7bc247da61ff5

来源:以上节选自这篇关于主题的完整文章:Git中的HEAD是什么?

我认为'HEAD'是当前的检出提交。换句话说,'HEAD'指向当前签出的提交。

如果你刚刚克隆了,没有签出,我不知道它指向什么,可能是一些无效的位置。

HEAD指的是工作副本所指向的当前提交,即当前签出的提交。从官方Linux内核文档中指定Git修订:

HEAD命名您在工作树中基于更改的提交。

但是请注意,在即将到来的Git 1.8.4版本中,@也可以用作HEAD的简写,Git贡献者Junio C Hamano在他的Git Blame博客中指出:

你可以不说“HEAD”,而说“@”。“git log @”。

Stack Overflow用户VonC在回答另一个问题时还发现了一些有趣的信息,关于为什么选择@作为简写。

同样值得注意的是,在某些环境中,没有必要将HEAD大写,特别是在使用不区分大小写文件系统的操作系统中,特别是Windows和OS X。