我是 Git 新手。我想知道什么是跟踪文件和未跟踪文件?我读了“Pro Git”,但还是不太明白。
有人可以通过提供一个例子向我解释两者之间的区别吗?
我是 Git 新手。我想知道什么是跟踪文件和未跟踪文件?我读了“Pro Git”,但还是不太明白。
有人可以通过提供一个例子向我解释两者之间的区别吗?
如果文件受版本控制,则文件将被跟踪。
作为一个小例子,一个 C++ 项目将有
Makefile
main.cpp
interface.hpp
worker.cpp
作为源文件;你会把这些置于版本控制之下。在构建过程中,
main.o
worker.o
myapp
生成;这些不属于版本控制,因此您不要git add
在它们上使用。他们仍然没有被追踪,因为 git 不在乎他们会发生什么。在您将它们添加到.gitignore
(默认情况下忽略 .o 文件)之前,git 不知道您是要添加还是忽略它们,因此它会在git status
您做出决定之前将它们与命令一起显示。
是否跟踪文件还取决于版本——假设您worker.cpp
在以后的版本中自动生成并从版本控制中删除它。该文件现在在该版本中未跟踪。当您返回到文件仍受版本控制的版本时,git 将在签出期间拒绝覆盖该文件。
您提到的Git Pro 书籍章节试图详细说明未跟踪文件的概念:
当您签出给定的 SHA1 时,您会获得所有版本化文件的“快照”。
此快照未引用的任何文件都未跟踪。它不是 Git 树的一部分:
请参阅“ git - 如何判断文件是否被 git 跟踪(通过 shell 退出代码)? ”
您要忽略的任何文件都必须是未跟踪的(如此GitHub 帮助页面中所述)。
.gitignore
请注意,在将规则添加到文件以忽略它之前,git 不会忽略已经跟踪的文件。
在这种情况下,必须取消跟踪文件,通常使用git rm --cached filename
跟踪文件是由 Git 处理(版本控制)的文件,一旦添加并提交。未跟踪的文件大多数时候是您不想被控制的文件,因为例如它们是由您的编译器生成的。
您将未跟踪的文件添加到.gitignore
文件中,这样 Git 就不会询问您是否要跟踪它们。
从纯粹的技术角度来看:被跟踪的文件只是存在于 Git 索引中的文件。说它是“受版本控制”的文件是一种误导,因为这表明它是一个进入 repo 的文件——而这对于跟踪文件不是必需的。
当你初始化一个新的 Git 存储库时,索引是空的,并且你工作目录中的所有文件都没有被跟踪。将文件添加到索引时会对其进行跟踪——此时会为其创建一个 SHA-1 哈希,并将一个对象条目放入 .Git\Objects 文件夹中。从那一刻起,Git 能够比较工作目录中同一文件的内容/名称,以跟踪更改、重命名和删除。只要文件存在于索引中,就会对其进行跟踪。
请记住,工作目录中的每个文件都可以处于以下两种状态之一:已跟踪或未跟踪。简而言之,被跟踪的文件是 Git 知道的文件。未跟踪的文件是其他所有文件——工作目录中不在上一个快照中且不在暂存区域中的任何文件。跟踪文件是上次快照中的文件;它们可以是未修改的、修改的或暂存的