在`git add`之后,`stage`中是否存有多个文件?

时间:2018-03-25 08:47:16

标签: git

据我所知,在git add "filename"的每次操作之后,git会创建一个对应的object,并在object中恢复指向index的指针。

以下是一个例子:

 touch a.txt 
 git add a.txt//version 1
 modify a.txt 
 git add a.txt//version 2

index中是否存有两个文件,对应于版本1和版本2?或者只存在最新的版本2?

是否会删除index中的版本1并仅恢复版本2?

2 个答案:

答案 0 :(得分:1)

只能从索引中访问添加的最新版本。

您可以使用git ls-files --stage检查索引中当前的文件。

当您git add某事物将创建新的blob对象时会发生什么。然后从索引引用此对象。因此,如果您添加更改,然后找到生成的文件的blob哈希值(例如git ls-files --stage)并保留此Blob哈希值,那么即使索引更新为记录,您也可以找到它给定文件的不同blob,直到它最终被垃圾收集。

一个例子:

创建内容为foo的文件hello blob,并将其添加到索引中。

$ echo "hello blob" > foo && git add foo

从索引中查找blob引用并显示blob内容。

$ git ls-files --stage | grep foo
100644 038f48ad0beaffbea71d186a05084b79e3870cbf 0   foo
$ git cat-file -p 038f48ad0beaffbea71d186a05084b79e3870cbf
hello blob

foo的内容替换为good bye blob,并将其添加到索引中。

$ echo "good bye blob" > foo && git add foo

从索引中查找blob引用并显示blob内容。

$ git ls-files --stage | grep foo
100644 d026852604f5986457e8867e2cb27b4cddb24e6f 0   foo
$ git cat-file -p d026852604f5986457e8867e2cb27b4cddb24e6f
good bye blob

原始blob仍然存在,直到它被垃圾收集。

$ git cat-file -p 038f48ad0beaffbea71d186a05084b79e3870cbf
hello blob

Documentation/technical/index-format.txt提供了有关索引内部格式的更多信息。

答案 1 :(得分:1)

documentation of git add解释(重点是我的):

  

<强>描述

     

此命令使用工作树中找到的当前内容更新索引,以准备为下次提交暂存的内容。 它通常会将现有路径的当前内容作为一个整体添加 ,但是通过一些选项,它还可以用于添加仅对工作树所做的部分更改的内容应用的文件,或者删除工作树中不存在的路径。

     

“index”包含工作树内容的快照 ,正是这个快照被视为下一次提交的内容。因此,在对工作树进行任何更改之后,在运行commit命令之前,必须使用add命令将任何新的或修改的文件添加到索引中。

在不深入了解实现细节的情况下,暂存区域(又称“索引”)保留当前工作树的副本。可以使用git addgit rm命令将工作树中创建,修改或删除的文件“添加”到索引中。

这样用户就可以准备下次提交的内容。可以只提交在工作树中操作的部分更改,索引用于存储接下来要提交的内容。

索引不包含版本。它只包含每个文件的一个副本,即您运行的最后一个git add命令添加的文件。 1 如果在将文件添加到索引后修改该文件,则新的更改将赢得除非在提交之前再次将文件添加到索引中,否则不会提交。

1 该索引也由git checkoutgit resetgit merge和其他Git命令更新,但它们不在本讨论范围内。< / p>