Git中HEAD,工作树和索引之间有什么区别? [英] What's the difference between HEAD, working tree and index, in Git?

查看:1943
本文介绍了Git中HEAD,工作树和索引之间有什么区别?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有人能告诉我在Git中HEAD,工作树和索引之间的区别吗?



据我所知,它们都是不同分支的名称。我的假设是否正确?






编辑






一个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:

    1. the workspace is the directory tree of (source) files that you see and edit.

    2. 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.

    3. The local repository is a hidden directory (.git) including an objects 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 where 1 is the first commit and 4 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 points HEAD to the ref you’ve designated and extracts files from it. When you run git commit it creates a new commit object, which becomes a child of current HEAD. Normally HEAD points to one of the heads, so everything works out just fine.

    这篇关于Git中HEAD,工作树和索引之间有什么区别?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆