【发布时间】:2019-07-15 05:52:13
【问题描述】:
下图是Git流程图,我很奇怪Git为什么要设计Index /Stage。
你知道 Repository 和 Workspace 之间的通信是本地的,Repository 和 Workspace 之间很容易提交或回滚em>。
为什么 Git 需要设计 Index /Stage ?
图片
【问题讨论】:
标签: git version-control git-index
下图是Git流程图,我很奇怪Git为什么要设计Index /Stage。
你知道 Repository 和 Workspace 之间的通信是本地的,Repository 和 Workspace 之间很容易提交或回滚em>。
为什么 Git 需要设计 Index /Stage ?
图片
【问题讨论】:
标签: git version-control git-index
暂存的文件用作显示,提交者可以在其中看到他将要添加到特定提交的更改。它还有助于输入git commit -a,这是@Romain 提到的一种不好的做法。
下面是另一个用例,
您在 a.txt 和 b.txt 中进行了更改,但无论出于何种原因,都需要为这些文件执行两次单独的提交(可能将 a.txt 推送到不同的分支,将 b.txt 推送到不同的分支!)。想象一下要承担的工作!
拥有索引文件只是让开发人员的生活变得轻松,这不是一个盲目的设计决定。
【讨论】:
git commit -a,甚至在任何时候都没有使用add。但你是对的,这同样危险。
git commit -a
Mercurial 是 Git 的索引/暂存区不是必需的存在证明。 Mercurial 和 Git 同样强大(至少就存储修订而言),但在 Mercurial 中,工作树 是 暂存区/建议的下一次提交。在 Git 中,工作树是无关紧要的,索引是暂存区/建议的下一次提交。
也就是说,Git 比 Mercurial 快得多。这种速度在很大程度上是由于 Git 保持其单独的索引(尽管很多也是由于 Mercurial 在 Python 中而不是 C 中的实现)。所以如果你愿意的话,索引的存在使 Git 获得了相当多的“快速”。
虽然有些人认为单独的暂存区只是一种烦恼,但其他人(正如您在其他答案中看到的那样)发现这个单独的暂存区非常方便。特别是,您可以暂存某些东西——将文件的某个版本从工作树复制到暂存区域——然后进一步或以不同方式修改工作树文件,例如添加不在 to - 提交该文件的副本。使用git add -p 和git reset -p,您可以添加和删除特定修复,同时将调试部分仅保留在工作树中。
所以这提供了拥有索引的两个动机:你可以有一个与你的工作树故意不同的暂存区域,并且 Git 运行得更快 因为Git 的暂存区域是 已经适合提交。 (Mercurial 的不准备好提交:必须首先将工作树按摩成适合提交的形式,无论哪种语言实现按摩或您在此问题上投入多少缓存,这里仍然需要一些计算工作。)
一旦您接受了独立暂存区的想法,这将提供第三个动机:现在您可以随时创建额外的暂存区,如果这对某些特定目的有用的话。例如,git stash 就是这样实现的。 (它也涉及到git worktree add,虽然额外的工作树被添加为 pair: 你会得到一个带有新索引的新工作树。如果有的话,那就是新的工作树应该是新的索引,即Mercurial模型更好!)
【讨论】: