Mercurial:选择要包含在版本中的提交

标签 mercurial

我有一个本地 Mercurial 存储库(目前),在其中我已经进行了多次提交,每次提交都是一个独立的错误修复。当需要构建我的应用程序的发布版本时,是否可以选择我想要包含哪些错误修复(提交)。

为了详细说明,假设 A、B、C、D 和 E 是我已经对我的存储库所做的提交,并且它们中的每一个都与错误修复相关,如下所示:

A <- B <- C <- D <- E <- working dir

例如,我需要能够选择哪些错误修复将进入发布版本(这取决于分配给部署的时间以及测试结果)。例如,我可能会收到一份报告,指出该版本应该只包含错误修复 A、C 和 D。

是否可以构造一个仅包含 A、C 和 D 提交的发行版本(请记住,每个提交都是独立的,并且不依赖于其他提交的实际存在)?

可能为每个错误修复建立一个分支,然后 merge 到发布分支是实现此目的的最简单方法(或者不是?),但目前的情况如上所述,没有分支。

最佳答案

这不是 Mercurial(或 git)的正常工作模式。如果存储库还包含该变更集的所有祖先,则它只能包含该变更集。因此,如果没有 A、B 和 C,就无法将 D 放入存储库。

所以这里是:

你应该做什么

控制变更集的来源。不要仅仅因为碰巧在 C 之后修复了 D,就将 C 设为 D 的父级。在修复 bug 之前,hg update 到以前的版本。

假设 A 是一个版本,B、C 和 D 都是错误修复。如果你执行这样的循环:

foreach bug you have:
    hg update A
    ... fix bug ...
    hg commit 
    hg merge  # merges with the "other" head

然后你会得到一个像这样的图表:

---[A]----[B2]--[C2]--[D2]----
    |    /     /     /
    +-[B]     /     /
    |        /     /
    +-----[C]     /
    |            /
    +---------[D]

现在,如果您想创建一个仅包含 B 和 D 的版本,您可以这样做:

hg update B
hg merge D

这会创建一个具有 A + B + D 但没有 C 的新头。

Tl;Dr:让变更的父级尽可能早地出现在历史中,而不是当时发生的任何事情。

您现在可以做什么

这是理想的情况,但幸运的是这没什么大不了的。你永远不可能在不引入C的情况下完全引入D(因为C的哈希值是D哈希值计算的一部分),但是你可以很容易地将D中的工作引入新的头部。以下是一些方法,其中任何一种都可以:

  • hg 导出/hg 导入
  • Mercurial 移植
  • hg 移植(2.0 中的新增功能)
  • hg rebase(仅当您尚未推送时才可能)

其中任何一个都会让你将 D 中的补丁/增量带过来——它将有一个不同的哈希 ID,当有一天你真正 merge D 时(使用 merge ),你将在两个不同的地方有重复的工作更改集,但 merge 会解决所有问题。

关于Mercurial:选择要包含在版本中的提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8275844/

相关文章:

git - 使用快速导出将 mercurial repo 转换为 git 时至少出现一个未命名的头部错误

python - 无法在 ubuntu 终端上运行 hg

mercurial - Mercurial 中克隆和复制的区别

svn - Mercurial - 如何管理多个模块

mercurial - 如何加入两个不相关的存储库?

mercurial - 使用Mercurial/TortoiseHg处理嵌套的 Mercurial 库的正确方法是什么?

mercurial - 转义分支名称中的冒号

mercurial - Mercurial : How to walk through changsets incrementally?

svn - 如何实现源控管理互通?

version-control - 选择 Mercurial 主机