下图是 Git 流程图,我很奇怪为什么 Git 需要设计Index /Stage。
你知道Repository和Workspace之间的通信是本地的,在Repository和Workspace之间很容易提交或回滚。
为什么 Git 需要设计 Index /Stage ?
图片
下图是 Git 流程图,我很奇怪为什么 Git 需要设计Index /Stage。
你知道Repository和Workspace之间的通信是本地的,在Repository和Workspace之间很容易提交或回滚。
为什么 Git 需要设计 Index /Stage ?
图片
暂存的文件用作显示,提交者可以在其中看到他将要添加到该特定提交的更改。它还有助于打字,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 获得了相当多的“快速”。
虽然有些人认为单独的暂存区只是一种烦恼,但其他人(正如您在其他答案中看到的那样)发现这个单独的暂存区非常方便。特别是,您可以暂存某些东西——将文件的某个版本从工作树复制到暂存区域——然后进一步或以不同方式修改工作树文件,例如添加不在 to - 提交该文件的副本。使用git add -p
and git reset -p
,您可以添加和删除特定修复,同时让调试部分仅存在于工作树中。
所以这提供了拥有索引的两个动机:你可以有一个与你的工作树故意不同的暂存区域,并且 Git 运行得更快,因为Git 的暂存区域已经适合提交。(Mercurial 还没有准备好提交:必须先将工作树按摩成适合提交的形式,并且无论哪种语言实现按摩或您在这个问题上投入多少缓存,仍然会有一些计算在这里努力。)
一旦您接受了单独的暂存区的想法,这将提供第三个动机:现在您可以随时创建额外的暂存区,如果这对某些特定目的有用的话。例如,这git stash
就是实施方式。git worktree add
(虽然额外的工作树是成对添加的,但它也参与其中:你会得到一个带有新索引的新工作树。如果有的话,那就是新的工作树应该是新的索引,即Mercurial模型更好!)