我是Git的新手。我想知道什么是跟踪和未跟踪文件? 我读过“Pro Git”,但仍然不太明白。
有人可以通过提供一个例子向我解释两者之间的区别吗?
答案 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
答案 2 :(得分:7)
跟踪文件是由Git处理(版本控制)的文件,曾经添加和提交。未经跟踪的文件是您不希望被控制的大多数时间文件,因为例如它们是由编译器生成的。
您将未跟踪的文件添加到.gitignore
文件中,以便Git不会询问您是否要跟踪它们。
答案 3 :(得分:3)
从纯技术角度来看:跟踪文件只是Git索引中存在的文件。说它是一个“受版本控制”的文件是误导性的,因为这表明它是一个文件,使其成为回购 - 而且这不是一个文件被跟踪所必需的。
当你初始化一个新的Git仓库时,索引是空的,工作目录中的所有文件都没有跟踪。将文件添加到索引时会跟踪文件 - 此时会为其创建SHA-1哈希,并将对象条目放入.Git \ Objects文件夹中。从那一刻开始,Git能够比较工作目录中同一文件的内容/名称,以便跟踪更改,重命名和删除。只要文件存在于索引中,就会对其进行跟踪。
答案 4 :(得分:1)
请记住,工作目录中的每个文件可以处于以下两种状态之一:已跟踪或未跟踪。简而言之,跟踪文件是Git知道的文件。未跟踪的文件是其他所有内容-工作目录中所有不在上一个快照中且不在暂存区中的文件。跟踪的文件是上一个快照中的文件;它们可以未经修改,修改或上演