有人能告诉我在Git中HEAD,工作树和索引之间的区别吗?
据我所知,它们都是不同分支的名称。 我的假设是否正确?
编辑
我找到了这个
单个git存储库可以跟踪任意数量的分支,但是您的工作树只与其中一个分支相关联(“当前”或“已检出”分支),HEAD指向该分支。
这是否意味着HEAD和工作树总是一样的?
#1楼
工作树
您的工作树是您当前正在处理的文件。
Git指数
git“index”是您将要提交的文件放置到git存储库的位置。
索引也称为缓存 , 目录缓存 , 当前目录缓存 , 暂存区域 , 暂存文件 。
在“提交”(签入)文件到git存储库之前,需要先将文件放在git“index”中。
索引不是工作目录:您可以键入命令,例如
git status
,git将告诉您工作目录中的哪些文件已添加到git索引(例如,使用git add filename
命令)。索引不是git存储库:git索引中的文件是git将使用git commit命令提交给git存储库的文件。
#2楼
您的工作树就是您当前正在处理的文件中的实际内容。
HEAD
是指向您上次检出的分支或提交的指针,如果您创建它,它将是新提交的父级。 例如,如果你在master
分支上,那么HEAD
将指向master
,当你提交时,新的提交将是master
指向的修订的后代, master
将被更新为指向新的提交。
索引是准备新提交的暂存区域。 本质上,索引的内容将进入新的提交(尽管如果你执行git commit -a
,这将自动将所有更改添加到Git在提交之前知道的文件,因此它将提交当前内容你的工作树) git add
会将工作树中的文件添加或更新到索引中。
#3楼
HEAD (当前分支上的当前分支或最后提交状态), 索引 (也称为暂存区域)和工作树 (结帐中的文件状态)之间的区别在“1.3 Git Basics ” 的“三态”部分中描述Scott Chacon的Pro Git一书(Creative Commons行货)。
以下是本章的图片说明:
在上面的图像中,“工作目录”与“工作树”相同,“暂存区域”是git“index”的备用名称, HEAD指向当前签出的分支,该尖端指向上次提交的“ git目录(存储库)“
请注意, git commit -a
将在一个步骤中进行更改和提交。
#4楼
关于这些主题的一些其他好的参考:
我使用索引作为检查点 。
当我即将做出可能出错的改变时 - 当我想探索某个方向时,我不确定我是否可以继续,或者是否这是一个好主意,例如概念要求重构或更改表示类型 - 我检查我的工作到索引。 如果这是我自上次提交以来所做的第一次更改,那么我可以使用本地存储库作为检查点,但通常我有一个概念上的更改,我正在实现一组小步骤。 我希望在每个步骤之后检查点,但保存提交,直到我回到工作,测试代码。
笔记:
工作区是您查看和编辑的(源)文件的目录树。
索引是
<baseOfRepo>/.git/index
index中的单个大型二进制文件,它列出了当前分支中的所有文件,它们的sha1校验和,时间戳和文件名 - 它不是另一个带有副本的目录。其中的文件。本地存储库是一个隐藏目录(
.git
),包括一个objects
目录,其中包含repo中每个文件的所有版本(本地分支和远程分支的副本)作为压缩的“blob”文件。不要将上图中表示的四个“磁盘”视为repo文件的单独副本。
它们基本上是Git提交的命名参考。 有两种主要类型的参考:标签和头部。
- 标签是标记历史中特定点的固定引用,例如v2.6.29。
- 相反,总是移动头来反映项目开发的当前位置。
(注意:由Timo Huovinen 评论 ,这些箭头不是提交指向的,它是工作流程顺序 ,基本上显示箭头为1 -> 2 -> 3 -> 4
其中1
是第一次提交, 4
是最后一次)
现在我们知道项目中发生了什么。
但要知道这里发生了什么,现在有一个特殊的参考叫做HEAD。 它有两个主要目的:
- 它告诉Git哪个提交从结账时拿走文件,然后
- 它会告诉Git在提交时将新提交放在哪里。
当你运行
git checkout ref
它会将HEAD
指向你指定的引用并从中提取文件。 当您运行git commit
它会创建一个新的提交对象,该对象将成为当前HEAD
的子对象。 通常HEAD
指向其中一个头部,所以一切正常。