有人可以告诉我在 Git 中 HEAD、工作树和索引之间的区别吗?
据我了解,它们都是不同分支的名称。我的假设正确吗?
我找到了这个:
单个 git 存储库可以跟踪任意数量的分支,但您的工作树仅与其中一个相关联(“当前”或“签出”分支),并且 HEAD 指向该分支。
这是否意味着 HEAD 和工作树总是相同的?
我使用索引作为 检查点 。 当我即将做出可能出错的更改时——当我想探索某个方向时,我不确定我是否可以坚持下去,甚至不确定它是否是一个好主意,例如在概念上要求重构或更改一种表示类型——我将我的工作检查到索引中。 如果这是自上次提交以来我所做的第一次更改,那么我可以使用本地存储库作为检查点,但通常我有一个概念上的更改,我将其作为一组小步骤来实施。 我想在每一步之后检查点,但保存提交直到我恢复工作,测试代码。 笔记: 工作区 是您查看和编辑的(源)文件的目录树。 索引 是 中的单个大型二进制文件<baseOfRepo>/.git/index,其中列出了当前分支中的所有文件、它们的 sha1 校验和、时间戳和文件名——它不是另一个包含文件副本的目录。 本地存储库 是.git一个隐藏目录objects( 不要将上图中表示的四个“磁盘”视为 repo 文件的单独副本。
我使用索引作为 检查点 。
当我即将做出可能出错的更改时——当我想探索某个方向时,我不确定我是否可以坚持下去,甚至不确定它是否是一个好主意,例如在概念上要求重构或更改一种表示类型——我将我的工作检查到索引中。
如果这是自上次提交以来我所做的第一次更改,那么我可以使用本地存储库作为检查点,但通常我有一个概念上的更改,我将其作为一组小步骤来实施。 我想在每一步之后检查点,但保存提交直到我恢复工作,测试代码。
笔记:
工作区 是您查看和编辑的(源)文件的目录树。
索引 是 中的单个大型二进制文件<baseOfRepo>/.git/index,其中列出了当前分支中的所有文件、它们的 sha1 校验和、时间戳和文件名——它不是另一个包含文件副本的目录。
<baseOfRepo>/.git/index
本地存储库 是.git一个隐藏目录objects(
.git
objects
不要将上图中表示的四个“磁盘”视为 repo 文件的单独副本。
它们基本上是 Git 提交的命名引用。有两种主要类型的参考:标签和头部。 标签是标记历史中特定点的固定引用,例如 v2.6.29。 相反,头部总是移动以反映项目开发的当前位置。
它们基本上是 Git 提交的命名引用。有两种主要类型的参考:标签和头部。
(注意:正如评论的,这些箭头不是提交所指向的,它是 工作流顺序* ,基本上将箭头显示为第一个提交和最后一个提交的位置) *1 -> 2 -> 3 -> 4``1``4
1 -> 2 -> 3 -> 4``1``4
现在我们知道项目中发生了什么。 但是要知道这里发生了什么,现在有一个称为 HEAD 的特殊参考。它有两个主要目的: 它告诉 Git 在您结帐时从哪个提交中获取文件,并且 它告诉 Git 在你提交时将新提交放在哪里。 当您运行git checkout ref它时,它会指向HEAD您指定的 ref 并从中提取文件。当你运行git commit它时,它会创建一个新的提交对象,它成为 current 的子对象HEAD。通常HEAD指向其中一个头,所以一切正常。
现在我们知道项目中发生了什么。 但是要知道这里发生了什么,现在有一个称为 HEAD 的特殊参考。它有两个主要目的:
当您运行git checkout ref它时,它会指向HEAD您指定的 ref 并从中提取文件。当你运行git commit它时,它会创建一个新的提交对象,它成为 current 的子对象HEAD。通常HEAD指向其中一个头,所以一切正常。
git checkout ref
HEAD
git commit