为什么在“ git add”和“ git commit”之间存在暂存区域?我理解这个概念,但是在实际提交之前看不到将文件添加到暂存区的意义。为什么不跳过此步骤?
一个主要原因是您不必提交整个工作目录。您可以将其部分移动到索引中并仅提交它们。
例如,您正在处理两个不同的事物,现在您的代码看起来像]
//random code
//bug fix
//new feature
您可以仅暂存//bug fix
行并提交,而不要暂存//new feature
行并提交。
您现在每个都有两个不同的提交。稍后在测试中,您意识到new feature
提交有问题,您可以删除new feature
提交,但不必重新提交错误修正
[正如Dickon Reed在他的回答中指出的那样,您还获得了性能,因为git commit
现在仅需要将索引中的内容添加到提交中。它不需要遍历您的树来查找所有更改。
这是纯粹的PITA(以我的拙见)。显然,大多数UI工具(实际上我所了解的所有东西,包括Eclipse的EGit,Mac XCode和GitHub客户端)都没有公开此功能。
我了解部分提交的概念。您不想提交文件系统上的所有内容。但是引入“阶段”的概念实在是太过分了。
当前办理登机手续共有4个阶段:
1. Your file system
2. The staging
3. your local repository
4. the remote upstream
git的UI前端不公开该暂存。它们向您显示了您的所有更改。您选中要提交的内容,然后在一个操作中进行提交。
可能是实现细节,已被提升为UI概念。而不是:
commit( X, Y, Z)
您有:
add(X), add(Y), add(Z), commit()
您可能只想提交一些更改。如果您修复了某些问题,则只能提交与该修复有关的更改。
我刚刚开始探索DVCS的奇妙世界,尽管我已经将自己的灵魂卖给了git demon,但我仍然持偏见。临时区域的概念有些冗余,但是您可以完全忽略临时区域(这是我在使用github客户端时所做的)。另一方面,它提供了更大的灵活性,所以我想说它是不显眼的冗余,有时可以为您提供一些帮助。
我突然想到的是,有太多的术语对其进行命名:缓存,暂存区,索引。显然,该设计决策是类似概念的集合,并且具有一定的历史意义。我的第一个赌注被证明是合理的-我去了Bitkeeper网站并在那里找到了“分期”(他们将其用于按需分支)
现在,我猜测在Bitkeeper管理Linux源代码时,此功能已被滥用,它不是为多个开发人员创建按需分支,而是仅由一名开发人员使用。后来由于该用例被证明是有用的,Git合并了“临时区域”的轻量级版本,可以通过为“索引”或“缓存”提供用户界面来方便地实现。