有人可以告诉我git中HEAD,工作树和索引之间的区别吗?
据我了解,它们都是不同分支的名称。我的假设正确吗?
编辑
我找到了这个
单个git存储库可以跟踪任意数量的分支,但是您的工作树仅与其中一个分支(“当前”或“签出”分支)相关联,并且HEAD指向该分支。
这是否意味着HEAD和工作树始终相同?
Staging Area
在该列表中添加一个。什么是HEAD
,Working Tree
,Index
和Staging Area
有人可以告诉我git中HEAD,工作树和索引之间的区别吗?
据我了解,它们都是不同分支的名称。我的假设正确吗?
我找到了这个
单个git存储库可以跟踪任意数量的分支,但是您的工作树仅与其中一个分支(“当前”或“签出”分支)相关联,并且HEAD指向该分支。
这是否意味着HEAD和工作树始终相同?
Staging Area
在该列表中添加一个。什么是HEAD
,Working Tree
,Index
和Staging Area
Answers:
关于这些主题的其他一些好的参考资料:
我使用索引作为检查点。
当我要进行可能会出错的更改时–当我想探索某个方向时,我不确定是否可以继续进行下去,甚至不确定这是否是一个好主意,例如从概念上讲要求重构或更改表示形式-将工作点检查到索引中。如果这是自上次提交以来我进行的第一次更改,则可以将本地存储库用作检查点,但是通常我会通过一系列小步骤来实现一个概念上的更改。我想在每个步骤之后都检查点,但是保存提交,直到我回到工作正常,经过测试的代码为止。
笔记:
该工作区是(源)的目录树中的文件,你看到和编辑。
该指数是一个单一的,大型的二进制文件
<baseOfRepo>/.git/index
,其中列出了当前分支中的所有文件,它们的SHA1校验和,时间戳和文件名-它不是在它的文件副本的其他目录。在本地资源库是一个隐藏目录(
.git
),包括objects
含回购每个文件的所有版本(本地分支机构和远程分支机构的副本)作为一种压缩“斑点”文件目录。不要认为上图中的四个“磁盘”是回购文件的单独副本。
它们基本上是Git提交的命名参考。引用主要有两种:标记和标头。
- 标签是标记历史中特定点的固定引用,例如v2.6.29。
- 相反,负责人总是动摇以反映项目开发的当前位置。
(注意:正如Timo Huovinen所评论的 那样,那些箭头不是提交所指向的,而是工作流顺序,基本上将箭头显示为第一次提交和最后一次提交在哪里)1 -> 2 -> 3 -> 4
1
4
现在我们知道了项目中正在发生的事情。
但是要知道这里发生了什么,现在有一个称为HEAD的特殊参考。它有两个主要目的:
- 它告诉Git在结帐时从哪个提交获取文件,以及
- 它告诉Git在提交时在哪里放置新提交。
运行时,
git checkout ref
它指向HEAD
您指定的引用并从中提取文件。运行时,git commit
它将创建一个新的提交对象,该对象将成为current的子对象HEAD
。通常HEAD
指向一个脑袋,所以一切正常。
“ 1.3 Git基础 ” 的“三种状态”部分描述了HEAD(当前分支或当前分支上的最后提交状态),索引(又称为登台区域)和工作树(签出文件的状态)之间的差异。章临Git的书由Scott Chacon的(创作共用许可)。
这是从本章说明的图像:
在上图中,“工作目录”与“工作树”相同,“暂存区”是git“索引”的备用名称,HEAD指向当前已签出的分支,提示指向“ git目录(存储库)”
请注意,这git commit -a
将分阶段进行更改并一步提交。
您的工作树就是当前正在处理的文件中的实际内容。
HEAD
是指向您上次签出的分支或提交的指针,并且如果您进行了创建,它将成为新提交的父级。例如,如果您在master
分支上,HEAD
则将指向master
,并且在您提交时,该新提交将是所master
指向的修订版本的后代,master
并将被更新以指向新提交。
该指数是一个临时区域,其中新提交准备。本质上,索引的内容将是新提交的内容(尽管如果这样做git commit -a
,它将在提交前自动将Git知道的文件的所有更改添加到索引中,因此它将提交工作树的当前内容)。git add
会将工作树中的文件添加或更新到索引中。
git commit -a
(您需要使用来添加git add
文件),因此您的工作树中可能会有索引,本地存储库或其他文件。您的远程仓库没有。
HEAD
指的是最近的提交,因此在提交时,您将更新HEAD
为与索引匹配的新提交。推送与它没有多大关系,它使本地仓库中的远程匹配分支成为分支。
您的工作树是您当前正在处理的文件。
git“索引”是放置要提交到git存储库的文件的地方。
该索引也称为缓存,目录缓存,当前目录缓存,暂存区,暂存文件。
在将文件“提交”(签入)到git存储库之前,需要首先将文件放入git“ index”中。
索引不是工作目录:您可以键入命令,例如git status
,并且git会告诉您工作目录中的哪些文件已添加到git索引中(例如,通过使用git add filename
命令)。
索引不是git存储库:git索引中的文件是git如果提交到git commit命令将提交到git存储库的文件。
reset --hard HEAD
以确保索引==您的工作树。然后:mkdir history && git checkout-index --prefix history/ -a
结果是您history/
目录中整个工作树的重复。Ergo git index> = git工作目录
echo untracked-data > untracked-file
在git reset --HARD
和git checkout-index
步骤之后或之后进行验证,则证明将失败。你会发现,在未跟踪文件是不是在history
目录中。您也可以单独修改索引和工作树,尽管在不先触摸工作树的情况下修改索引就很困难(需要使用git update-index --index-info
)。
HEAD
是当前分支顶端的提交。如果您刚刚签出了分支,即没有修改过的文件,则其内容与工作树匹配。一旦您修改了任何内容,它便不再匹配。