git中的头是什么?

git中的头是什么?,git,head,Git,Head,上次提交、文件头和我在目录中看到的文件状态之间似乎存在差异 什么是HEAD,我可以用它做什么,我应该避免什么错误?HEAD是对当前签出分支中最后一次提交的引用 有一个小的例外,这是分离头。分离头是指在签出提交(或标记)而不是分支时所处的情况。在这种情况下,您必须将其想象为一个没有名称的临时分支;因此,我们没有命名的分支引用,而只有HEAD。它仍然允许您进行提交(将更新头部),因此,如果您将分离的头部视为没有名称的临时分支,则上述简短定义仍然正确。HEAD是对当前签出提交的引用 在正常状态下,它

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


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

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



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

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

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

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

一般来说,HEAD只是一个方便的名字,意思是“你已经结帐了”,你真的不必太担心它。请注意您签出的内容,并记住,如果您不在分支(分离的头部状态)上,您可能不想提交,除非您知道自己在做什么(例如,在交互式重新基址中)。

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

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

我认为一个很好的比喻是盒式磁带录音机上的播放和录音头。当我们开始录制音频时,磁带经过磁头,然后录制到磁头上。当我们按“停止”时,当我们再次按“录制”时,记录头停止的位置就是它再次开始录制的位置。现在我们可以四处移动,我们可以将记录头移动到不同的位置,但当我们再次按“录制”时,记录头的位置就是它开始录制的位置


Git中的头指针非常相似,它指向我们接下来要开始录制的地方。它是我们在存储库中为我们已经提交的内容停止的地方。

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

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

用外行的话说,它用来回答以下问题:我应该去哪里?向哪一方承诺

  • HEAD
    表示(对当前提交的引用)
  • HEAD~1
    表示(对)1之前的提交
  • HEAD ~
    还表示(对)1之前提交
  • HEAD~87
    指(对)87之前提交的文件
  • HEAD~3..HEAD
    表示从3次提交到当前提交

用法:
  • git checkout HEAD~1
    将在之前实际转到/签出到1提交/引用
  • git reset HEAD~3
    将取消提交您的最后3次提交-无需删除更改,即您可以同时看到最后3次提交中所做的所有更改,删除您不喜欢的内容或添加到其中,然后再次提交
  • git reset--hard HEAD~3
    将取消上次提交并删除其更改。它将完全删除这些更改。有关更多信息,请参阅
  • git diff HEAD~3
    查看最近3次提交的更改
  • git revert--没有提交头~3..HEAD
    。通过还原最后3次提交进行新提交:有关更多信息,请参阅

还要确保你看到了这个问题的答案


它有一些关于cat.git/HEAD的好信息,简单来说,HEAD是当前签出分支中最后一次提交的引用

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

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

cat .git/HEAD

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 v1.8.4,下面所有使用
HEAD
HEAD
的答案现在都可以使用
@
代替
H
$ git rev-parse HEAD
9883e13257f2e7555eb6e3b14b2c814978c75692