在Git上下文中,什么是跟踪文件和未跟踪文件?

uoifb46i  于 2022-12-25  发布在  Git
关注(0)|答案(6)|浏览(225)

我是Git新手。我想知道什么是“跟踪”和“未跟踪”文件?我读了“Pro Git”,但还是不太明白。
谁能举个例子给我解释一下两者的区别?

cxfofazt

cxfofazt1#

如果文件受版本控制,则会跟踪该文件。
举个小例子,一个C++项目应该

Makefile
main.cpp
interface.hpp
worker.cpp

作为源文件;你应该把它们置于版本控制之下。在构建过程中,

main.o
worker.o
myapp

被生成;这些文件不受版本控制,所以你不用对它们使用git add。它们保持在 untracked 状态,因为git不关心它们会发生什么。在你把它们添加到.gitignore之前(默认情况下忽略.o文件),git不知道你是想添加还是忽略它们,所以它用git status命令显示它们,直到你做出决定。
一个文件是否被跟踪还取决于版本--假设你自动生成worker.cpp,并在以后的版本中将其从版本控制中删除,那么这个文件在那个版本中就不再被跟踪了。当你回到一个文件仍在版本控制中的版本时,git会在 checkout 时拒绝覆盖该文件。

uxhixvfz

uxhixvfz2#

您提到的Git Pro book chapter试图详细说明未跟踪文件的概念:
checkout 给定的SHA1时,您将获得所有版本控制文件的“快照”。

任何未被此快照引用的文件都不会被跟踪。它不是Git树的一部分:

参见“git - how to tell if a file is git tracked (by shell exit code)?
必须取消跟踪任何要忽略的文件(如GitHub help page中所述)。
注意,git不会忽略在添加规则到.gitignore文件之前已经跟踪过的文件。
在这种情况下,必须取消跟踪文件,通常使用git rm --cached filename

eni9jsuy

eni9jsuy3#

被跟踪的文件是Git处理的文件(版本控制),它们被添加并提交过。未跟踪的文件大多数时候是你不想被控制的文件,因为它们是由你的编译器生成的。
您可以将未跟踪的文件添加到.gitignore文件中,这样Git就不会询问您是否要跟踪它们。

y0u0uwnf

y0u0uwnf4#

从纯技术Angular 来看:被跟踪的文件只是存在于Git索引中的文件,如果说它是一个“受版本控制”的文件,这是一种误导,因为这意味着它是一个进入repo的文件--而这对一个被跟踪的文件来说是不必要的。
当你初始化一个新的Git repo时,索引是空的,工作目录中的所有文件都不会被跟踪。一个文件在被添加到索引时会被跟踪--此时会为它创建一个SHA-1散列,并在.Git\Objects文件夹中放置一个对象条目。从那时起,Git就可以比较工作目录中同一文件的内容/名称,以跟踪更改、重命名和删除。只要文件存在于索引中,就对其进行跟踪。

vfh0ocws

vfh0ocws5#

请记住,工作目录中的每个文件都可以处于以下两种状态之一:跟踪的或未跟踪的。简而言之,跟踪的文件是Git知道的文件。未跟踪的文件是其他的一切-任何在你的工作目录中,不在你的最后一个快照中,也不在你的暂存区中的文件。跟踪的文件是在最后一个快照中的文件;它们可以是未修改的、修改的或分段的

a14dhokn

a14dhokn6#

跟踪 您设置为'git add'或'git commit'的文件(我的意思是这些文件已经在git的控制之下)*
未跟踪 未使用'git add'或'git commit'的文件(如果添加或提交了一个X文件-这意味着git会跟踪该X文件)*

    • 当你第一次添加文件到工作目录时,它们都是未被跟踪的。要让Git跟踪它们,你需要暂存它们(git add)或将它们添加到本地仓库(git commit)*

相关问题