“添加到索引”在Git中真正意味着什么?

时间:2014-08-17 16:54:50

标签: git

我对Git基础知识有疑问。

基本上,被称为"的行为会添加到索引"在Git意味着什么?我理解这样:

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

我说错了吗?

2 个答案:

答案 0 :(得分:48)

一个有用的比喻

“将文件添加到索引”,“暂存文件”,“将文件添加到临时区域”都是同义词。

我个人更喜欢暂存区 index 一词,因为它有助于一个有用的比喻。如果提交类似于“拍摄快照”,则分段是关于“撰写镜头”。

想象一下你自己是一个专业的摄影师,想要拍摄一张照片:你收集所有的主题,让他们为照片做好准备,确保他们都在那里,并且没有入侵者,重要的是一切在框架等等然后...... Snap!

enter image description here

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

将(新)文件添加到索引

时会发生什么

要进行某些活动,你通常会使用高级(“瓷器”)git add命令......或完全等效的git stage(由Scott Chacon围绕Git v1.6引入)我觉得更直观,但似乎并不那么受欢迎。

将新文件添加到临时区域时,会发生以下三种情况:

  1. 文件内容经过哈希处理,
  2. 文件内容存储在存储库的数据库中,
  3. 工作树中的文件内容已注册到.git/index文件。
  4. 使用管道命令将文件添加到索引

    作为一项实验,为了解决问题,您可以使用低级(“管道”)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
    

    现在,如果你愿意,你可以进行第一次提交。

答案 1 :(得分:1)

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