Git中HEAD,工作树和索引之间有什么区别? [英] What's the difference between HEAD, working tree and index, in Git?
问题描述
据我所知,它们都是不同分支的名称。我的假设是否正确?
编辑
一个git仓库可以跟踪任意数量的分支,但是您的工作树只与其中的一个关联(当前或检出分支)和HEAD指向该分支。
这是否意味着HEAD和工作树总是相同?
关于这些主题的其他一些很好的参考资料:
- 通过 Timo Huovinen ,这些箭头不是承诺指向的内容,而是工作流顺序
1 - > 2 - > 3 - > 4
其中1
是第一次提交,并且4
是最后一次提交)
现在我们知道什么是发生在项目中。
但是要知道这里发生了什么,现在有一个特殊的参考名为HEAD。它有两个主要目的:
- 它告诉Git签出时从哪个文件中提取文件,以及
- 它告诉Git在提交时将新提交放在哪里。
运行
git checkout ref
时,它指向HEAD
添加到您指定的引用,并从中提取文件。当你运行git commit
时,它会创建一个新的提交对象,它成为当前HEAD
的一个子对象。通常HEAD
指向其中一个头,所以一切正常。
Can someone tell me the difference between HEAD, working tree and index, in Git?
From what I understand, they are all names for different branches. Is my assumption correct?
Edit
I found this
A single git repository can track an arbitrary number of branches, but your working tree is associated with just one of them (the "current" or "checked out" branch), and HEAD points to that branch.
Does this mean that HEAD and working tree are always the same?
解决方案A few other good references on those topics:
I use the index as a checkpoint.
When I'm about to make a change that might go awry — when I want to explore some direction that I'm not sure if I can follow through on or even whether it's a good idea, such as a conceptually demanding refactoring or changing a representation type — I checkpoint my work into the index. If this is the first change I've made since my last commit, then I can use the local repository as a checkpoint, but often I've got one conceptual change that I'm implementing as a set of little steps. I want to checkpoint after each step, but save the commit until I've gotten back to working, tested code.
Notes:
the workspace is the directory tree of (source) files that you see and edit.
The index is a single, large, binary file in
<baseOfRepo>/.git/index
, which lists all files in the current branch, their sha1 checksums, time stamps and the file name -- it is not another directory with a copy of files in it.The local repository is a hidden directory (
.git
) including anobjects
directory containing all versions of every file in the repo (local branches and copies of remote branches) as a compressed "blob" file.
Don't think of the four 'disks' represented in the image above as separate copies of the repo files.
They are basically named references for Git commits. There are two major types of refs: tags and heads.
- Tags are fixed references that mark a specific point in history, for example v2.6.29.
- On the contrary, heads are always moved to reflect the current position of project development.
(note: as commented by Timo Huovinen, those arrows are not what the commits point to, it's the workflow order, basically showing arrows as
1 -> 2 -> 3 -> 4
where1
is the first commit and4
is the last)Now we know what is happening in the project.
But to know what is happening right here, right now there is a special reference called HEAD. It serves two major purposes:- it tells Git which commit to take files from when you checkout, and
- it tells Git where to put new commits when you commit.
When you run
git checkout ref
it pointsHEAD
to the ref you’ve designated and extracts files from it. When you rungit commit
it creates a new commit object, which becomes a child of currentHEAD
. NormallyHEAD
points to one of the heads, so everything works out just fine.这篇关于Git中HEAD,工作树和索引之间有什么区别?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
- 它告诉Git签出时从哪个文件中提取文件,以及