git中的HEAD是什么?

问题描述 投票:208回答:5

最后一次提交,HEAD和我在目录中可以看到的文件状态之间似乎有区别。

什么是HEAD,我该怎么办?我应该避免哪些错误?

git head
5个回答
171
投票

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


这有一个小例外,它是独立的HEAD。分离的HEAD是您在签出提交(或标记)而不是分支时最终会出现的情况。在这种情况下,你必须把它想象成一个没有名字的临时分支;所以我们只有HEAD而不是命名分支引用。它仍然允许你进行提交(这会更新HEAD),所以如果你把一个分离的HEAD想象成一个没有名字的临时分支,那么上面的简短定义仍然是正确的。


83
投票

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

在正常状态下,它实际上是您已检出的分支的符号引用 - 如果您查看.git / HEAD的内容,您将看到类似“ref:refs / heads / master”的内容。分支本身是对分支顶端的提交的引用。因此,在正常状态下,HEAD有效地指当前分支的尖端处的提交。

它也可能有一个“独立的头部”。当您检查除(本地)分支之外的某些内容(如远程分支,特定提交或标记)时会发生这种情况。最常见的地方是在交互式rebase期间,当您选择编辑提交时。在分离的HEAD状态下,您的HEAD是对提交的直接引用 - .git / HEAD的内容将是SHA1哈希。

一般来说,HEAD只是一个方便的名称,意思是“你已经检查了什么”,你真的不必担心它。只要知道你检查了什么,并记住你可能不想提交,如果你不在分支(独立的HEAD状态),除非你知道你在做什么(例如在交互式rebase中) 。


14
投票

Git中的HEAD指针

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

想到它的另一种方式是我们的存储库的最后状态或最后检出的内容,并且因为它是存储库停止或最后一个状态的位置,您还可以说HEAD指向下一个提交的父级或它的提交写作的地方。

我认为考虑这个问题的一个好比喻是盒式磁带录音机上的播放和录音。当我们开始录制音频时,磁带移过磁头,并将其记录到磁带上。当我们按下Stop时,记录头停止的地方就是当我们再次按下Record时它会再次开始记录的地方。现在我们可以四处移动,我们可以将头部移动到不同的地方,但无论头部位于何处当我们再次点击Record时,它将开始录制。

Git中的HEAD指针非常相似,它指向我们接下来要开始录制的地方。这是我们在我们的存储库中为我们所承诺的事情而离开的地方。


13
投票

这应该是一个评论,但它对于提交来说太长了

我一直认为HEAD~5意味着GO之前的5次提交。但它不带有命令的GO部分。它只携带命令的参考/'where to'部分。

通俗地说,它用来回答以下问题:我应该去哪里?提交哪个?

如果你说

HEAD表示(引用)当前提交

HEAD~1意味着(引用)1提交之前

HEAD~87意味着(参考)87提交之前

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


0
投票

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

将HEAD视为“当前分支”。当您使用git checkout切换分支时,HEAD修订版将更改为指向新分支的提示。

您可以通过以下方式查看HEAD指出的内容:

cat .git/HEAD

HEAD可以引用与分支名称无关的特定修订。这种情况称为分离的HEAD。

© www.soinside.com 2019 - 2024. All rights reserved.