11

我是 Mercurial 的新手,并且不知何故仍处于评估过程中,所以这四个概念对我来说有点混乱。有些被提到等同于 Git 的 Staging/Index 概念,有些甚至比 Git 的 Staging 更好。

四个命令hg grafthg record和(和hg qrecord,但这在Graft vs. Transplant中已经解释过)如何相互比较,以及队列dirstate的概念如何?在哪些用例中选择一个而不是另一个?hg shelvehg transplant

我知道每个页面都有帮助页面,但是仍然很难弄清楚每个页面的作用,因为通常 VCS 对我来说是一个新主题。

4

1 回答 1

17

Mercurial 的设计根本不包括暂存区的概念。即本地修改和提交之间没有中间状态。

以下是您提到的每个概念的概述:

hg graft相当于git cherry-pick。它将提交从一个分支复制到另一个分支。此功能的典型用例是将错误修复从一个发布分支复制到另一个。此命令替换旧的(现在已过时的)hg transplant扩展。

hg record并且hg qrecord类似于git add --patch。它们允许您以交互方式选择要提交的块。因此,如果您修改了一个文件的多个不同区域,您可以选择您实际想要提交的区域(即大块)以及您想要保留哪些区域作为本地修改。

qrecord仅当您mq启用时才可用。它提交mq补丁而不是标准提交。

hg shelve类似于git stash。它允许您暂时搁置对文件(或文件大块)的本地修改。这些修改可以unshelved在您准备好时进行。

dirstate是 Mercurial 源代码的内部类。它不会暴露给用户。

Mercurial Queues(也称为mq)可能是您最接近 Mercurial 暂存区的位置。以下是 Mercurial wiki 的描述:

更改作为提交到 Mercurial 的补丁进行维护。可以删除或重新排序提交,并且可以根据工作目录中所做的更改刷新底层补丁。补丁目录也可以置于版本控制之下,因此您可以拥有对补丁所做更改的单独历史记录。

mq通常用于完善/返工您在本地测试但尚未推送到公共位置的提交。有些人还使用它来维护对 3rd 方代码的一组修改。

于 2012-11-29T17:42:55.640 回答