mercurial - 使用 hg pull/push/merge/graft 将更改标记为已 merge 或故意忽略?

标签 mercurial merge dvcs cherry-pick

我正在从 Subversion 过渡到 Mercurial,在 Subversion 中我习惯使用 svnmerge.py 来跟踪已 merge 或已被阻止 merge 的更改:

# Mark change 123 as having already been merged; it will not be merged again, even if a range
# that contains it is subsequently specified.
svnmerge.py merge -M -r123
#
# Block change 326 from being considered for merges.
svnmerge.py merge -X -r326
#
# Show changes that are available for merging from the source branch.
svnmerge.py avail
#
# Do a catchall merge of the remaining changes.  Neither change 123 nor change 326 will be
# considered for merging.
svnmerge.py merge

我希望能够对 hg pull/push/merge/graft 做类似的事情,这样,如果我知道我永远不想 merge 给定的更改,我可以阻止它考虑,从而进行后续的挑选、 merge 等,变成一种更加“一劳永逸”的事件。我已经做了很多谷歌搜索,但还没有找到一种方法来做到这一点。

似乎也无法查看尚未移植的更改列表。

由于我经常在其他开发人员之后进行整理并帮助他们进行 merge ,因此能够做这些事情非常有帮助,人们很可能会认为这是“反向挑选”;即,标记您不想 merge 的更改,然后对其余部分进行批量 merge 。

最佳答案

基于 DAG 的系统(例如 Mercurial 和 Git)要么全有,要么全无:当您 merge 两个分支时,您会对共同祖先和两个分支进行三向 merge 。

三向 merge 涉及每个分支的最后阶段。例如,如果您在 10 到 1000 步中进行更改并不重要 - merge 结果将是相同的。

这意味着忽略变更集的唯一方法是在 merge 之前将其取消:

$ hg backout BAD

这将取消分支上的变更集,从三向 merge 的角度来看,它看起来从未进行过。

如果您想要 merge 整个分支,但忽略了,那么您可以进行虚拟 merge :

$ hg merge --tool internal:local --non-interactive
$ hg revert --all --rev .

这会经历 merge ,但会恢复到提交之前的旧状态。

<小时/>

我能给你的最好建议是构建你的工作流程,这样就不需要上述的取消了。这意味着在最旧的应用分支上提交错误修复。如果在创建功能 X 时发现错误,则使用 hg bisect 来确定错误是何时引入的。现在更新回您仍想修复错误的最旧分支:

$ hg update 2.0
# fix bug
$ hg commit -m "Fixed issue-123"

然后将错误修复 merge 到所有后续分支中:

$ hg update 2.1
$ hg merge 2.0
$ hg commit -m "Merge with 2.0 to get bugfix for issue-123"

$ hg update 2.2
$ hg merge 2.1
$ hg commit -m "Merge with 2.1 to get bugfix for issue-123"

如果错误修复不再适用,那么您应该仍然 merge ,但丢弃不相关的更改:

$ hg update 3.0
$ hg merge 2.2 --tool internal:local --non-interactive
$ hg revert --all --rev .
$ hg commit -m "Dummy merge with 2.2"

这确保您始终可以使用

$ hg log -r "::2.2 - ::3.0"

查看 2.2 分支上尚未 merge 到 3.0 中的变更集。

关于mercurial - 使用 hg pull/push/merge/graft 将更改标记为已 merge 或故意忽略?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8585509/

相关文章:

mercurial - 您如何找到命名的 Mercurial 分支的父级?

mercurial - 为什么关闭后可以切换到分支?

git - 我如何让两个 "streams of development"(分支?)相互跟踪,同时以特定方式保持不同?

Mercurial 补丁队列用例

eclipse - Mercurial 和 Eclipse 项目功能子模块的最佳实践?

禁止提交大型二进制文件的 Mercurial 钩子(Hook)

java - JAVA中两个arraylist合并同一个父类

c# - SQL DB 迁移建议 --- 更新数据库模型...我可以复制旧记录吗

git - 确定哪个 merge 提交导致特定提交 merge 到我的分支中

git - DVC 实验管理工作流程