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将在结帐时拒绝覆盖该文件.
您提到的Git Pro书籍章节试图详细说明未跟踪文件的概念:
当您签出给定的SHA1时,您将获得所有版本化文件的"快照".
此快照未引用的任何文件都未跟踪.它不是Git树的一部分:
请参阅" git - 如何判断文件是否被git跟踪(通过shell退出代码)? "
您要忽略的任何文件都必须未跟踪(如本GitHub帮助页面中所述).
请注意,在将规则添加到此文件以忽略它之前,git不会忽略已跟踪的文件.
在这种情况下,文件必须是未跟踪的,通常是git rm --cached filename
跟踪文件是由Git处理(版本控制)的文件,曾经添加和提交.未经跟踪的文件是您不希望被控制的大多数时间文件,因为例如它们是由编译器生成的.
您将未跟踪的文件添加到.gitignore
文件中,以便Git不会询问您是否要跟踪它们.
从纯技术角度来看:被跟踪文件只是存在于 Git 索引中的文件。说它是一个“受版本控制”的文件是一种误导,因为这表明它是一个将其放入存储库的文件 - 而这对于跟踪文件来说不是必需的。
当您初始化一个新的 Git 存储库时,索引为空并且您工作目录中的所有文件都未跟踪。将文件添加到索引时会对其进行跟踪——此时会为其创建 SHA-1 哈希,并将对象条目放入 .Git\Objects 文件夹中。从那一刻起,Git 能够比较工作目录中同一文件的内容/名称,以跟踪更改、重命名和删除。只要文件存在于索引中,它就会被跟踪。