小编典典

Git中的HEAD,工作树和索引有什么区别?

all

有人可以告诉我在 Git 中 HEAD、工作树和索引之间的区别吗?

据我了解,它们都是不同分支的名称。我的假设正确吗?

我找到了这个:

单个 git 存储库可以跟踪任意数量的分支,但您的工作树仅与其中一个相关联(“当前”或“签出”分支),并且 HEAD 指向该分支。

这是否意味着 HEAD 和工作树总是相同的?


阅读 146

收藏
2022-03-08

共1个答案

小编典典

我使用索引作为 检查点

当我即将做出可能出错的更改时——当我想探索某个方向时,我不确定我是否可以坚持下去,甚至不确定它是否是一个好主意,例如在概念上要求重构或更改一种表示类型——我将我的工作检查到索引中。

如果这是自上次提交以来我所做的第一次更改,那么我可以使用本地存储库作为检查点,但通常我有一个概念上的更改,我将其作为一组小步骤来实施。
我想在每一步之后检查点,但保存提交直到我恢复工作,测试代码。

笔记:

  1. 工作区 是您查看和编辑的(源)文件的目录树。

  2. 索引 是 中的单个大型二进制文件<baseOfRepo>/.git/index,其中列出了当前分支中的所有文件、它们的
    sha1 校验和、时间戳和文件名——它不是另一个包含文件副本的目录。

  3. 本地存储库.git一个隐藏目录objects

不要将上图中表示的四个“磁盘”视为 repo 文件的单独副本。

3 个州

它们基本上是 Git 提交的命名引用。有两种主要类型的参考:标签和头部。

  • 标签是标记历史中特定点的固定引用,例如 v2.6.29。
  • 相反,头部总是移动以反映项目开发的当前位置。

提交

(注意:正如评论的,这些箭头不是提交所指向的,它是 工作流顺序*
,基本上将箭头显示为第一个提交和最后一个提交的位置)
*1 -> 2 -> 3 -> 4``1``4

现在我们知道项目中发生了什么。
但是要知道这里发生了什么,现在有一个称为 HEAD 的特殊参考。它有两个主要目的:

  • 它告诉 Git 在您结帐时从哪个提交中获取文件,并且
  • 它告诉 Git 在你提交时将新提交放在哪里。

当您运行git checkout ref它时,它会指向HEAD您指定的 ref 并从中提取文件。当你运行git commit它时,它会创建一个新的提交对象,它成为 current 的子对象HEAD。通常HEAD指向其中一个头,所以一切正常。

2022-03-08