添加的文件是否会在git中上演?

时间:2014-02-18 09:53:04

标签: git

我正在阅读Pro Git书,并且有一个令我困惑的数字。这是File status lifecycle。它告诉添加的文件变为未修改,而不是暂存。它还says 跟踪文件是最后一个快照中的文件。所以我想象一下,当我修改添加但未提交的文件时,不需要暂存这些更改,因为在分阶段缓存中没有此文件的已保存版本。但是我错了。这是否意味着未跟踪状态的“添加文件”箭头应该导致暂存状态?

1 个答案:

答案 0 :(得分:0)

这个图有点令人困惑,但是是的。添加未跟踪的文件也会将其分段以进行提交。 add命令最好理解为将工作树中的更改添加到索引,然后使用索引中的更改来创建下一个快照/提交。因此git add <untracked file>将文件添加到索引(即它将其分阶段),git add <modified file>将更改的文件添加到索引,git add <deleted file>删除已删除的文件(即,如果您删除它而不使用{ {1}})来自索引。

您可以使用git rm查看索引中的内容。您将看到它只是对象,它们的哈希以及类似unix的文件模式(以及索引号,对于合并冲突状态,对于所有条目通常为0)的清单。因此,将文件添加并提交到新的repo,运行该命令,您将看到它已列出。 git ls-files --stage相同的文件,然后运行命令,你什么也看不见,因为你已经从索引中删除了唯一的条目。

请注意,索引中的项目具有哈希值。索引实际上只是一个文本文件(尽管它存储在二进制文件中),它在对象库中命名散列项。当您添加任何文件(未跟踪或修改)时,git将其哈希到.git / objects文件夹中,然后使用指向该哈希的条目更新索引,并具有该文件的路径/名称。这真的是所有索引(过去通常被称为'阶段'或'暂存区',尽管这些名称正在逐渐消失)。

下一次提交实际上只是一个文本文件,它指向索引中的内容树,因为索引基本上就是你说“这就是我希望下一次提交的样子”。是的,如果您添加一个文件,然后更改它,您将在索引中拥有该文件的版本,以及工作树中最新更新的版本,因此您也必须添加它,并且git将用新编辑的版本替换索引中的版本。