【问题标题】:Mercurial: graft vs. record vs. qrecord vs. shelve vs. transplant vs. dirstate vs. queueMercurial:移植 vs. 记录 vs. qrecord vs. shelve vs. 移植 vs. dirstate vs. queue
【发布时间】:2012-11-17 20:25:00
【问题描述】:

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

四个命令hg graft、hg record、hg qrecord 和hg shelve(和hg transplant,但这在Graft vs. Transplant 中已经解释)如何相互比较,以及queues 和 dirstate?在哪些用例中选择一个而不是另一个?

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

【问题讨论】:

  • graft 不是概念,与 Staging/Index 无关,记录与概念相差甚远(概念是记录背后的想法)
  • 如果您是 Mercurial 新手,请避免使用任何与 MQ(Mercurial 队列)相关的内容。这包括 qrecord。

标签: mercurial shelving


【解决方案1】:

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 方代码的一组修改。

【讨论】:

  • @lodnas:我更新了答案以包括transplant、shelve 和qrecord。
  • @tim-henigan 哇,谢谢!这正是我想要的。非常清晰简洁。
  • 看hg qnew -i XXX.patch。
猜你喜欢
  • 1970-01-01
  • 2012-08-07
  • 2011-01-15
  • 2012-07-29
  • 1970-01-01
  • 2012-03-21
  • 1970-01-01
  • 2014-08-17
  • 2011-09-18
相关资源
最近更新 更多