258

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

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

4

6 回答 6

202

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


对此有一个小例外,即分离的 HEAD。分离的HEAD是当您签出提交(或标签)而不是分支时最终会遇到的情况。在这种情况下,你必须把它想象成一个没有名字的临时分支;因此,我们只有HEAD ,而不是命名分支引用。它仍然允许您进行提交(这将更新 HEAD),因此如果您将分离的 HEAD 视为没有名称的临时分支,上述简短定义仍然适用。

于 2010-03-27T16:20:20.377 回答
90

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

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

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

一般来说,HEAD 只是一个方便的名称,意思是“你检查过的东西”,你不必太担心。请注意您已签出的内容,并记住如果您不在分支上(分离的 HEAD 状态),您可能不想提交,除非您知道自己在做什么(例如在交互式变基中) .

于 2010-03-27T16:26:04.873 回答
48

我一直认为HEAD~5意味着之前要进行5 次提交。但它不携带命令的 GO 部分。它只携带命令的参考部分。

您可以对该参考执行的操作因您选择的命令而异

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

  • HEAD表示(引用)当前提交
  • HEAD~1表示(参考)之前的 1 次提交
  • HEAD~也意味着(参考)之前的 1 次提交
  • HEAD~87表示(参考)之前的 87 次提交
  • HEAD~3..HEAD表示从 3 次提交到当前提交

用法:

  • git checkout HEAD~1实际上会在之前 GO/checkout 到 1 个提交/引用
  • git reset HEAD~3将取消提交您的最后 3 次提交 - 不删除更改,即您可以一起查看最后 3 次提交中所做的所有更改,删除您不喜欢的任何内容或添加到其中,然后再次提交它们。
  • git reset --hard HEAD~3将取消提交您的最后一次提交并删除他们的更改。它将完全删除这些更改。有关更多信息,请参见此处
  • git diff HEAD~3查看最近 3 次提交的更改
  • git diff someFile HEAD~3查看特定文件的最后 3 次更改
  • git revert --no-commit HEAD~3..HEAD. 通过还原最后 3 个提交来进行新的提交:有关更多信息,请参见此处

还要确保您看到What is a detached HEAD 的答案。

它有一些很好的信息cat .git/HEAD


超出范围,但超级有趣:

除了 之外HEAD,还有其他种类的头:

  • FETCH_HEAD
  • ORIG_HEAD
  • MERGE_HEAD
  • ‍‍‍<code>CHERRY_PICK_HEAD

有关更多信息,请参阅其他答案文档

于 2017-09-21T18:13:17.883 回答
18

Git 中的 HEAD 指针

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

另一种思考方式是我们存储库的最后一个状态或最后一次签出的状态,因为它是存储库停止的位置或最后一个状态,您也可以说 HEAD 指向下一次提交的父级,或者它是提交写入将发生的地方。

我认为考虑这一点的一个很好的比喻是盒式磁带录音机上的播放和录音头。当我们开始录制音频时,磁带经过磁头,并记录在上面。当我们按下停止时,记录磁头停止的地方是当我们第二次按下记录时它将再次开始记录的地方。现在我们可以四处移动,我们可以将磁头移动到不同的位置,但是磁头所在的位置当我们再次点击 Record 时,它将开始录制。

Git 中的 HEAD 指针非常相似,它指向我们接下来要开始录制的地方。这是我们在我们的存储库中为我们已经提交的东西留下的地方。

于 2017-02-12T08:56:18.583 回答
1

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

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

您可以通过执行以下操作查看 HEAD 指向的内容:

cat .git/HEAD

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

于 2019-03-10T12:33:14.810 回答
-1

基本上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 总是指向当前分支中的最新/最后一次提交。

于 2020-10-12T11:43:30.023 回答