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

Nay*_*oni 25 git git-track git-untracked

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

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

谢谢,Nayan

Sim*_*ter 15

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

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

Makefile
main.cpp
interface.hpp
worker.cpp
Run Code Online (Sandbox Code Playgroud)

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

main.o
worker.o
myapp
Run Code Online (Sandbox Code Playgroud)

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

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

  • 我不明白为什么有人想要长时间处理未跟踪的文件,要么被跟踪,要么属于 gitignore ......在 gitignore 中没有提到的未跟踪文件的目的是什么? (3认同)

Von*_*onC 9

您提到的Git Pro书籍章节试图详细说明未跟踪文件的概念:

当您签出给定的SHA1时,您将获得所有版本化文件的"快照".
此快照未引用的任何文件都未跟踪.它不是Git树的一部分:
请参阅" git - 如何判断文件是否被git跟踪(通过shell退出代码)? "

您要忽略的任何文件都必须未跟踪(如本GitHub帮助页面中所述).

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

在此输入图像描述

  • 添加未跟踪的文件会将其添加到暂存区域,箭头应指向已暂存而不是未修改 (2认同)

Cha*_*esB 7

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

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

  • 说"跟踪文件"是曾经添加和提交的文件是完全错误的.跟踪文件只是一个存在于索引树中的文件 - 它是如何到达那里的,可能是由于分支检出或由于添加或由于直接的Git管道命令. (2认同)

Jaz*_*mov 5

从纯技术角度来看:被跟踪文件只是存在于 Git 索引中的文件。说它是一个“受版本控制”的文件是一种误导,因为这表明它是一个将其放入存储库的文件 - 而这对于跟踪文件来说不是必需的。

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