Git 什么是;重置后未老化的更改“重置”;用吉特是什么意思?

Git 什么是;重置后未老化的更改“重置”;用吉特是什么意思?,git,Git,我无意中添加了一堆文本文件到我的git repo中,并试图将其解压缩(在提交之前): 当命令运行时,它说: unstaged changes after reset: dir2/file.h dir4/file2.cc ... 这些文件与重置通配符无关。据我所知,这些文件仍处于修改后的提交阶段,看起来完好无损。git想告诉我什么?git试图在这里提供帮助,在这种情况下,可能是帮助过度了。短语unstagechanges是一种思考问题的方式,旨在简化Git的使用。这并不总是有效的,因为Git是复

我无意中
添加了一堆文本文件到我的git repo中,并试图将其解压缩(在提交之前):

当命令运行时,它说:

unstaged changes after reset:
dir2/file.h
dir4/file2.cc
...

这些文件与重置通配符无关。据我所知,这些文件仍处于修改后的提交阶段,看起来完好无损。git想告诉我什么?

git试图在这里提供帮助,在这种情况下,可能是帮助过度了。短语unstagechanges是一种思考问题的方式,旨在简化Git的使用。这并不总是有效的,因为Git是复杂的

下面是一个潜在的现实:Git在任何时候都有1到3份每个文件的副本。其中两个副本实际上是看不到的,至少在您通常使用的文件导航工具中是看不到的

当您思考提交是什么以及它的作用时,这三个副本中的两个是有意义的:

  • 每次提交都会保存每个文件的完整快照,并永久保存。文件的快照版本取决于您(或任何人)提交时该文件的外观。(每个提交还包含一些其他内容,一些元数据,或关于提交本身的信息,但我们在这里忽略这些。)

  • 因为每次提交都有每个文件的完整快照,所以提交中存储的文件不会作为普通的日常文件存储。如果是这样的话,您的存储库将以可笑的速度增长到巨大的脂肪

  • 因此,Git提交中的文件以一种特殊的、只读的、仅Git的、压缩的和消除重复的格式存储。因为它们是只读的,所以提交共享这些文件副本是完全安全的。使用一万个文件进行新的提交,但其中9999个文件与上次提交的文件相同,实际上只需重新使用9999个文件,并仅对一个更改的文件进行快照。而且,如果文件已更改回以前某次提交时的状态,则最后一个文件将与以前的提交共享,这样新快照就不会占用任何空间。2

以上所有内容的问题在于,提交中的文件对于完成任何实际工作都是完全不可用的:它们只能由Git读取,甚至Git本身都无法写入。因此,要使用提交,Git必须将其复制出来,将文件从其特殊的Git-only格式扩展到普通的日常文件。这些日常表单文件进入Git所称的工作树或工作树

因此,这一切都是有意义的:某些文件的两个“活动”副本,例如
README.md
或其他任何文件,是当前提交版本。这一个是只读的,并且位于您选择作为当前提交的任何提交中,只有Git可以查看和读取它以及您的工作树版本,而它实际上不在Git中。Git已经将它提取到一个工作区,您现在正在使用它,但它不在存储库中。它从存储库中复制出来;从那时起,它可能已经改变,也可能没有改变

两个拷贝是我们真正需要的,其他不是Git的版本控制系统到此为止,只有两个“活动”拷贝。但不管出于什么原因,不管是好是坏,Git都不会就此止步。Git插入,介于冻结的
README.md
和有用的第三个副本之间。第三个副本位于Git以各种方式调用的索引或暂存区域中,现在很少调用缓存。这三个名字都是同一事物的名字


嗯,大多数时候。如果你把事情分解得足够好,特别是如果你使用一些Git的非面向用户的工具,你可以做一些有趣的小把戏或者其他什么。还有所谓的裸存储库,它们根本没有工作树,除非您临时指定一个工作树;这是我们在这里忽略的另一个复杂问题

2例外,即存放元数据所需的空间。这里的细节也很棘手。所有这些的要点是,通过重新使用旧文件,Git可以保持其存储库的小型化。考虑到文件被压缩的方式,在某些情况下,具有许多提交的Git存储库有时比任何签出版本都小

3 Git的一些内部部分区分了索引(通常是文件
.Git/index
)和缓存(此时是内存中的数据结构)。非常古老的
git apply
命令有两个独立的标志,
--index
--cached
,它们执行不同的操作。但是
gitrm--cached
实际上意味着从索引中删除;例如,在这里,“索引”和“缓存”这两个词实际上是同义词


索引里有什么 从技术上讲,索引中的内容不是文件本身:它是文件名Git看到的文件全名,带有斜杠,如
path/to/file.ext
,还有一大堆内部内容,其中一些内容可以通过
Git ls文件--stage
看到。(尝试一下,但要注意,它会在不停顿的情况下输出大量的输出。)

但是,撇开技术细节不谈,索引的作用是它保存了您提议的下一次提交。索引中的文件与提交中的文件格式相同。它们是预压缩和预消除重复的,但与提交的副本不同,Git可以通过删除已消除重复的副本并创建新的消除重复的副本来覆盖它们

最初,当您
git checkout
某个特定的提交分支
功能上的最新提交或tip提交时,例如git用提交的文件填充其索引,并用这些文件填充您的工作树结果是所有三个活动副本都匹配。提交的只读副本与索引副本匹配。可以替换的索引副本与提交的副本和工作树副本都匹配

在您进行工作时,您将修改一些文件。这些将是
unstaged changes after reset:
dir2/file.h
dir4/file2.cc
...
git reset dir/*.txt