8

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

# 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 做类似的事情,这样如果我知道我永远不想合并给定的更改,我可以阻止它考虑,进行后续的挑选、合并、等等,变成了一个更加一劳永逸的事情。我已经做了很多谷歌搜索,但还没有找到一种方法来做到这一点。

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

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

4

1 回答 1

9

像 Mercurial 和 Git 这样的基于 DAG 的系统要么全有,要么全无:当你合并两个分支时,你会对共同的祖先和两个分支进行三向合并。

三路合并关心每个分支的最后阶段。例如,如果您在 10 到 1000 步中进行更改并不重要 — 合并结果将是相同的。

这意味着忽略变更集的唯一方法是在合并之前将其退出:

$ hg backout BAD

这将取消分支上的变更集,使其看起来从未从三向合并的角度进行。

如果您有一个要合并但忽略的整个分支,那么您可以进行虚拟合并

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

这会通过合并,但会在提交之前恢复到旧状态。


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

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

然后将错误修复合并到所有以后的分支中:

$ 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"

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

$ 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 分支上尚未合并到 3.0 中的变更集。

于 2011-12-21T15:47:51.637 回答