Git – HEAD、工作树和索引之间的区别
Git 作为版本控制系统在其正常操作中管理和操作三棵树:
- HEAD:上次提交快照,下一个父级
- 索引:提议的下一个提交快照
- 工作目录:沙盒
头
HEAD 是指向当前分支引用的指针,它又是指向该分支上最后一次提交的指针。这意味着 HEAD 将是创建的下一个提交的父级。将 HEAD 视为您在该分支上的最后一次提交的快照通常是最简单的。
它包含什么?
采用 git ls-文件 -s 看看它的样子。您应该看到如下内容:
100644 a906cb2a4a904a152e80877d4088654daad0c859 0 README
100644 8f94139338f9404f26296befa88755fc2598c289 0 Rakefile
100644 47c6340d6459e05787f644c2447d2595f5d3a54b 0 lib/simplegit.rb
工作树
这是您的文件所在的位置,您可以在将它们提交到暂存区(索引)然后提交到历史记录之前尝试更改。
让我们看看这三棵树是如何协同工作的?
Git 的典型工作流程是通过操作这三棵树,以连续更好的状态记录项目的快照。看看这张照片:
为了获得良好的可视化理解,请考虑这种情况。假设您进入一个新目录,其中包含一个文件。调用这个文件的 v1。它以蓝色表示。运行git init将创建一个带有指向未出生主分支的 HEAD 引用的 Git 存储库
此时,只有工作目录树有任何内容。现在我们要提交这个文件,所以我们使用 git add获取工作目录中的内容并将其复制到索引中。
然后我们运行git commit ,它获取索引的内容并将其保存为永久快照,创建指向该快照的提交对象,并更新 master 以指向该提交。
如果我们运行 git status,我们将看不到任何变化,因为所有三棵树都是相同的。
Tip: Do remember certain keypoint as follows:
git status shows the difference between these trees in the following manner:
- If the Working Tree is different from the index, then git status will show there are some changes not staged for commit
- If the Working Tree is the same as index, but they are different from HEAD, then git status will show some files under changes to be committed section in its result
- If the Working Tree is different from the index, and the index is different from HEAD, then git status will show some files under changes not staged for commit section and some other files under changes to be committed section in its result.