什么是GIT上下文中的跟踪文件和未跟踪文件?

时间:2012-03-12 08:04:34

标签: git git-track git-untracked

我是Git的新手。我想知道什么是跟踪未跟踪文件? 我读过“Pro Git”,但仍然不太明白。

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

5 个答案:

答案 0 :(得分:15)

如果文件受版本控制,则会跟踪该文件。

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

Makefile
main.cpp
interface.hpp
worker.cpp

作为源文件;你将这些置于版本控制之下。在构建期间,

main.o
worker.o
myapp

生成;这些不属于版本控制,因此您不要对它们使用git add。他们仍然未跟踪,因为git并不关心他们发生了什么。在将它们添加到.gitignore之前(默认情况下会忽略.o文件),git不知道您是要添加还是忽略它们,因此它会使用git status命令显示它们,直到您创建它为止。决定。

是否跟踪文件也取决于版本 - 假设您自动生成worker.cpp并在更高版本的版本控制中将其删除。该文件现在未在该版本中进行跟踪。当您返回到文件仍受版本控制的版本时,git将在结帐时拒绝覆盖该文件。

答案 1 :(得分:9)

你提到的Git Pro book chapter试图详细说明未跟踪文件的概念:

当您签出给定的SHA1时,您会获得所有版本化文件的“快照” 此快照未引用的任何文件未跟踪。它不是Git树的一部分:
请参阅“git - how to tell if a file is git tracked (by shell exit code)?

您要忽略的任何文件都必须未跟踪(如本GitHub help page中所述)。

  

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

enter image description here

答案 2 :(得分:7)

跟踪文件是由Git处理(版本控制)的文件,曾经添加和提交。未经跟踪的文件是您不希望被控制的大多数时间文件,因为例如它们是由编译器生成的。

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

答案 3 :(得分:3)

从纯技术角度来看:跟踪文件只是Git索引中存在的文件。说它是一个“受版本控制”的文件是误导性的,因为这表明它是一个文件,使其成为回购 - 而且这不是一个文件被跟踪所必需的。

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

答案 4 :(得分:1)

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