【问题标题】:What does 'adding to the index' really mean in Git?“添加到索引”在 Git 中的真正含义是什么?
【发布时间】:2014-10-10 16:00:03
【问题描述】:

我有一个关于 Git 基础的问题。

基本上,在 Git 中称为“添加到索引”的操作是什么意思?我是这样理解的:

如果 git 计算任何文件的 SHA-1 总和,那么基本上添加到索引意味着它计算 SHA-1 总和并将文件添加到暂存区域。

我说的对吗?

【问题讨论】:

    标签: git


    【解决方案1】:

    当您添加一个文件时,它会将其标记为您将在运行 git commit 命令后提交的文件。自动添加所有修改文件的快捷方式是使用 git commit -a 提交。如果您同时添加多个新文件,另一个快捷方式是运行 git add -A。

    【讨论】:

    • 这并不能真正回答所提出的问题。
    • 用作者的话来说,这个问题涉及 git 基础知识。我将这个问题解释为“'添加'做什么”,并在几个场景中给出了它的用法。另一个答案与 git 基础知识相去甚远。另外,我回答了标题中提供的问题,该问题已被编辑修改。
    • @Acey 你是对的。可能新的标题(我改了)离原意太远了。 “在 Git 中‘添加到索引’到底意味着什么?”怎么样?
    • 是的,我认为这更符合本意
    【解决方案2】:

    一个有用的比喻

    “将文件添加到索引”、“暂存文件”、“将文件添加到暂存区”都是同义词。

    我个人更喜欢 staging area 这个词而不是 index,因为它本身就是一个有用的比喻。如果 committing 类似于“拍摄快照”,那么 staging 就是关于“构图”。

    想象自己是一名专业摄影师,即将拍摄一张班级照片:您收集所有拍摄对象并让他们准备好拍照,确保他们都在那里并且没有入侵者,所有重要的事情都是在框架中,等等。然后......捕捉!

    当然,如果您在拍完照片后立即意识到有太多孩子闭上了眼睛(或者有些孩子正在给老师兔子耳朵!),您可能想放弃第一张照片并再拍一张,更好的一个;在 Git 中,这将对应于 amending the last commit。但我离题了...

    将(新)文件添加到索引时会发生什么

    要上演某些东西,您通常会使用高级(“瓷器”)git add 命令...或完全相同的git stage(由 Scott Chacon 在 Git v1.6 中引入),我发现了更多直观,但似乎没有那么受欢迎。

    当您将新文件添加到暂存区时,会发生三件事:

    1. 文件内容经过哈希处理,
    2. 文件内容存储在存储库的数据库中,
    3. 工作树中的文件内容已注册到.git/index 文件中。

    使用管道命令将文件添加到索引

    作为一个实验,为了修正想法,您可以使用低级(“管道”)Git 命令来重现 git add 在这种简单情况下所做的事情。从全新的存储库开始:

    $ cd ~/Desktop
    $ mkdir teststage
    $ cd teststage
    $ git init
    

    在做任何其他事情之前,请继续查看.git/objects 文件夹。

    $ ls -la .git/objects
    

    您会看到它只包含两个(空)子目录:infopack。创建一个文件,比如README.md

    $ printf "hello\n" > README.md
    

    现在让我们上演README.md,一次一步。首先,使用较低级别的git hash-object 命令(1)对README.md 的内容进行哈希处理,(2)将后者写入存储库的数据库。

    $ git hash-object -w README.md
    27728344ab3ae5b8aa334418d1e1b0f5be0ea0cc
    

    -w 表示写在这里。)

    现在,如果您查看 .git/objects 文件夹,您会看到新对象(一个 blob)已添加到数据库中:

    $ tree -la .git/objects/
    .git/objects
    ├── 27
    │   └── 728344ab3ae5b8aa334418d1e1b0f5be0ea0cc
    ├── info
    └── pack
    

    还有一件事要完成README.md 的暂存。我们需要 (3) 将文件内容注册到索引中。看看.git 里面,应该还没有名为index 的文件。现在,如果你运行

    $ git update-index --add --info-only README.md
    

    然后再看看.git,你会看到一个二进制index文件已经被创建了。

    就是这样。你已经上演了README.md。它已准备好进行下一次提交。自己检查一下:

    $ git status
    On branch master
    
    Initial commit
    
    Changes to be committed:
      (use "git rm --cached <file>..." to unstage)
    
        new file:   README.md
    

    现在您可以根据需要进行第一次提交。

    【讨论】:

    • 很好地解释了 git 如何真正发挥它的魔力!我希望 git 手册和这篇文章一样。
    猜你喜欢
    • 2013-02-24
    • 2014-10-13
    • 2015-07-16
    • 1970-01-01
    • 2013-02-02
    • 2017-05-06
    • 2012-03-30
    • 2011-10-10
    • 2012-08-03
    相关资源
    最近更新 更多