【问题标题】:Mercurial: abandoning multiple, contiguous commits, on the `default` branchMercurial:在“默认”分支上放弃多个连续提交
【发布时间】:2014-07-08 19:20:27
【问题描述】:

要求

我想放弃 default 分支上的开发线,从大约 15 个更改集回退到修订版,并让 default 从那里继续。

我的设置

这是一个单独的开发项目,另一个人不经常进行测试。我(经常)推送到 bitbucket 进行备份并与测试人员共享。我想放弃的一些更改被推送到 BitBucket。

选项

这些都可以……

  1. 放弃的更改集继续存在于存储库中。如果他们可以住在他们自己的分支abandoned-experiment-1 上就好了,比如说,我可以关闭并忽略,但这需要他们继续使用追溯创建的分支(这似乎是一个很棒的功能?) .

  2. 发生某种合并,我向default 添加了一个新修订版,即回滚到我想要继续的修订版。

  3. 要销毁的更改集,但我怀疑如果不替换 BitBucket 存储库和我的测试人员的存储库,就无法实现这一点,我并不热衷于此。

我不太确定如何评估哪些选项是可能的、哪个是最好的,或者是否还有其他更好的选项。我也不确定如何实际进行 repo 更新!

谢谢。

【问题讨论】:

  • Backing out multiple consecutive changesets in Mercurial 作为选项 2 的实现似乎很有用。我会试一试,虽然我不完全理解它!
  • 我注意到:rollback 是一个反复无常的术语,用于撤消最近的提交。 backout 是试图移除 any one 特定变更集的影响的术语。

标签: mercurial dvcs


【解决方案1】:

您确实有几个选择(请注意,我假设您在 15 个左右的修订版中放弃了所有更改,而不是试图保留其中的一小部分):

最简单的方法是 #2:您可以 close anonymous branches 就像命名分支一样;如果您愿意,请先使用abandoned-development 标记提示; hg update 到您希望继续的点;并继续正常编码。 (您可能需要为新开发创建新头部,然后才能关闭旧头部。我还没有测试过。)

关于#3:根据我的粗略阅读,似乎bitbucket has a strip command。如果您(在本地和在 bitbucket 上)和您的测试人员剥离了有问题的变更集,您可以继续您的快乐方式并假装它们从未存在过。

实现#1:如果您确定要让它们进入指定分支,您可以在远程存储库中剥离它们,然后 hg rebase 将它们转移到本地的新分支,然后关闭该分支。

就个人而言,我尽量避免在可以避免的情况下与历史混淆,所以我会选择最简单的。

【讨论】:

  • 谢谢 Edward——我不确定你的 2 我如何告诉 Mercurial 我的新开发线应该变成default,而不是旧的废弃线?
  • 啊,default 匿名分支吗?所有分支可能有多个heads?我在废弃的开发线结束时关闭了default 上的head(如果我愿意,可以标记它),然后在default 上从上一个好版本开始新的head?这是有道理的。唯一的缺点是它没有像我希望的那样标志着放弃,但我对此并不太在意。
  • 我所做的(但很高兴知道下次有更好的选择!)是hg revert -r <last-good-version>defaulthead,承诺并从那里继续工作。这使得default 分支是线性的,而不是变成一棵树。我更希望它变成一棵树,将废弃的树枝关闭并忽略,就像你建议的那样。
  • 是的,默认是 the 匿名分支,并且没有令人信服的理由强迫事物线性,因为它们实际上是发散的。不过,听起来你找到了适合你的东西,这才是最重要的!
【解决方案2】:

Mercurial 现在(尚处于试验阶段)支持 changeset evolution。也就是说,您可以放弃或重新设置已推送的变更集。在内部,这是通过隐藏过时的变更集来实现的(即几乎没有任何东西被剥离,只有新的替换修订被添加到历史记录中,这就是它跨多个克隆工作的原因)。

要扩展 @Edward 的建议,您还可以更新到最后一个 good 修订版,继续从那里提交,然后使用空合并:

hg up <good-revision>
... work ... commit ...
hg merge <head-of-bad-revisions>
hg revert --all -r .
hg commit -m 'null-merge of abandoned changesets'

这可能是您认为的选项 2。

【讨论】:

  • 谢谢!我一直远离实验性命令,但也许我应该重新考虑一下?我能问一下 - 为什么我要合并废弃的工作,而不是仅仅关闭它的头并让它像漂浮一样漂浮在我继续前进的线之外?
  • 这是个人喜好。对我来说,null-merge 表达了放弃另一个头脑的变化的意图,在“我不再需要它”的意义上。保持头部在场(虽然关闭)可能被解释为“将来可能会继续”。
猜你喜欢
  • 1970-01-01
  • 2012-06-09
  • 2012-02-15
  • 1970-01-01
  • 1970-01-01
  • 2016-07-29
  • 2023-03-25
  • 2012-02-20
  • 1970-01-01
相关资源
最近更新 更多