git中的HEAD是什么?

e-s*_*tis 220 git head

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

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

pok*_*oke 175

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


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

  • @ e-satisf:那不是正则表达式.`^`只是git对"之前提交"的符号 - 这是当前提交之前的提交.(如果当前是合并,则使用第一个父级.) (7认同)
  • @LarsH 分支只是指向提交的指针,这使得该提交及其所有父级“包含”在该分支上。但是提交中没有任何内容将它们链接到*分支。该链接仅存在于反向。因此,当您检查提交时,您无法判断您可能指的是哪个分支 - 它可能是一个分支,也可能是所有分支,甚至没有。 (2认同)

Cas*_*bel 85

HEAD 是当前检出的提交的引用(引用).

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

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

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

  • 这是我不明白的.如果你签出一个远程分支,为什么你最终得到一个"分离的HEAD".为什么不自动跳转到与您的遥控器对应的本地仓库中的分支? (6认同)
  • @ e-satisf:如果您想要本地分支,请查看本地分支.请记住,两者不一定相同 - 你必须告诉本地的人合并远程的(或拉).跟踪只是因为它知道哪一个在你问的时候自动拉动.它被分离的原因是远程分支旨在成为指向远程仓库中分支的最后看到位置的指针.如果您尝试提交它,远程仓库不会更改,因此远程分支也不应该更改. (3认同)
  • @ e-satisf:一般的答案是`git rebase <branch> HEAD`.这将找到`<branch>`和`HEAD`的最后一个共同祖先,然后从那里获取所有提交到`HEAD`并将它们(重新绑定它们)应用到`<branch>`.它本质上是通过将它们应用为补丁来实现的,因此如果两个分支真的不同,则可能存在冲突.但是如果`<branch>`是`HEAD'的祖先(即你在正确的地方,只是忘了你已经分离了`HEAD`),那么rebase只是一个快速合并. (3认同)
  • 在搜索了一段时间之后,这是我见过的最清晰准确的git HEAD描述之一. (3认同)

Suh*_*pta 14

Git中的HEAD指针

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

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

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

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


Hon*_*ney 14

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

我一直认为HEAD~5以前的意思是GO to 5.它不带有命令的GO部分.它只携带命令的参考/'where to' 部分.

在外行人而言它用来回答的问题:在哪里我应该去?提交哪个?

如果你说

HEAD它表示(引用)当前提交

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

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

HEAD~87 实际上将转到该引用/提交

  • 回到我自己的答案:) (8认同)
  • HEAD 的精彩解释 (2认同)