跟踪文件和暂存文件有什么区别?

8
我刚开始阅读 S. Chacon 和 B. Straub 的书籍《Pro Git》。在第二章中,在“记录更改到仓库”一节中,你会发现以下说明:
请记住,工作目录中的每个文件都可以处于跟踪或未跟踪状态。已跟踪的文件是上次快照中的文件;它们可以是未修改的、修改的或暂存的。
由此,我得出的印象是,已跟踪文件的集合可能比已暂存文件的集合更大。但同时,当我查看 this link 时,我看到下面的语句似乎与书中所写相矛盾:
要告诉 Git 开始跟踪对 octocat.txt 进行的更改,我们首先需要使用 git add 将其添加到暂存区。
这似乎意味着每个已暂存的文件都是已跟踪的文件,反之亦然。
我错过了什么?
3个回答

11

它们并不矛盾。
你是对的,每个暂存的文件都是被跟踪的文件,但你是错的,不是每个被跟踪的文件都是暂存的。
在暂存区域中,你可以收集组成下一次提交的更改。
因此,如果你修改了一个文件并将其更改添加到索引中,那么这个文件就是已暂存的,而所有其他已提交的文件也是被跟踪的文件。


6
每个被分阶段的文件都会被跟踪,但反之则不然。在Git中,被跟踪的文件意味着它“在Git的雷达范围内”,换句话说,Git会跟踪该文件的版本控制。为了更好地理解什么是被跟踪的文件,我们可以考虑什么是未被跟踪的文件。在您的本地系统上,未被跟踪的文件没有进行版本控制,因此不存在于远程Git存储库中。对于Git来说,未被跟踪的文件实际上并不存在,但对于您来说,它至少存在于您的本地文件系统中。
Git的暂存区是Git实际执行大部分操作的地方。例如,如果您想提交您的工作,您需要将要包含在该提交中的文件放入暂存区。为了更好地理解什么是已被分阶段的文件,我们可以考虑已被分阶段的文件与未被分阶段但已被跟踪的文件之间的行为差异。如果您执行提交操作,它将由已被分阶段的文件的所有更改(差异)组成,但未被分阶段的已被跟踪的文件将在此操作期间被忽略。

谢谢你的出色回答,但是Vampire的回答比你早了几分钟(+1)。 - John Kalane
git init时会发生特殊的事情吗?我有两个文件,一个是未跟踪的(main.cpp),另一个是已跟踪的(myfile.cpp)。两个文件都包含文本。两个文件都从未被添加到git。对myfile.cpp运行git diff显示所有我的代码都是新的(即它正在与一个空文件/dev/null进行比较)。但对main.cpp运行git diff则没有任何输出,因为它是一个未跟踪的文件。为什么myfile.cpp变成了git跟踪的文件,而main.cpp没有呢?我认为main.cppgit init时已经存在,所以我只能假设这对所有这些都有一定影响。有什么想法吗? - undefined

3

"Staged"是“已跟踪”的一个子状态。文件可以是“已跟踪”或“未跟踪”。如果它们被跟踪,它们可以是未修改的、已修改的或“已暂存”的。通过git add <filename>命令,新文件将变为“已暂存”。

要深入了解git中的文件状态,请参阅Git基础知识-记录更改


5
一个重要的区别是:文件 只有被追踪或未被追踪的区别,但对于被追踪的文件,更改 可以是已暂存或未暂存的。你可以有一个单独的文件,它既有已暂存又有未暂存的更改(例如,编辑一个文件,暂存所有更改,然后再次编辑该文件)。 - chepner

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