Git中HEAD,工作树和索引之间有什么区别?
有人能告诉我在Git中HEAD,工作树和索引之间的区别吗?
据我所知,他们都是不同分支的名字。 我的假设是否正确?
编辑
我找到了这个
一个git仓库可以跟踪任意数量的分支,但是你的工作树只与其中的一个(“当前”或“签出”分支)相关联,并且HEAD指向该分支。
这是否意味着HEAD和工作树总是相同的?
关于这些主题的其他一些好的参考资料:
我使用索引作为检查点。
当我即将做出可能会出错的改变时 - 当我想要探索某些方向时,我不确定是否可以跟进,甚至是否是一个好主意,例如重构概念要求更高或更改表示类型 - 我检查点我的工作到索引中。 如果这是自从我上次提交以来所做的第一次更改,那么我可以使用本地存储库作为检查点,但通常我会作为一组小步骤来实现一个概念更改。 我想在每一步之后检查点,但保存提交,直到我恢复到工作,测试代码。
笔记:
该工作区是您查看和编辑的(源)文件的目录树。
该索引是<baseOfRepo>/.git/index
index中的一个大的二进制文件,它列出了当前分支中的所有文件,它们的sha1校验和,时间戳和文件名 - 它不是另一个具有文件在里面。
本地存储库是一个隐藏目录( .git
),其中包含一个objects
目录,其中包含作为压缩“blob”文件的repo中的每个文件(本地分支和远程分支的副本)的所有版本。
不要将上面映像中表示的四个'磁盘'视为repo文件的单独副本。
它们基本上是Git提交的命名参考。 有两种主要的参考类型:标签和标题。
(注意:Timo Huovinen评论道,这些箭头并不代表承诺指向的是工作流顺序 ,基本上箭头显示为1 -> 2 -> 3 -> 4
,其中1
是第一次提交, 4
是最后一次)
现在我们知道项目中发生了什么。
但要知道这里发生了什么,现在有一个特殊的参考名为HEAD。 它有两个主要目的:
当你运行git checkout ref
它将HEAD
指向你指定的ref并从中提取文件。 当你运行git commit
它会创建一个新的提交对象,它成为当前HEAD
的子对象。 通常HEAD
指向其中一个头,所以一切正常。
在“1.3 Git基础知识”的“三国”一节中描述了HEAD (当前分支中的当前分支或最近提交状态), 索引 (即分级区域)和工作树 (结帐中文件的状态)由Scott Chacon(Creative Commons许可)出版的Pro Git书的一章。
以下是本章中的图像:
在上图中,“working directory”与“working tree”相同,“staging area”是git“index”的替代名称, HEAD指向当前签出的分支,该tip指向上次提交的“ git目录(存储库)“
请注意, git commit -a
会逐步改变并提交。
您的工作树是您当前正在处理的文件中的实际内容。 HEAD
是指向最后签出的分支或提交的指针,如果您创建了它,它将成为新提交的父代。 例如,如果你在master
分支上,那么HEAD
将指向master
,并且当你提交时,这个新的提交将是master
指向的修订的后代,并且master
将被更新为指向新的提交。
该索引是准备新提交的分段区域。 基本上,索引的内容是什么将进入新的提交(但如果你做git commit -a
,这将自动添加所有更改到Git知道的文件提交之前提交,所以它会提交当前内容你的工作树)。 git add
会将工作树中的文件添加或更新到索引中。
上一篇: What's the difference between HEAD, working tree and index, in Git?
下一篇: What is HEAD in Git?