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

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

据我所知,他们都是不同分支的名字。 我的假设是否正确?


编辑

我find了这个

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

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

关于这些主题的其他一些很好的参考

  • 我的Git工作stream程

替代文字

我使用索引作为检查点

当我要做一个可能会出错的改变时 – 当我想要探索某个方向时,我不确定是否可以继续,甚至是否是一个好主意,比如重构概念要求更改或更改表示types – 我检查点我的工作进入索引。 如果这是自从我上次提交以来所做的第一个更改,那么我可以使用本地存储库作为检查点,但是我经常会做一个概念性更改,我将其作为一组小步骤来实现。 我想在每一步之后检查点,但保存提交,直到我恢复到工作,testing代码。

笔记:

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

  2. 索引<baseOfRepo>/.git/index index中的一个大的二进制文件,它列出了当前分支中的所有文件,它们的sha1校验和,时间戳和文件名 – 不是另一个目录文件在里面。

  3. 本地存储库是一个隐藏目录( .git ),其中包含一个objects目录,其中包含作为压缩“blob”文件的repo(本地分支和远程分支副本)中的每个文件的所有版本。

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

  • 为什么Git比X好

替代文字

  • Git是你的朋友不是敌人Vol。 3:参考和索引

它们基本上是Git提交的命名参考。 有两种主要types的标签和标签。

  • 标签是标记历史中特定点的固定参考,例如v2.6.29。
  • 相反,总负责人总是会反映项目发展的现状。

替代文字

(注意:如Timo Huovinen所说,这些箭头并不是什么意思,这是工作stream顺序 ,基本上箭头是1 -> 2 -> 3 -> 4 ,其中1是第一次提交, 4是最后一次)

现在我们知道项目正在发生什么。
但是要知道这里发生的事情,现在有一个特别的参考文件叫HEAD。 它有两个主要目的:

  • 它告诉Git哪个提交从结账时获取文件
  • 它会告诉Git在提交时将新提交放在哪里。

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

替代文字

在“1.3 Git基础知识 ” 的“三国”一节中描述了HEAD (当前分支上的当前分支或最近提交状态), 索引 (又名分段区)和工作树 (结帐中文件的状态)由Scott Chacon(Creative Commons许可)的Pro Git书的一章。

以下是本章中的图像:

本地操作 - 工作目录与暂存区(索引)vs git存储库(HEAD)

上图中“工作目录”与“工作树”相同,“暂存区”是git“index”的替代名称, HEAD指向当前签出的分支,该指向最后一个提交的“ git目录(存储库)“

请注意, git commit -a将阶段性更改并提交一步。

您的工作树是您目前正在处理的文件中的实际内容。 HEAD是指向上次检出的分支或提交的指针,如果创build的话,它将是新提交的父项。 例如,如果你在master分支上,那么HEAD将指向master ,并且当你提交时,这个新的提交将是master指向的修订的后代,并且master将被更新以指向新的提交。

索引是准备新提交的分段区域。 从本质上讲,索引的内容是什么将进入新的提交(虽然如果你做git commit -a ,这将自动添加所有更改到Git知道的文件提交之前提交,所以它会提交当前内容你的工作树)。 git add会将工作树中的文件添加或更新到索引中。

工作树

你的工作树是你目前正在处理的文件。

Git索引

  • git“index”是你放置你想要提交给git仓库的文件的地方。

  • 该索引也被称为caching目录caching当前目录caching暂存区域暂存文件

  • 在“提交”(签入)文件到git仓库之前,你需要首先将这些文件放在git“index”中。

  • 索引不是工作目录:你可以input一个命令,比如git status ,git会告诉你工作目录中的哪些文件已经被添加到了git索引中(例如,通过使用git add filename命令)。

  • 索引不是git仓库:git索引中的文件是git将会提交给git仓库的文件,如果你使用了git commit命令的话。