为什么Mercurial';s strip命令不重写历史记录?

为什么Mercurial';s strip命令不重写历史记录?,mercurial,Mercurial,Mercurial帮助文本说,“strip命令删除指定的变更集及其所有后代。”这听起来很像重写历史,如果有人基于突然被删除的变更集之一进行工作,那么一定会导致问题。但是,帮助文本还说,该命令“不是一个历史重写操作,可以在公共阶段的变更集上使用。”我确信,编写帮助文本的人非常清楚自己在做什么,所以我在理解这一点时遗漏了什么?我不能肯定地说,但我猜它是“祖传的”hg strip最初是作为mq的一部分,它比阶段的添加早至少三年 更好的措辞可能是: 不被视为历史重写操作,可用于公共阶段的变更集 当阶段被

Mercurial帮助文本说,“strip命令删除指定的变更集及其所有后代。”这听起来很像重写历史,如果有人基于突然被删除的变更集之一进行工作,那么一定会导致问题。但是,帮助文本还说,该命令“不是一个历史重写操作,可以在公共阶段的变更集上使用。”我确信,编写帮助文本的人非常清楚自己在做什么,所以我在理解这一点时遗漏了什么?

我不能肯定地说,但我猜它是“祖传的”
hg strip
最初是作为
mq
的一部分,它比阶段的添加早至少三年

更好的措辞可能是:

不被视为历史重写操作,可用于公共阶段的变更集

当阶段被添加时,会非常小心地打破任何人现有的工作流程。提交在草稿阶段开始,并在推送后公开。任何阶段感知命令都知道,在推送之后,提交的阶段是公共的,如果它是公共的,则不允许修改(除非推送到非发布存储库…)

然而,有人已经在手动和脚本中使用
strip
删除已推送的变更集,如果
strip
在升级后突然说“嘿,你不能剥离它是公共的!”那么这些人的向后兼容性承诺就会被打破

Phases正在慢慢发展成为一个非常惊人的系统,在几乎所有情况下,它都将是一个比mq更好的选择,但我仍然怀疑我们是否能让Matt删除mq并剥离——他仍然坚持维护一个与Python 2.4兼容的代码库,这已经9年了


Tl;Dr:尽管剥离始终是一个禁用的扩展,但随着阶段的出现,太多人使用它来改变它的行为。

关键是,如果剥离一个公共变更集,然后从某个地方再次将其拉出来,就不会引起任何问题。您只需返回原始变更集

如果(例如)将两个公共变更集折叠在一起,然后从某个地方提取原始变更集,则现在有两个分支。一个具有原始的两个变更集,另一个具有折叠的变更集,但两者具有相同的更改。在这一点上,地狱开始松动,吃孩子的怪物在地球上游荡

因此,“历史重写”与“历史剥离”并不相同



马特·麦考尔(Mercurial的父亲)指出,他在书中说,基本上是一样的

这是否意味着
strip
不会移除Changset,而只是隐藏它们?我一直在寻找一种方法,在发布之前100%删除开发中的次要提交。这是安全且非常重要的特性,因为作为开发人员,您应该经常进行本地提交(这是DVCS的优点之一,不是吗?),并将“每个特性一次提交”变更集合并到主分支中(这是所有主分支的外观,例如Python、Sphinx等的主分支)。有什么方法可以通过Mercurial使用“阶段”以清晰的方式实现这一点吗?根据Mercurial-devel邮件列表上的讨论,我认为这是不正确的解释@为了发布而剥离Iodnas不是一个好主意!您放弃了作为开发人员需要的重要细节。若要为每个功能推送一个提交,请在功能分支中开发,将其合并到
default
,然后只推送
default
:将推送一个包含分支中所有更改的更改集(合并更改集)。@alexis您搞错了。如果在分支中开发,则合并到默认值,然后推送。您将推送合并变更集以及在分支中创建的所有变更集。一个变更集不能存在于一个没有其所有祖先的存储库中,这包括了另一个分支中的变更集。@Ry4an遗憾的是,这无助于澄清原始含义的细微差别。我想它的本意是“写一部修改过的已有历史”,但我找不到一个来源来支持这一点。“历史,重写”:存储库中的变更集是不可变的。但是,Mercurial的扩展可以用来更改存储库,通常是以保存变更集内容的方式。我喜欢吃孩子的怪物。