“将文件添加到索引”,“暂存文件”,“将文件添加到暂存区”是同义词。
我个人更喜欢术语暂存区而不是索引,因为它可以使用一个有用的比喻。如果提交类似于“拍照快照”,暂存就像“拍摄照片”。
想象一下,你是一位专业摄影师,即将拍摄班级合照:你聚集所有的拍摄对象,并准备好他们的姿势,确保他们都在那里,没有闯入者,每个重要的东西都在画面中等等。然后...咔嚓!
当然,如果你意识到,在拍完照之后,有太多的孩子闭着眼睛(或某个孩子正在给老师做鬼脸!),你可能想放弃第一张照片并拍摄另一张更好的照片;在 Git 中,这对应于修订最后一次提交。但我走题了……
要暂存某些内容,通常会使用高级(“porcelain”)git add
命令...或完全等效的git stage
(由 Scott Chacon 在 Git v1.6 附近引入),我认为它更加直观,但似乎不太流行。
当您将新文件添加到暂存区时,会发生三件事:
.git / index
文件中。作为一个实验来固定概念,您可以使用低级(“plumbing”)Git 命令来复制git add
在这种简单情况下的操作。从全新的存储库开始:
$ cd ~/Desktop
$ mkdir teststage
$ cd teststage
$ git init
.git/objects
文件夹。$ ls -la .git/objects
你只会看到它只包含两个(空的)子目录:info
和 pack
。创建一个文件,比如说 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
如果你愿意,现在可以进行第一次提交。