Git未跟踪的文件和;工作目录;

Git未跟踪的文件和;工作目录;,git,working-directory,Git,Working Directory,我是Git和VCS的新手。我有一个问题要问我好几天。如果Git不关心Git项目中的未跟踪文件,为什么在发出Git status命令时,它会在未跟踪文件下显示Git回购的状态 工作树是否必须位于我克隆的git项目中?工作树是一个虚拟的概念吗 Git关心未跟踪的文件。他们是Git存储库的新手。这里的“未跟踪”是一个重要的选项,如修改的,删除的,等等。谁知道呢,您可能想要跟踪它们。如果您不想看到它们处于git状态,但必须保留它们,请提供帮助。而且,Github推荐用于许多流行的操作系统、环境和语言 在

我是Git和VCS的新手。我有一个问题要问我好几天。如果Git不关心Git项目中的未跟踪文件,为什么在发出Git status命令时,它会在未跟踪文件下显示Git回购的状态

工作树是否必须位于我克隆的git项目中?工作树是一个虚拟的概念吗


Git关心未跟踪的文件。他们是Git存储库的新手。这里的“未跟踪”是一个重要的选项,如
修改的
删除的
,等等。谁知道呢,您可能想要跟踪它们。如果您不想看到它们处于
git状态
,但必须保留它们,请提供帮助。而且,Github推荐用于许多流行的操作系统、环境和语言


在大多数情况下,工作树位于存储库中,因为它是自然和方便的。但是一个
.git
可以有。这样,额外的工作树就位于存储库之外。下面是一个关于
git工作树

的简单介绍,git关心未跟踪的文件。他们是Git存储库的新手。这里的“未跟踪”是一个重要的选项,如
修改的
删除的
,等等。谁知道呢,您可能想要跟踪它们。如果您不想看到它们处于
git状态
,但必须保留它们,请提供帮助。而且,Github推荐用于许多流行的操作系统、环境和语言


在大多数情况下,工作树位于存储库中,因为它是自然和方便的。但是一个
.git
可以有。这样,额外的工作树就位于存储库之外。下面是一个关于
git worktree

的简单介绍,如果您创建新文件,最初它不会添加到任何分支。因此,它将显示为未跟踪的文件

如果要添加所有这些更改,请使用

git add -A 

如果要删除所有这些更改意味着

git clean -fd

如果创建新文件,最初不会将其添加到任何分支。因此,它将显示为未跟踪的文件

如果要添加所有这些更改,请使用

git add -A 

如果要删除所有这些更改意味着

git clean -fd
工作树是否必须位于我克隆的git项目中

正如ElpieKay回答的那样,不,不一定是这样,但这是正常的。每个Git存储库都有一口井,每个非裸Git存储库。(您还不必担心“裸存储库”,但它只是一个没有工作树的存储库,因此您无法使用它来做任何工作。这可能看起来很奇怪,也很奇怪。不过,像GitHub这样的地方是如何存储您的存储库的。)

工作树是一个虚拟的概念吗

我不知道你说的这个短语是什么意思。这是一个版本控制概念,尤其是在现代版本控制系统中。这些通常将内容分为提交/签入的文件和当前正在处理的文件。提交的文件进入存储库,它们永远保存在冻结的快照中,而您正在积极处理的文件则可以在其中使用和更改它们。工作表单文件进入工作树或工作树(关于如何拼写它,有几个变体,带或不带连字符;使用任意一个)

特别是对于Git,您还需要知道一件事,那就是Git对索引、暂存区域或缓存的不同调用。这些都是一个概念,只有三个名字。将Git与Mercurial进行比较很有用,Mercurial是另一个相当现代且非常类似的VCS,这里还有其他VCSE:Mercurial和其他VCSE确实有一个存储库和一个工作树(或工作树),但没有索引。所以Git是不寻常的。以下是对此的思考方式:

  • 提交的文件位于冻结(只读)快照中。为了使它们占用更少的空间,Git将它们存储在一种特殊的、仅限Git的格式中。这种格式是压缩的,有时非常压缩,很少有其他程序可以读取

  • 您正在处理的文件将进入工作树,您可以在其中处理它们。在这里,它们有其普通的、未压缩的形式,当然您可以覆盖它们。您还可以在工作树中存储Git不会冻结为快照的文件:这些是未跟踪的文件

  • Git的索引是一种特殊的中介,介于提交和工作树之间。索引中的文件已压缩为仅Git格式,但尚未提交(冻结)。他们100%准备承诺,但尚未实际承诺

运行
git commit
只需立即冻结索引中的任何文件。这就是为什么
git commit
速度如此之快的原因:如果您使用过其他VCSE,它们中的许多在运行“commit”动词时速度非常慢,因为它们花费大量时间扫描目录、压缩文件、准备冻结。在某些VCSE中,您实际上可以在等待承诺发生时去喝杯咖啡。:-)

如果您认为索引是Git将提交的内容,如果您现在运行
Git commit
,那么您对Git的索引有一个很好的概念。这自然导致了对跟踪文件与未跟踪文件的正确定义:跟踪文件是现在在索引中的文件,因此它将在下一次提交中;未跟踪的文件现在不在索引中,但在工作树中。(如果文件不在索引树或工作树中,则它根本不是文件。)


上面还有一点很重要:注意,我们还没有提到分支这个词。这是因为Git更关心提交,而不是分支。这些提交是Git使用
Git commit
创建的冻结快照,它们构成了您的分支,因此这些分支通过提交而出现。这使得提交成为最重要的部分:在
git add README.txt newfile.py
git commit
A  <-B  <-C  <-D   <--master