Git – 头部
Git 是一个免费的开源分布式版本控制系统,旨在快速高效地处理从小型项目到大型项目的所有项目。 Git 依赖于软件的分布式开发,其中多个开发人员可以访问特定应用程序的源代码,并且可以修改其他开发人员可能看到的更改。
众所周知,git允许一组人一起工作,所有人都使用相同的文件。它还可以帮助团队应对多人编辑相同文件时容易发生的混乱。在使用 Git 时,我们多次看到名为 HEAD 的术语出现在许多地方,例如提交、拉取等。
HEAD是对当前分支中最近提交的引用。这意味着 HEAD 就像一个跟踪当前分支中最新提交的指针。
然而这个定义只是给我们一个关于 HEAD 的基本概述,所以在深入研究 HEAD 之前,让我们先了解两件事,即refs和head。
裁判和头
当您将本地目录初始化为 git 存储库时,您会看到创建了一个.git文件夹。现在让我们创建一个文件 demo.txt 并将这个文件添加到暂存区并提交更改。
现在让我们进入 .git/refs 文件夹,我们可以看到另外两个子目录正在创建,它们是 head 和 tags。在heads文件夹中,可以找到master、main等分支名称,以及v0.2、v0.3等标签。这些都是refs的例子。
当我们谈论heads文件夹中的分支名称时,诸如master之类的引用代表该分支上的提示(最新提交ID),这称为head。在这个文件夹中,我们可以为不同的分支找到不同的文件,每个文件将代表该分支的最新提交 ID。因此,如果进行了任何新提交,则此文件会跟踪最新提交。
让我们检查一下主文件的组成如下:
我们可以看到我们的提交正在写入主文件,您可以使用git log命令验证您的提交 ID。
总而言之 refs 和 head 是指向最新提交的指针,以文件的形式,其中文件名代表分支的名称,并且它们包含分支指向的提交 ID。同样,如果您想查看标签,可以在.git/refs/tags路径中看到它们。如果您想了解有关标签的更多信息以及 .git 文件夹中的文件包含哪些内容。
现在让我们回到我们的主要问题 HEAD 是什么?
现在,既然我们已经了解了 refs 和 head,让我们来了解一下 HEAD。 HEAD 可以称为指向当前提交的特殊 ref。但是,HEAD 可能会根据我们在 git 目录中检出的最新提交而改变。我们可以在.git/HEAD文件中查看我们的 HEAD。让我们的 HEAD 文件的组成如下所示:
这告诉 Git 工作目录当前指向主分支。如果我们创建另一个分支,那么它将指向该分支。让我们借助一个例子来看看:
我们可以看到我们已经创建了一个名为 main 的分支,我们的 HEAD 现在指向了主分支。你也可以检查你的.git/refs/heads文件夹。
现在让我们向我们的主分支添加更多提交,并查看我们的 HEAD 指向的位置。
Here we have added Hello Geeks in demo.txt file.
可以使用git show HEAD命令检查您的 HEAD。
我们有 2 个提交,我们的 HEAD 现在指向我们最近完成的提交。您也可以在您的 . git/refs/heads文件夹。
现在让我们谈谈 HEAD 的另一个术语,即分离的 HEAD。
Detached HEAD 意味着当 HEAD 提交没有指向最近的提交时,我们进入一个称为 detached HEAD 的状态。
您可以使用命令更改 HEAD 的指向 -
git checkout
我们创建了 2 个提交,我们的 HEAD 指向我们在文件中添加“Hello Geeks”的第二个提交,所以让我们将 HEAD 指向我们创建的第一个提交。
我们可以看到最后一行表明HEAD 现在位于 01cbf53 Created demo.txt 。基本上它告诉 HEAD 现在指向提交 01cbf53。让我们在 .git/HEAD 中检查我们的 HEAD 文件。
只要我们输入 git checkout 命令,我们就可以看到我们的工作存储库现在返回到我们放置的提交 ID。你可以检查你的demo.txt 。它将是空的,因为在第一次提交中我们刚刚创建了 demo.txt。
是的,我们得到了与预期相同的提交 ID。
Note: Geeks, now you must be wondering why should we use HEAD?
As seen in the above example, going back to the previous commit becomes easy and is quite useful in our working profession. The concept of detached HEAD is useful as we can view that file’s old version in context.
但是,如果我们只想恢复该特定文件,我们可以运行以下命令,如下所示:
git checkout