Git 中的“添加到索引”是什么意思?

29
我有一个关于Git基础知识的问题。 基本上,Git中所谓的“添加到索引”操作是什么意思?我理解它的意思是: 如果对于任何文件git计算SHA-1校验和,那么添加到索引就是指计算SHA-1校验和并将文件添加到暂存区。 我的理解正确吗?
2个回答

61

一个有用的比喻

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

我个人更喜欢术语暂存区而不是索引,因为它可以使用一个有用的比喻。如果提交类似于“拍照快照”,暂存就像“拍摄照片”。

想象一下,你是一位专业摄影师,即将拍摄班级合照:你聚集所有的拍摄对象,并准备好他们的姿势,确保他们都在那里,没有闯入者,每个重要的东西都在画面中等等。然后...咔嚓!

enter image description here

当然,如果你意识到,在拍完照之后,有太多的孩子闭着眼睛(或某个孩子正在给老师做鬼脸!),你可能想放弃第一张照片并拍摄另一张更好的照片;在 Git 中,这对应于修订最后一次提交。但我走题了……

将(新)文件添加到索引时发生的情况

要暂存某些内容,通常会使用高级(“porcelain”)git add命令...或完全等效的git stage (由 Scott Chacon 在 Git v1.6 附近引入),我认为它更加直观,但似乎不太流行。

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

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

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

作为一个实验来固定概念,您可以使用低级(“plumbing”)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

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


3
非常好的关于Git如何工作的解释!我希望Git手册也能像这篇文章一样写得好。 - 9301293

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

4
这并没有真正回答被问出来的问题。 - John Kugelman
这个问题涉及到git基础知识,按照作者的话来说。我理解这个问题是“添加”操作的作用,并在几个场景中给出了它的用法。另一个答案与git基础知识相去甚远。此外,我回答了标题中提供的问题,但该问题已被编辑修改。 - Acey
@Acey 你说得对。也许新标题(我已经改了)距离原意太远了。那么,“在Git中‘添加到索引’真正意味着什么?”这个怎么样? - jub0bs
是的,我认为这更符合意图。 - Acey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接