为什么在git中有一个暂存过程?

问题描述 投票:17回答:5

为什么在“ git add”和“ git commit”之间存在暂存区域?我理解这个概念,但是在实际提交之前看不到将文件添加到暂存区的意义。为什么不跳过此步骤?

git
5个回答
19
投票

The truth is: the index is a staging area. Every SCM has it, but git shows it to you, and uses it effectively.

一个主要原因是您不必提交整个工作目录。您可以将其部分移动到索引中并仅提交它们。

例如,您正在处理两个不同的事物,现在您的代码看起来像]

//random code

//bug fix

//new feature

您可以仅暂存//bug fix行并提交,而不要暂存//new feature行并提交。

您现在每个都有两个不同的提交。稍后在测试中,您意识到new feature提交有问题,您可以删除new feature提交,但不必重新提交错误修正

[正如Dickon Reed在他的回答中指出的那样,您还获得了性能,因为git commit现在仅需要将索引中的内容添加到提交中。它不需要遍历您的树来查找所有更改。


13
投票
  1. git commit不必检查树中的每个文件来查看是否已更改。在可以节省大量时间的大树上。
  2. 通过暂存某些文件(或某些文件中的某些更改),您可以很好地控制要提交的内容和不提交的内容。例如,如果您在进行重大更改的过程中发现了一个小错误,则可以快速上一步并提交一个单行错误修复程序,而不会阻止所有其他更改。

4
投票

这是纯粹的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()

2
投票

您可能只想提交一些更改。如果您修复了某些问题,则只能提交与该修复有关的更改。


1
投票

我刚刚开始探索DVCS的奇妙世界,尽管我已经将自己的灵魂卖给了git demon,但我仍然持偏见。临时区域的概念有些冗余,但是您可以完全忽略临时区域(这是我在使用github客户端时所做的)。另一方面,它提供了更大的灵活性,所以我想说它是不显眼的冗余,有时可以为您提供一些帮助。

我突然想到的是,有太多的术语对其进行命名:缓存,暂存区,索引。显然,该设计决策是类似概念的集合,并且具有一定的历史意义。我的第一个赌注被证明是合理的-我去了Bitkeeper网站并在那里找到了“分期”(他们将其用于按需分支)

现在,我猜测在Bitkeeper管理Linux源代码时,此功能已被滥用,它不是为多个开发人员创建按需分支,而是仅由一名开发人员使用。后来由于该用例被证明是有用的,Git合并了“临时区域”的轻量级版本,可以通过为“索引”或“缓存”提供用户界面来方便地实现。

© www.soinside.com 2019 - 2024. All rights reserved.