什么是git的暂存区(staging),为什么Mercurial表面上不支持它?

30

Hg文档指出,hg不支持类似于git的索引功能,并建议使用扩展(record或mq)实现相似行为。

首先,我对git的领域经验非常少,所以让我来阐述一下我对git中staging概念的理解:

  • 有一个工作副本,其中包含许多已更改的文件,每个文件都有多个已更改的块。
  • 然后用户(可能反复)使用git add选择将要提交哪些文件。
  • 或者,使用git add -p仅选择文件中的某些块以供稍后提交。
  • 执行git commit以将之前选择的更改添加到存储库中。

因此,整个staging area对我来说是一个华而不实的名称,用于选择哪些更改将在下次提交中生效。

如果我没有完全理解错误,那么为什么每个人,包括官方文档,都说Mercurial不支持这个呢?

我想问,因为上面精确的工作流在TortoiseHg中是非常简单的:

enter image description here

  • 在左窗格中选择要包含在提交中的整个文件
  • 在右下窗格中选择单个块以包含
  • 点击'Commit'。

我不知道TortoiseHg使用的是哪些hg命令,但同样的,我从未需要关心。 (据我所知,它没有使用任何扩展来实现这一点)

我是否错过了更多与git staging相关的概念?

2个回答

34

暂存区(索引)记录的是修改快照,而不仅仅是文件选择。例如,您可以修改文件A以添加 foo,将文件A加入暂存区,然后再次修改文件A以添加 bar。如果您不重新将文件A加入暂存区,则在提交时,只有 foo 将被提交,因为暂存区记录了加入暂存区时的文件A的快照。

您也可以通过 git checkout 将文件还原到上一个暂存区快照的状态。本质上,暂存区就像一个“临时提交”,在实际进行完整提交之前容易修改。

由于暂存区是持久性的,如果您在暂存一部分内容时发现需要进行另一个更改,那么没问题 - 只需进行更改,然后将新版本加入暂存区。无需重新将已经暂存的所有其他内容加入暂存区。

如果在提交之前意外删除了一个文件?如果您已经将其加入暂存区,没有问题 - 只需检出已加入暂存区的版本即可。


好的解释。顺便提一下,在暂存区中逐步提交可以通过在Mercurial中实际提交单个块(而不是将块添加到暂存区)并在需要时优化这些提交(当然,在推送之前)来模拟。内置的histedit扩展是将多个提交合并为一个的方便工具。 - Oben Sonne
5
哈!所以这个索引不仅仅是一个“选择”,而是实际上一棵树,有点像。谢谢-这让我对事情有了更清晰的认识。我找到了一篇很棒的文章(由Pro Git的作者撰写),为普通人解释了git reset,并且这篇文章基于这些知识。 - Cristian Diaconescu
1
@CristiDiaconescu 这甚至不是“有点像”树 - 索引使用与提交完全相同的快照机制。 :) - Amber
在我上面的评论中提到的文章中,作者说:“*(一些Git开发人员可能会对我有点生气,因为有一些情况下索引并不完全像树一样运作,但是对于我们的目的来说更容易 - 请原谅我)”,后来又说:“它不是技术上的树形结构,而是一个扁平的清单[...]*”。我并不打算理解这些复杂性 - 只是认为目前有一些微妙的差异超出了我的能力范围。我很想了解更多关于这个问题的信息。 - Cristian Diaconescu
它使用与树对象相同的机制,只是在实际创建提交之前不必担心目录嵌套组件。 - Amber

10

Git最初是为支持Linux内核开发中的某种工作流程而设计的,由某些人为某些人设计。

它并不像Mercurial那样易于普通开发人员使用,但由于其成本、性能、大公司支持和广告宣传(这里指GitHub),已经获得了很高的流行度和文化地位。

今天,普通开发人员通过IDE GUI与Git交互,不需要了解索引/暂存区。他只使用类似于提问者截图中的复选框(因此普通开发人员在使用Git/Mercurial时没有区别)。

对于使用命令行的人来说,Git的不规则CLI语法以及暴露不必要的存储格式细节会使学习时间比成为Mercurial专家所需的时间更长。

这里有一些描述索引使用的好图片:

您总是可以模拟索引(但为什么呢?):

hg qinit
hg qadd
hg qrefesh
hg qfinish

除了MQ之外,Git允许您拥有一个有序的索引集,而不仅仅是一个!并且允许您给每个“Index”命名。

使用record扩展,您可以选择在CLI中选择补丁块,就像您在GUI中检查复选框一样。该扩展是对Git -p选项的直接回答。

因此,主题发起者实际上是正确的,认为Index是DVCS架构中不必要的功能,并内置到Git中以支持一些Git核心开发人员的意愿。

祝你好运并愉快地编程!

更新引用自http://stevebennett.me/2012/02/24/10-things-i-hate-about-git/

Git的大部分功能都是针对代码库维护者而设计的:需要从多个不同来源合并贡献的人,或者需要确保多个并行开发努力导致单一、连贯、稳定的发布的人。这很好。但是,大多数Git用户并不处于这种情况下:他们只是写代码,通常在一个分支上工作数月时间。Git是一个4个手柄、双锅炉的浓缩咖啡机——而他们只需要速溶咖啡。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接