33

我是 Git 新手。我想知道什么是跟踪文件和未跟踪文件?我读了“Pro Git”,但还是不太明白。

有人可以通过提供一个例子向我解释两者之间的区别吗?

4

5 回答 5

20

如果文件受版本控制,则文件将被跟踪。

作为一个小例子,一个 C++ 项目将有

Makefile
main.cpp
interface.hpp
worker.cpp

作为源文件;你会把这些置于版本控制之下。在构建过程中,

main.o
worker.o
myapp

生成;这些不属于版本控制,因此您不要git add在它们上使用。他们仍然没有被追踪,因为 git 不在乎他们会发生什么。在您将它们添加到.gitignore(默认情况下忽略 .o 文件)之前,git 不知道您是要添加还是忽略它们,因此它会在git status您做出决定之前将它们与命令一起显示。

是否跟踪文件还取决于版本——假设您worker.cpp在以后的版本中自动生成并从版本控制中删除它。该文件现在在该版本中未跟踪。当您返回到文件仍受版本控制的版本时,git 将在签出期间拒绝覆盖该文件。

于 2012-03-12T08:15:34.523 回答
11

您提到的Git Pro 书籍章节试图详细说明未跟踪文件的概念:

当您签出给定的 SHA1 时,您会获得所有版本化文件的“快照”。
此快照未引用的任何文件都未跟踪。它不是 Git 树的一部分:
请参阅“ git - 如何判断文件是否被 git 跟踪(通过 shell 退出代码)?

您要忽略的任何文件都必须是未跟踪的(如此GitHub 帮助页面中所述)。

.gitignore请注意,在将规则添加到文件以忽略它之前,git 不会忽略已经跟踪的文件。
在这种情况下,必须取消跟踪文件,通常使用git rm --cached filename

文件状态生命周期

于 2012-03-12T08:12:41.017 回答
10

跟踪文件是由 Git 处理(版本控制)的文件,一旦添加并提交。未跟踪的文件大多数时候是您不想被控制的文件,因为例如它们是由您的编译器生成的。

您将未跟踪的文件添加到.gitignore文件中,这样 Git 就不会询问您是否要跟踪它们。

于 2012-03-12T08:13:44.787 回答
5

从纯粹的技术角度来看:被跟踪的文件只是存在于 Git 索引中的文件。说它是“受版本控制”的文件是一种误导,因为这表明它是一个进入 repo 的文件——而这对于跟踪文件不是必需的。

当你初始化一个新的 Git 存储库时,索引是空的,并且你工作目录中的所有文件都没有被跟踪。将文件添加到索引时会对其进行跟踪——此时会为其创建一个 SHA-1 哈希,并将一个对象条目放入 .Git\Objects 文件夹中。从那一刻起,Git 能够比较工作目录中同一文件的内容/名称,以跟踪更改、重命名和删除。只要文件存在于索引中,就会对其进行跟踪。

于 2017-04-27T21:39:32.410 回答
1

请记住,工作目录中的每个文件都可以处于以下两种状态之一:已跟踪或未跟踪。简而言之,被跟踪的文件是 Git 知道的文件。未跟踪的文件是其他所有文件——工作目录中不在上一个快照中且不在暂存区域中的任何文件。跟踪文件是上次快照中的文件;它们可以是未修改的、修改的或暂存的

于 2019-11-12T22:00:11.000 回答