25

Pro Git一书说暂存区只是一个列表或索引,它说明了当agit commit完成时将提交哪些文件,现在这个名字index更常被称为“暂存区”。

但是,如果我们修改foo.txt已经是 repo 一部分的文件,并使用git add foo.txt它来暂存它,然后再次修改文件,那么现在文件既是“暂存”又是“修改”(如 中所示git status),如果我们提交, “分阶段”版本将进入提交。第二次编辑不会进入。

那么,如果“暂存区”只是一个索引——文件列表,那么它如何跟踪第一次编辑是什么?

4

5 回答 5

20

索引是准备好提交的工作目录的视图。它可以看作是一种预提交状态,并不像“文件列表”那么简单。当您这样做git add时,文件(带有更改)将添加到索引中,并且在您也添加它们之前不会看到较新的更改。

于 2012-08-27T08:05:53.623 回答
5

index就像一篮子已完成的工作。在任何时候,您都可以add将(部分)已完成的文件放入该篮子,它将用您当前的副本替换以前的副本,这样当您最终决定时commit,它将使用该篮子(当前index)的内容来创建犯罪。

此外,您之前add将在 repo 中创建一个 blob 对象,如果需要,可以通过各种日志找到该对象。一段时间后(30 天+),它会随着 消失gc

于 2012-08-27T12:58:28.920 回答
2

它是一个索引,而是一个修改树列表,而不是直接的文件。查看不同类型的对象 git handle

于 2012-08-27T08:04:38.233 回答
2

那么,如果“暂存区”只是一个索引——一个列表,它如何跟踪第一次编辑是什么?

索引是名称列表和指向内容的指针。在书中,它是页码。在 Git 索引中,它是存储库对象数据库中的对象 ID。

这就是 Git 索引,一个路径名索引的内容指针列表。

git add对于一些路径名基本上是

sha=`git hash-object -w path/to/it`
git update-index --cacheinfo 100644,$sha,path/to/it 

除了git add检查可执行文件和100755这些文件的用途,并递归添加和检查你的.gitignore和其他看起来通常最方便的东西。这是一个方便的命令,用于向对象 db 添加内容并更新索引。

于 2020-07-01T17:05:14.967 回答
-3

暂存区不仅仅是一个列表,也不是一个索引,它表示在 git 提交完成时将提交哪些文件。

如果是那样的话,即一个简单的列表,git add就永远不会像宣传的那样工作。

相反,git add必须在给出 add 命令时保存文件的内容。所以它对文件进行快照,然后将这些快照放入暂存区域(也称为“索引”,恕我直言,这对于名称来说确实是一个相当糟糕的选择)。

所以是的,事实上,这本书的陈述具有误导性和混淆性。 但这也不足为奇。许多 git 文档令人困惑且考虑不周。

继续标记我。我确定我是对的。

于 2020-07-01T00:09:39.337 回答