代码之家  ›  专栏  ›  技术社区  ›  Joyce Babu

HEAD、working tree和index之间有什么区别?

  •  409
  • Joyce Babu  · 技术社区  · 16 年前

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


    我找到这个了

    单个git存储库可以跟踪任意数量的分支,但是您的工作树只与其中一个分支(“当前”或“签出”分支)关联,并且HEAD指向该分支。

    这是否意味着头和工作树总是一样的?

    4 回复  |  直到 8 年前
        1
  •  629
  •   VonC    5 年前

    关于这些主题的其他一些好的参考资料:

    workflow

    我使用索引作为 .

    当我要做一个可能会出错的改变时,当我想探索一些我不确定是否能坚持到底的方向,甚至不确定这是否是一个好主意的方向时,比如概念上要求很高的重构或者改变一个表示类型,我会将我的工作检查到索引中。

    如果这是我自上一次提交以来所做的第一次更改,那么我可以使用本地存储库作为检查点,但通常我会将一个概念更改作为一组小步骤来实现。
    我想在每个步骤之后检查点,但是保存提交,直到我重新开始工作,测试代码。

    1. 这个 工作区 是您看到和编辑的(源)文件的目录树。

    2. 是一个大的二进制文件 <baseOfRepo>/.git/index ,其中列出了当前分支中的所有文件及其 沙一 校验和、时间戳和文件名—它不是另一个包含文件副本的目录。

    3. 这个 本地仓库 是一个隐藏目录( .git )包括 objects 包含repo中每个文件的所有版本(本地分支和远程分支的副本)的目录,作为压缩的“blob”文件。

    3 states

    它们基本上是Git提交的命名引用。有两种主要类型的引用:标记和头。

    • 标记是标记历史中特定点的固定引用,例如v2.6.29。
    • 相反,头部总是移动以反映项目开发的当前位置。

    commits

    (注:同 commented 通过 Timo Huovinen ,这些箭头不是提交所指向的,而是 工作流顺序 1 -> 2 -> 3 -> 4 哪里 1 是第一次提交 4

    现在我们知道项目中发生了什么。

    • 它告诉Git在签出时从哪个提交获取文件,然后
    • 它告诉Git在提交时将新提交放在何处。

    当你跑的时候 git checkout ref 它指向 HEAD 你指定的参考号并从中提取文件。当你跑的时候 git commit 它创建一个新的commit对象,它将成为当前 . 正常情况下

    checkout

        2
  •  147
  •   salmanulfarzy Pascal Polleunus    8 年前

    指数 (又名。集结区)和 工作树 (国家) 文件夹 在签出中)中进行了描述 "The Three States" section of the "1.3 Git Basics “第 Pro Git Scott Chacon的书(知识共享许可)。

    Local Operations - working directory vs. staging area (index) vs git repository (HEAD)

    在上图中,“工作目录”与“工作树”相同,“暂存区域”是git“index”的备用名称,并且 指向当前签出的分支,提示指向“git目录(存储库)”中的最后一次提交

    请注意 git commit -a 将阶段性更改并在一个步骤中提交。

        3
  •  72
  •   SherylHohman David    7 年前

    你的

    HEAD 是指向上次签出的分支或提交的指针,如果您进行了新的提交,它将是新提交的父级。例如,如果你在 master 分支,那么 将指向 主人 主人 主人 将更新为指向新提交。

    这个 准备新提交的暂存区域。从本质上讲,索引的内容就是将进入新提交的内容(尽管如果您这样做了) git commit -a ,这将在提交之前自动将Git知道的所有文件更改添加到索引中,因此它将提交工作树的当前内容)。 git add

        4
  •  52
  •   Surjit Samra    7 年前

    工作树是您当前正在处理的文件。

    Git索引

    • 隐藏物 , 当前目录缓存 , 暂存区 , 暂存文件 .

    • 在将文件“提交”(签入)到git存储库之前,首先需要将文件放在git“索引”中。

    • 索引是 工作目录:您可以键入如下命令 git status ,git将告诉您工作目录中的哪些文件已添加到git索引(例如,通过使用 git add filename 命令)。

        5
  •  14
  •   Mehdi Ijadnazar    5 年前

    这是一个不可避免的漫长而容易理解的解释 ProGit book :

    注: Reset Demystified

    Git作为一个系统,在其正常操作中管理和操作三棵树:

    • 上一个提交快照,下一个父级
    • 建议的下一个提交快照
    • 沙箱

    头是最重要的 指针 ,这又是指向 在那个分支上的最后一次提交 创建的下一个提交的父级 该分支上上次提交的快照 .

    里面有什么?

                                     git ls-tree -r HEAD
    

    结果会是这样:

                           $ git ls-tree -r HEAD  
                           100644 blob a906cb2a4a904a152... README  
                           100644 blob 8f94139338f9404f2... Rakefile  
                           040000 tree 99f1a6d12cb4b6f19... lib  
    

    索引

    Git用最后签出到工作目录中的所有文件内容的列表以及它们最初签出时的样子来填充这个索引。然后用新版本的文件替换其中一些文件,git commit将其转换为新提交的树。

    里面有什么?
    使用 git ls-files -s

                     100644 a906cb2a4a904a152e80877d4088654daad0c859 0 README   
                     100644 8f94139338f9404f26296befa88755fc2598c289 0 Rakefile  
                     100644 47c6340d6459e05787f644c2447d2595f5d3a54b 0 lib/simplegit.rb  
    

    工作目录

    这是您的文件所在的位置,您可以在将更改提交到暂存区域(索引)然后提交到历史记录之前尝试更改。

    可视化样本

    让我们看看这三棵树(正如ProGit书中提到的)是如何协同工作的?
    Gits的典型工作流程是,通过操纵这三棵树,以连续的更好的状态记录项目的快照。看看这张照片:

    enter image description here

    git init 将创建一个Git存储库,其中的HEAD引用指向未绑定的主分支

    enter image description here

    此时,只有工作目录树有任何内容。 git add 获取工作目录中的内容并将其复制到索引。

    enter image description here

    然后我们跑 git commit

    enter image description here

    如果我们逃跑 git status ,好吧 没有变化 这三棵树都一样 .

    美丽的一点

    • 如果工作树与索引不同,则 git状态 将显示
    • 如果工作树与索引相同,但与头不同,则 git状态 将在下面显示一些文件 结果中的部分
    • 将在下面显示一些文件 节和其他一些文件 要提交的更改

    为了更好奇的人

    关于的注释 git reset
    希望你知道怎么做 reset 指挥工作将进一步阐明这三棵树存在背后的原因。

    复位 命令是git中的时间机器,它可以轻松地将您带回时间,并为您带来一些旧的快照。以这种方式,头部是一个虫洞,通过它你可以在时间上旅行。让我们看看它是如何工作的,从书中的一个例子:

    考虑以下存储库,其中有一个文件和3个提交,它们以不同的颜色和版本号显示:

    enter image description here

    树木的状态如下图所示:

    enter image description here

    步骤1:移动头部(--软):

    复位 具有 --soft index working directory
    注意:HEAD~是HEAD的父级

    enter image description here

    再看一次图像,我们可以看到命令基本上取消了最后一次提交。由于工作树和索引是相同的,但不同于头,

    步骤2:更新索引(--mixed):

    这是命令的默认选项

    跑步 复位 具有 --mixed git状态 将以红色显示未为提交暂存的更改。此选项还将撤消上次提交,并取消所有更改的暂存。就像你做了些改变却没有打电话 命令还没有。我们的回购现在是这样的:

    enter image description here

    步骤3:更新工作目录(--hard)

    如果你打电话 复位 --hard

    enter image description here

    结论

    我希望现在您对这些树有了更好的了解,并且对它们给您带来的力量有了一个很好的认识,它使您能够更改存储库中的文件,以撤消或重做错误的操作。