我是Git新手。我想知道什么是“跟踪”和“未跟踪”文件?我读了“Pro Git”,但还是不太明白。谁能举个例子给我解释一下两者的区别?
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 时拒绝覆盖该文件。
git add
.gitignore
git status
worker.cpp
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
git rm --cached filename
eni9jsuy3#
被跟踪的文件是Git处理的文件(版本控制),它们被添加并提交过。未跟踪的文件大多数时候是你不想被控制的文件,因为它们是由你的编译器生成的。您可以将未跟踪的文件添加到.gitignore文件中,这样Git就不会询问您是否要跟踪它们。
y0u0uwnf4#
从纯技术Angular 来看:被跟踪的文件只是存在于Git索引中的文件,如果说它是一个“受版本控制”的文件,这是一种误导,因为这意味着它是一个进入repo的文件--而这对一个被跟踪的文件来说是不必要的。当你初始化一个新的Git repo时,索引是空的,工作目录中的所有文件都不会被跟踪。一个文件在被添加到索引时会被跟踪--此时会为它创建一个SHA-1散列,并在.Git\Objects文件夹中放置一个对象条目。从那时起,Git就可以比较工作目录中同一文件的内容/名称,以跟踪更改、重命名和删除。只要文件存在于索引中,就对其进行跟踪。
vfh0ocws5#
请记住,工作目录中的每个文件都可以处于以下两种状态之一:跟踪的或未跟踪的。简而言之,跟踪的文件是Git知道的文件。未跟踪的文件是其他的一切-任何在你的工作目录中,不在你的最后一个快照中,也不在你的暂存区中的文件。跟踪的文件是在最后一个快照中的文件;它们可以是未修改的、修改的或分段的
a14dhokn6#
跟踪: 您设置为'git add'或'git commit'的文件(我的意思是这些文件已经在git的控制之下)*未跟踪: 未使用'git add'或'git commit'的文件(如果添加或提交了一个X文件-这意味着git会跟踪该X文件)*
6条答案
按热度按时间cxfofazt1#
如果文件受版本控制,则会跟踪该文件。
举个小例子,一个C++项目应该
作为源文件;你应该把它们置于版本控制之下。在构建过程中,
被生成;这些文件不受版本控制,所以你不用对它们使用
git add
。它们保持在 untracked 状态,因为git不关心它们会发生什么。在你把它们添加到.gitignore
之前(默认情况下忽略.o文件),git不知道你是想添加还是忽略它们,所以它用git status
命令显示它们,直到你做出决定。一个文件是否被跟踪还取决于版本--假设你自动生成
worker.cpp
,并在以后的版本中将其从版本控制中删除,那么这个文件在那个版本中就不再被跟踪了。当你回到一个文件仍在版本控制中的版本时,git会在 checkout 时拒绝覆盖该文件。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
eni9jsuy3#
被跟踪的文件是Git处理的文件(版本控制),它们被添加并提交过。未跟踪的文件大多数时候是你不想被控制的文件,因为它们是由你的编译器生成的。
您可以将未跟踪的文件添加到
.gitignore
文件中,这样Git就不会询问您是否要跟踪它们。y0u0uwnf4#
从纯技术Angular 来看:被跟踪的文件只是存在于Git索引中的文件,如果说它是一个“受版本控制”的文件,这是一种误导,因为这意味着它是一个进入repo的文件--而这对一个被跟踪的文件来说是不必要的。
当你初始化一个新的Git repo时,索引是空的,工作目录中的所有文件都不会被跟踪。一个文件在被添加到索引时会被跟踪--此时会为它创建一个SHA-1散列,并在.Git\Objects文件夹中放置一个对象条目。从那时起,Git就可以比较工作目录中同一文件的内容/名称,以跟踪更改、重命名和删除。只要文件存在于索引中,就对其进行跟踪。
vfh0ocws5#
请记住,工作目录中的每个文件都可以处于以下两种状态之一:跟踪的或未跟踪的。简而言之,跟踪的文件是Git知道的文件。未跟踪的文件是其他的一切-任何在你的工作目录中,不在你的最后一个快照中,也不在你的暂存区中的文件。跟踪的文件是在最后一个快照中的文件;它们可以是未修改的、修改的或分段的
a14dhokn6#
跟踪: 您设置为'git add'或'git commit'的文件(我的意思是这些文件已经在git的控制之下)*
未跟踪: 未使用'git add'或'git commit'的文件(如果添加或提交了一个X文件-这意味着git会跟踪该X文件)*