为什么Git需要设计索引/阶段?

为什么Git需要设计索引/阶段?,git,version-control,git-index,Git,Version Control,Git Index,下图是Git流程图,我很奇怪为什么Git需要设计索引/阶段 您知道存储库和工作区之间的通信是本地的,很容易在存储库和工作区之间提交或回滚 为什么Git需要设计索引/阶段 形象 这是即将提交的更改的预览。您可以增量地或一次性地在这个专用空间中构成未来的提交,检查其中的内容,并且仅当您对其内容感到满意时才提交 有些人几乎忽略了它的存在,从不使用add,依赖-a盲目地添加所有内容,但这被认为是一种不好的做法,因为在更复杂的情况下,理解索引将是至关重要的,这会给未来带来麻烦 我建议在文章中看一下。这是即

下图是Git流程图,我很奇怪为什么Git需要设计索引/阶段

您知道存储库和工作区之间的通信是本地的,很容易在存储库和工作区之间提交或回滚

为什么Git需要设计索引/阶段

形象


这是即将提交的更改的预览。您可以增量地或一次性地在这个专用空间中构成未来的提交,检查其中的内容,并且仅当您对其内容感到满意时才提交

有些人几乎忽略了它的存在,从不使用add,依赖-a盲目地添加所有内容,但这被认为是一种不好的做法,因为在更复杂的情况下,理解索引将是至关重要的,这会给未来带来麻烦


我建议在文章中看一下。

这是即将提交的更改的预览。您可以增量地或一次性地在这个专用空间中构成未来的提交,检查其中的内容,并且仅当您对其内容感到满意时才提交

有些人几乎忽略了它的存在,从不使用add,依赖-a盲目地添加所有内容,但这被认为是一种不好的做法,因为在更复杂的情况下,理解索引将是至关重要的,这会给未来带来麻烦


我建议在文章中查看。

暂存的文件作为一个显示,提交者可以在其中看到他将要添加到特定提交中的更改。它还有助于键入git commit-a,正如@Romain所提到的,这是一种糟糕的做法

下面是另一个用例, 您在a.txt和b.txt中进行了更改,但需要对这些文件执行两次单独的提交,无论出于何种原因,请将a.txt推送到另一个分支,将b.txt推送到另一个分支!。想象一下将要发生的工作


编制索引文件只会让开发人员的生活变得简单,这不是盲目的设计决策。

暂存的文件用作显示,提交者可以在其中看到他将要添加到特定提交中的更改。它还有助于键入git commit-a,正如@Romain所提到的,这是一种糟糕的做法

下面是另一个用例, 您在a.txt和b.txt中进行了更改,但需要对这些文件执行两次单独的提交,无论出于何种原因,请将a.txt推送到另一个分支,将b.txt推送到另一个分支!。想象一下将要发生的工作


建立索引文件只会简化开发人员的生活,而不是盲目的设计决策。

Mercurial是Git的索引/暂存区不必要的存在证明。Mercurial和Git至少在存储修订方面同样强大,但在Mercurial中,工作树是暂存区域/建议的下一次提交。在Git中,工作树是无关的,索引是暂存区域/建议的下一次提交

也就是说,Git比Mercurial快得多。这种速度很大程度上是Git保持其单独索引的结果,尽管很大程度上也是由于Mercurial用Python而不是C实现的。因此,如果您愿意的话,索引的存在使Git获得了相当大的速度

虽然有些人觉得单独的暂存区只不过是一种烦恼,但正如您在其他答案中看到的,其他人觉得这个单独的暂存区非常方便。特别是,您可以将某个文件的某个版本从工作树复制到暂存区域,然后进一步修改工作树文件,或者以其他方式修改工作树文件,例如添加不在该文件的待提交副本中的调试信息。使用git add-p和git reset-p,您可以添加和删除特定的修复程序,同时使调试部分仅存在于工作树中

因此,这提供了创建索引的两个动机:您可以有一个故意与工作树不同的临时区域,而Git的速度要快得多,因为Git的临时区域已经适合提交。Mercurial还没有准备好提交:必须首先将工作树转换成适合提交的形式,并且无论哪种语言实现了转换,或者您在这个问题上投入了多少缓存,这里仍然需要一些计算工作


一旦你接受了一个单独的暂存区的想法,这就提供了第三个动机:现在你可以随时创建额外的暂存区,如果这对某些特定目的有用的话。例如,这就是git stash的实现方式。git worktree add中也涉及到它,尽管额外的工作树是成对添加的:您将得到一个带有新索引的新工作树。如果有什么不同的话,那就是新的工作树应该是新的索引,即Mercurial模型更好

Mercurial的存在证明了Git的索引/暂存区域是不必要的。Mercurial和Git同样强大,至少在某种程度上是如此 s存储的修订将继续,但在Mercurial中,工作树是暂存区域/建议的下一次提交。在Git中,工作树是无关的,索引是暂存区域/建议的下一次提交

也就是说,Git比Mercurial快得多。这种速度很大程度上是Git保持其单独索引的结果,尽管很大程度上也是由于Mercurial用Python而不是C实现的。因此,如果您愿意的话,索引的存在使Git获得了相当大的速度

虽然有些人觉得单独的暂存区只不过是一种烦恼,但正如您在其他答案中看到的,其他人觉得这个单独的暂存区非常方便。特别是,您可以将某个文件的某个版本从工作树复制到暂存区域,然后进一步修改工作树文件,或者以其他方式修改工作树文件,例如添加不在该文件的待提交副本中的调试信息。使用git add-p和git reset-p,您可以添加和删除特定的修复程序,同时使调试部分仅存在于工作树中

因此,这提供了创建索引的两个动机:您可以有一个故意与工作树不同的临时区域,而Git的速度要快得多,因为Git的临时区域已经适合提交。Mercurial还没有准备好提交:必须首先将工作树转换成适合提交的形式,并且无论哪种语言实现了转换,或者您在这个问题上投入了多少缓存,这里仍然需要一些计算工作


一旦你接受了一个单独的暂存区的想法,这就提供了第三个动机:现在你可以随时创建额外的暂存区,如果这对某些特定目的有用的话。例如,这就是git stash的实现方式。git worktree add中也涉及到它,尽管额外的工作树是成对添加的:您将得到一个带有新索引的新工作树。如果有什么不同的话,那就是新的工作树应该是新的索引,即Mercurial模型更好

作为旁注,我提到的实践是git提交-a,在任何时候都不使用add。但你是对的,这同样是危险的。是的……这是git commit-aAs的旁注,我提到的实践是git commit-a,在任何时候都不使用add。但你是对的,这同样是危险的。是的…这是git commit-aAfaik add,它实际上创建了所有文件对象等等,而commit只是创建了commit对象。Afaik add,它实际上创建了所有文件对象等等,Mercurial和Git之间的比较不错Mercurial和Git之间的比较