git中的HEAD是什么?

What is the HEAD in git?

最后一次提交、头文件和我在目录中看到的文件状态之间似乎存在差异。

头是什么,我能用它做什么?我应该避免什么错误?


head是对当前签出分支中最后一次提交的引用。

有一个小的例外,这是分离头。分离的头部是指当您签出提交(或标记)而不是分支时,您最终会遇到的情况。在这种情况下,您必须将其想象为一个没有名称的临时分支;因此,我们只有head,而没有命名的分支引用。它仍然允许您进行提交(这将更新head),因此如果您将分离的head视为没有名称的临时分支,那么上面的简短定义仍然是正确的。


HEAD是对当前签出提交的引用。

在正常状态下,它实际上是对您签出的分支的一个符号引用-如果您查看.git/head的内容,您将看到类似"ref:ref s/heads/master"的内容。分支本身是对分支末端提交的引用。因此,在正常状态下,HEAD实际上是指当前分支尖端的提交。

也可以有一个"分离的头部"。当您签出除(本地)分支之外的某个分支(如远程分支、特定提交或标记)时,就会发生这种情况。最常见的地方是在交互式重新平衡期间,当您选择编辑提交时。在分离头状态下,您的头是对commit的直接引用,.git/head的内容将是sha1散列。

一般来说,head只是一个方便的名字,意思是"你已经签出了什么",你不必为此担心太多。只需知道您签出了什么,并记住,如果您不在分支(分离的头状态)上,您可能不想提交,除非您知道您正在做什么(例如,处于交互的重新平衡中)。


以Git为单位的指针

Git维护一个名为head的引用变量。我们称这个变量为指针,因为它的目的是引用或指向存储库中的特定提交。当我们进行新提交时,指针将更改或移动以指向新提交。head总是指向存储库中当前分支的尖端。现在,这与我们的存储库有关,而不是我们的临时索引或工作目录。

另一种方法是考虑存储库的最后一个状态或上次签出的内容,因为它是存储库停止的位置或最后一个状态,所以您也可以说头部指向下一次提交的父级,或者说它是进行提交写入的位置。

我觉得一个很好的比喻就是在盒式磁带录音机上播放和录制磁头。当我们开始录制音频时,磁带从磁头上移动,然后记录到磁头上。当我们按下"停止"时,记录头停止的地方就是当我们第二次按下"录制"时,它将再次开始录制的地方。现在我们可以四处移动,我们可以将记录头移动到不同的地方,但是当我们再次按下"录制"时,记录头所在的位置就是开始录制的地方。

Git中的指针非常类似,它指向下一个开始录制的位置。这是我们在存储库中为我们所承诺的事情而放弃的地方。


这应该是一个注释,但对于提交来说太长了

我一直认为HEAD~5意味着之前要进行5次承诺。但它没有执行命令的执行部分。它只携带命令的引用/"Where to"部分。

用外行术语来说,它用来回答这样一个问题:我应该去哪里?向谁承诺?

如果你说

HEAD表示(引用)当前提交

HEAD~1是指(参考)1在

HEAD~87是指(参考)87在

git checkout HEAD~1将实际转到该引用/提交


简单来说,head是对当前签出分支中最后一次提交的引用。

把头部想象成"当前的分支"。使用git checkout切换分支时,头部修订将更改为指向新分支的尖端。

您可以通过执行以下操作看到head指向什么:

1
cat .git/HEAD

head可以引用与分支名称无关的特定修订。这种情况被称为分离式头部。