2023-04-02 05:00:03

Git中的HEAD是什么?

您可以看到Git文档中这样说

分支必须在HEAD中完全合并。

但Git HEAD到底是什么?


当前回答

我推荐github开发者Scott Chacon的定义:

Head是你当前的分支。这是一个象征性的参照。它是对分支的引用。你总是有HEAD,但HEAD会指向其他指针之一,指向你所在的某个分支。它是您下次提交的父节点。它应该是最后签入工作目录的内容。这是您的工作目录的最后一个已知状态。

整个视频将公平地介绍整个git系统,所以如果有时间,我也建议你看一遍。

其他回答

Git中的HEAD是什么?(概念)

HEAD是一个指向当前签出分支或提交的指针,它回答了一个问题:我现在在存储库的哪个位置?或者,换句话说,它是Git知道在哪个提交上镜像本地工作树的方式,以及您当前是否在一个分支上工作(附加的)或没有(分离的)。

分离的头

HEAD可以处于附加或分离两种状态之一,这取决于是否签出了分支。默认状态是附加的,其中对历史的任何操作都会自动记录到HEAD当前引用的分支。

在分离状态下,可以在不影响任何现有分支的情况下进行实验更改。请参见下面的信息图,说明在附加状态和分离状态下提交的区别。

一个常见的误解是,消息You are in 'detached HEAD' state是错误的语气,而实际上它只是描述HEAD是如何引用当前快照的。

可以使HEAD处于分离状态的操作:

签出一个特定的提交,即。 $ git checkout 14ko3 显式地签出一个远程分支,即。 $ git checkout origin/master 使用分离标志切换到一个分支,即。 $ git主开关——分离 签出一个标签,即 $ git checkout v1.0.1 执行交互式重基,或包含冲突更改的常规重基

从分离到依附的状态

要从分离状态切换到附加状态,您可以从所在的位置创建一个新分支,或者切换回现有的分支。

注意:如果你切换到另一个现有的分支,在分离状态下创建的任何提交最终(垃圾收集后)都会被丢弃,而不是首先在一个新的分支中持久化你的更改。

检查HEAD的状态

可以通过不同的方法来确定HEAD当前处于哪个状态,这里有两个选项。

使用显示 $ git show HEAD—一行 14ko3 (HEAD, master) C1 #如果附加,输出将是 14ko3 (HEAD -> master) C1 使用状态 $ git状态 HEAD在14ko3分离

HEAD到底是什么?(技术)

如果您想显式地查看HEAD引用了什么,您可以检查. Git /HEAD文件,这是Git内部用于管理HEAD的实际文件。该文件包含分支的名称或提交散列,这取决于是否分离HEAD。

$ cat .git/HEAD
ref: refs/heads/master

# If detached, the output would have been
14ko36e295f1a98ec57397b3acc7bc247da61ff5

来源:以上节选自这篇关于主题的完整文章:Git中的HEAD是什么?

我认为'HEAD'是当前的检出提交。换句话说,'HEAD'指向当前签出的提交。

如果你刚刚克隆了,没有签出,我不知道它指向什么,可能是一些无效的位置。

我推荐github开发者Scott Chacon的定义:

Head是你当前的分支。这是一个象征性的参照。它是对分支的引用。你总是有HEAD,但HEAD会指向其他指针之一,指向你所在的某个分支。它是您下次提交的父节点。它应该是最后签入工作目录的内容。这是您的工作目录的最后一个已知状态。

整个视频将公平地介绍整个git系统,所以如果有时间,我也建议你看一遍。

HEAD实际上只是一个存储当前分支信息的文件

如果你在git命令中使用HEAD,你就指向了当前的分支

您可以通过查看该文件的数据 猫. /头

作为一个概念,头是分支中的最新修订。如果每个命名分支有多个头,那么在进行本地提交时可能会创建它,而没有合并,这实际上创建了一个未命名的分支。

为了拥有一个“干净的”存储库,每个命名分支都应该有一个头,并且在本地工作后总是合并到一个命名分支。

Mercurial也是如此。