在Git的上下文中,被追踪的文件和未被追踪的文件是什么?

38
''''我是新手使用Git。我想知道什么是“tracked”和“untracked”文件? 我读过《Pro Git》,但还是不能完全理解。
有人可以通过提供示例来解释两者之间的区别吗?''''
7个回答

23

只有在文件受版本控制时,该文件才会被跟踪。

以一个C++项目为小例子,它将会有:

Makefile
main.cpp
interface.hpp
worker.cpp

作为源代码文件,您需要将这些文件放入版本控制中。在构建过程中,

main.o
worker.o
myapp

生成的文件不应该被纳入版本控制,因此在这些文件上不要使用 git add 命令。它们会保持为未跟踪状态,因为 Git 不关心它们发生了什么变化。除非你将它们添加到 .gitignore 文件中(默认情况下,.o 文件是被忽略的),否则 Git 不知道你是想将其添加还是忽略,所以在使用 git status 命令时会显示这些文件,直到你做出决定。

一个文件是否被跟踪还取决于版本 -- 假设你自动生成了 worker.cpp 并在后续的版本中将其从版本控制中删除。在该版本中,该文件现在是未跟踪状态的。当你回到仍然包含该文件的版本时,Git 将拒绝在检出时覆盖该文件。


3
我不明白为什么有人想长期处理未跟踪的文件,它们要么被跟踪,要么应该加入到gitignore中去...那些未被提及在gitignore中的未跟踪文件的目的是什么? - Alexander Mills
“git在检出时拒绝覆盖该文件”是什么意思? - DollarAkshay

16
你提到的Git Pro书籍章节试图详细说明未跟踪文件的概念:
当你检出给定的SHA1时,你会得到所有版本化文件的“快照”。 任何没有被这个快照引用的文件都是未跟踪的。它不属于Git树: 请参见“git - 如何判断文件是否被Git跟踪(通过shell退出代码)?
你想要忽略的任何文件必须是未跟踪的(如此GitHub帮助页面所解释的)。
请注意,git不会忽略已经在规则被添加到.gitignore文件之前被跟踪的文件。 在这种情况下,该文件必须被取消跟踪,通常使用git rm --cached filename

File Status Lifecycle


2
添加未跟踪的文件将其添加到暂存区,箭头应指向已暂存而不是未修改。 - englealuze
“this file”短语中提到的文件是什么?是.gitignore吗?此外,@englealuze是正确的,这是正确的图片链接:https://git-scm.com/book/en/v2/images/lifecycle.png。 - iRestMyCaseYourHonor
@iRestMyCaseYourHonor .gitignore文件:我已经相应地编辑了答案。 - VonC

10

被 Git 处理(版本控制)的文件是已添加并提交的跟踪文件。未跟踪文件通常是您不希望受到控制的文件,例如由编译器生成的文件。

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


2
完全错误的说法是“已跟踪文件”是指曾经添加并提交的文件。已跟踪文件只是存在于索引树中的文件,它如何进入其中可能是由于分支检出、添加或直接使用 Git plumbing 命令。 - Jazimov

7
从纯技术角度来看:被追踪的文件只是存在于Git索引中的文件。说它是“在版本控制下的”文件是误导性的,因为这暗示着它是一个已经进入仓库的文件——但实际上,对于一个文件被跟踪来说,并不需要它进入仓库。
当你初始化一个新的Git仓库时,索引为空,你工作目录中的所有文件都是未被跟踪的。当一个文件被添加到索引中时,为它创建一个SHA-1哈希值,并将一个对象条目放置到.Git\Objects文件夹中。从那一刻起,Git就能比较工作目录中相同文件的内容/名称,以便跟踪更改、重命名和删除。只要文件存在于索引中,它就会受到跟踪。

1

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


你的意思是未跟踪的文件大多数情况下是工作树中的新文件吗? - Andrés Quiroz Valdovinos

1
  • 已跟踪已通过'git add'或'git commit'命令添加到Git控制下的文件。
  • 未跟踪未通过'git add'或'git commit'命令添加到Git控制下的文件(如果您添加或提交了一个X文件,则表示Git正在跟踪该X文件)。
  • 当您第一次将文件添加到工作目录时,它们都是未跟踪的。要让Git跟踪它们,您需要将它们暂存(git add)或将它们添加到本地仓库(git commit)。

0

已追踪的文件:

已追踪的文件是 Git 知道并主动管理的文件。这些文件是通过使用 git add 命令添加到 Git 仓库中,并使用 git commit 进行提交的。Git 跟踪这些文件的变化,允许您查看变更历史,切换不同版本(提交),并通过推送到远程仓库与他人共享这些变更。

未追踪的文件:

未追踪的文件是 Git 目前未管理的文件。通常,这些文件存在于您的仓库的工作目录中,但尚未使用 git add 添加到 Git 仓库中。未追踪的文件不会包含在提交中,并且 Git 不会保留对这些文件的变更历史,直到您明确使用 git add 将它们添加到仓库中。

您可以使用 git status 命令查看仓库中已追踪和未追踪文件的列表。已追踪的文件将显示在“将要提交的更改”部分下,而未追踪的文件将显示在“未追踪的文件”部分下。


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