最后一次提交,HEAD和我在目录中可以看到的文件状态之间似乎有区别。
什么是HEAD,我该怎么办?我应该避免哪些错误?
答案 0 :(得分:163)
HEAD是对当前签出分支中最后一次提交的引用。
这有一个小例外,它是分离的HEAD。每当您签出提交(或标记)而不是分支时,分离的HEAD 就会出现这种情况。在这种情况下,您必须将其设想为没有名称的临时分支;所以我们只有有HEAD,而不是命名分支引用。它仍然允许你进行提交(这会更新HEAD),所以如果你把一个分离的HEAD想象成一个没有名字的临时分支,那么上面的简短定义仍然是正确的。
答案 1 :(得分:83)
HEAD
是当前检出的提交的引用(引用)。
在正常状态下,它实际上是您已检出的分支的符号引用 - 如果您查看.git / HEAD的内容,您将看到类似“ref:refs / heads / master”的内容。分支本身是对分支顶端的提交的引用。因此,在正常状态下,HEAD
实际上是指当前分支顶端的提交。
也可以有一个“独立的HEAD”。当您检查除(本地)分支之外的某些内容(如远程分支,特定提交或标记)时会发生这种情况。最常见的地方是在交互式rebase期间,当您选择编辑提交时。在分离的HEAD状态下,您的HEAD是对提交的直接引用 - .git / HEAD的内容将是SHA1哈希。
一般来说,HEAD只是一个方便的名称,意思是“你已经检查了什么”,你真的不必担心它。只要知道你检查了什么,并记住你可能不想提交,如果你不在分支(独立的HEAD状态),除非你知道你在做什么(例如在交互式rebase中)
答案 2 :(得分:13)
Git维护一个名为HEAD的引用变量。我们将此变量称为指针,因为它的目的是引用或指向存储库中的特定提交。当我们进行新的提交时,指针将改变或移动以指向新的提交。 HEAD始终指向我们存储库中当前分支的尖端。现在,这与我们的存储库有关,而不是我们的暂存索引或我们的工作目录。
考虑它的另一种方式是我们的存储库的最后状态或最后检出的内容,并且因为它是存储库停止或最后状态的位置,您还可以说HEAD指向下一次提交的父级或者将要进行提交写入的父级。
我认为考虑这个的一个好比喻是盒式磁带录音机上的播放和录音。当我们开始录制音频时,磁带移过磁头,并将其记录到磁带上。当我们按下Stop时,那个记录头停止的地方就是当我们再次按下Record时它会再次开始记录的地方。现在我们可以四处移动,我们可以将头部移动到不同的地方,但无论哪里头部当我们再次点击Record它将开始录制的位置时。
Git中的HEAD指针非常相似,它指向我们接下来要开始录制的地方。它是我们在我们的存储库中停留的地方,用于我们已经承诺的事情。
答案 3 :(得分:11)
这应该是一个评论,但提交时间太长
我一直以为HEAD~5
意味着GO to 5次提交。但它并没有携带命令的GO部分。它只带有参考/'该命令的部分。
以外行人的话来说,它常常回答以下问题: WHERE 我应该去哪里?提交哪个?
如果你说
HEAD
表示(对当前提交的引用)
HEAD~1
表示(引用)1提交之前
HEAD~87
表示(参考)87提交之前
git checkout HEAD~1
实际上将转到该引用/提交
答案 4 :(得分:0)
简单来说,HEAD是对当前签出分支中最后一次提交的引用。
将HEAD视为“当前分支”。当您使用git checkout切换分支时,HEAD版本会更改为指向新分支的尖端。
您可以通过执行以下操作查看HEAD指向的内容:
cat .git/HEAD
HEAD可能引用与分支名称不相关的特定修订版。这种情况称为分离式HEAD。
答案 5 :(得分:0)
基本上 HEAD 是一个指针/引用,它指向当前分支中的最后一个提交。
您可以使用这两个命令来验证这一点。
$ git log -1
commit 9883e13257f2e7555eb6e3b14b2c814978c75692 (HEAD -> MyLocalBranch)
Author: vikram <vikramguptavit@gmail.com>
Date: Sun Oct 11 23:32:45 2020 -0400
this is my last commit message
现在使用以下命令查看HEAD指向的位置:
$ git rev-parse HEAD
9883e13257f2e7555eb6e3b14b2c814978c75692
如您所见,这两个提交哈希是相同的。因此,HEAD始终指向当前分支中的最新/最后提交。