Initial commit 和 No commits yet 代表来自 git status 的同一事物。旧版本的 Git 说的是前者;新版本的 Git 说的是后者。当 Git 人员发现 Git 新手发现 No commits yet 消息更容易理解时,他们改变了它。既然你说的是No commits yet,那么你的 Git 版本比你写指令的人要新。
未跟踪的文件是不在 Git 的 索引 中的文件。如果您希望该文件出现在您的下一次提交中,您必须使用git add 将文件添加到Git 的索引。
在 Git 中,索引是一件大而复杂的事情,但作为一个 Git 新手,现在有一个简单的方法可以考虑它:Git 的索引包含您的建议的下一次提交。这个索引的东西太重要了,它有三个名字:
- 索引(正如我在上面使用的那样);或
-
暂存区:这描述了您将如何使用索引;或
-
缓存。
这个姓氏现在非常罕见,主要作为各种 Git 命令的标志出现,例如 git diff --cached 或 git rm --cached。但是这三个名字都指的是同一个东西,真的。1
这里要意识到的是,一旦您进行提交,您存储在中提交的文件将永久存储为只读存档。2所以它们变得“安全”:如果你搞砸了,你可以把它们拿回来。这些文件的已提交存档 版本实际上无法更改,即使 Git 本身也无法更改。它们以特殊、只读、压缩和去重格式存储,您的计算机本身也无法读取:只有 Git 可以读取它们,没有任何东西可以写入它们(除了每次提交仅发生一次存档创建)。
因为提交的文件确实不能使用,所以您必须先让Git 将它们从提交中复制出来,然后才能使用提交。这就是git checkout 或新的(Git 2.23 或更高版本)git switch 所做的:它复制提交的文件,以便您可以查看和使用它们。
您可以看到和使用的副本存在于 Git 称之为您的工作树的地方。这些文件是普通的日常文件,每个程序都可以正常读写。这些是您用来完成工作的文件。
棘手的一点——Git 的索引出现在哪里——是,Git 在任何时候都为每个文件保留一个第三个副本。提交中有一份副本,而您的工作树中每天都有一份。但是在这两者之间,Git 拥有每个文件的额外索引 副本。这个索引“副本”是预先去重的,因此git commit 会快速运行,并且实际上不会为与旧的、已提交的文件相同的文件占用任何空间。但是每个文件的每个索引副本始终存在。它就在那里,准备好了,准备在下一次提交中提交。
这就是使索引成为您建议的下一次提交的原因:它保存了每个文件的副本,准备提交。当您运行git commit 时,Git 不会查看您的工作树 文件。它查看并保存为新的存档/提交 Git 索引中的副本。
在您运行git add 之前,任何给定文件的索引副本都与您签出的提交副本相匹配。如果没有检出提交的副本,则该文件甚至还没有在索引中。因此,如果您在工作树中创建了一个新文件,但它不在 Git 的索引中,Git 会将其列为未跟踪。3
1一个 Git 命令 git apply 在其 --index 和 --cached 标志之间进行了额外区分,但对于 git diff、--staged 和 --cached同样的事情。
2从技术上讲,只要提交本身存在,它们就会被存储,但通常是“永远”。稍后再担心此规则的例外情况。
3最终,您会发现一长串未跟踪的文件很烦人。有一种方法可以让git status 对一些未跟踪的文件闭嘴。但留到以后再说吧。