Git上下文中的跟踪文件和未跟踪文件是啥?
Posted
技术标签:
【中文标题】Git上下文中的跟踪文件和未跟踪文件是啥?【英文标题】:What are tracked files and untracked files in the context of Git?Git上下文中的跟踪文件和未跟踪文件是什么? 【发布时间】:2012-03-28 15:24:54 【问题描述】:我是 Git 新手。我想知道什么是 tracked 和 untracked 文件? 我读了“Pro Git”,但还是不太明白。
有人可以通过提供一个例子向我解释两者之间的区别吗?
【问题讨论】:
【参考方案1】:如果文件受版本控制,则跟踪该文件。
举个小例子,一个 C++ 项目应该有
Makefile
main.cpp
interface.hpp
worker.cpp
作为源文件;你会把这些置于版本控制之下。在构建期间,
main.o
worker.o
myapp
生成;这些不属于版本控制,因此您不要在它们上使用git add
。他们仍然未跟踪,因为 git 不在乎他们会发生什么。在您将它们添加到.gitignore
之前(默认情况下忽略 .o 文件),git 不知道您是要添加还是忽略它们,因此它会使用 git status
命令显示它们,直到您做出决定。
是否跟踪文件还取决于版本 - 假设您自动生成 worker.cpp
并在更高版本中将其从版本控制中删除。该文件现在在该版本中未跟踪。当您回到文件仍受版本控制的版本时,git 将拒绝在结帐期间覆盖该文件。
【讨论】:
我不明白为什么有人要长期处理未跟踪的文件,无论是被跟踪的还是属于 gitignore 的...... gitignore 中提到过?git will refuse to overwrite that file during checkout.
是什么意思【参考方案2】:
跟踪的文件是由 Git 处理(版本控制)的文件,一旦添加并提交。未跟踪的文件大多数时候是您不想被控制的文件,因为例如它们是由您的编译器生成的。
您将未跟踪的文件添加到 .gitignore
文件中,这样 Git 就不会询问您是否要跟踪它们。
【讨论】:
说“跟踪文件”是一个曾经被添加并提交的文件是完全错误的。被跟踪的文件只是存在于索引树中的文件——它是如何到达那里的,可能是由于分支检出、添加或直接 Git 管道命令。【参考方案3】:您提到的Git Pro book chapter 试图详细说明未跟踪文件的概念:
当您签出给定的 SHA1 时,您会获得所有版本化文件的“快照”。此快照未引用的任何文件都不会被跟踪。它不是 Git 树的一部分: 见“git - how to tell if a file is git tracked (by shell exit code)?”
您要忽略的任何文件都必须是未跟踪的(如GitHub help page 中所述)。
请注意,在将规则添加到
.gitignore
文件以忽略它之前,git 不会忽略已经跟踪的文件。 在这种情况下,必须取消跟踪文件,通常使用git rm --cached filename
【讨论】:
添加未跟踪文件会将其添加到暂存区域,箭头应指向暂存而不是未修改 您在“此文件”短语中提到的文件是什么。是.gitignore 吗? @englealuze 也是对的,这是正确的图片链接:git-scm.com/book/en/v2/images/lifecycle.png @iRestMyCaseYourHonor.gitignore
文件:我已经相应地编辑了答案。【参考方案4】:
从纯技术角度来看:跟踪文件只是存在于 Git 索引中的文件。说它是“受版本控制”的文件是一种误导,因为这表明它是一个进入 repo 的文件——而这对于跟踪文件不是必需的。
当您初始化一个新的 Git 存储库时,索引为空,并且您工作目录中的所有文件都未跟踪。一个文件在添加到索引时会被跟踪——此时会为其创建一个 SHA-1 哈希,并将一个对象条目放入 .Git\Objects 文件夹中。从那一刻起,Git 能够比较工作目录中同一文件的内容/名称,以跟踪更改、重命名和删除。只要文件存在于索引中,就会被跟踪。
【讨论】:
【参考方案5】:请记住,工作目录中的每个文件都可以处于以下两种状态之一:已跟踪或未跟踪。简而言之,被跟踪的文件是 Git 知道的文件。未跟踪的文件是其他所有文件 — 工作目录中不在上一个快照中且不在暂存区域中的任何文件。跟踪的文件是上次快照中的文件;它们可以是未修改的、修改的或暂存的
【讨论】:
您的意思是未跟踪的文件在大多数情况下往往是 wirking 树中的新文件吗?以上是关于Git上下文中的跟踪文件和未跟踪文件是啥?的主要内容,如果未能解决你的问题,请参考以下文章
本地分支在没有明显原因的情况下显示未暂存的更改和未跟踪的文件[重复]
在 VSCode 中保存文件会删除 git repo 中的所有跟踪文件