您想在您的存储库中保留详细的历史记录,但您希望拥有(并能够导出)仅包含“合理”修订集的理想化历史记录,对吗?我可以同情。
解决方案一:用标签标记历史中有趣的点,学会忽略它们之间的所有杂乱无章的点。
解决方案2:使用两个分支并合并。在分支中进行开发default
,并保持并行分支release
。(你可以称它为clean
,但实际上你是在管理发布)。每当default
处于您想要检查点的稳定状态时,如果您愿意,切换到分支release
并将--的当前状态分批合并到其中。default
如果您从不直接向 提交任何内容release
,则永远不会发生合并冲突。
(original branch) --o--o--o--o--o--o--o (default)
\ \ \
r ... ... --r--------r (release)
结果:您可以更新到任何修订版release
并期望正常运行状态。你可以运行hg log -r release
,你只会看到选择的检查点。您可以检查完整的日志以了解一切是如何发生的。缺点:因为release
分支依赖于default
,所以你不能把它推送到另一个仓库而不default
带它。由于hg glog -r release
重复合并,也会看起来很奇怪。
解决方案 3:如上使用命名分支,但使用rebase
扩展而不是合并。它可以选择复制而不是直接移动重新设置的变更集;它有一个选项--collapse
可以将一组修订转换为一个修订。r1:tip
每当您有一组要完成的修订时,请将它们从to复制如下:default
release
hg rebase --source r1 --dest release --keep --collapse
这会将 ONE 修订版推到 r1 的开头,release
这相当于整个变更集从 r1 到default
. 该--keep
选项使其成为副本,而不是破坏性的重写。优点是release
分支看起来就像你想要的那样:漂亮干净,你可以推送它而不用拖拽默认分支。缺点是您无法将其阶段与 中的修订相关联default
,因此我建议您使用方法 2,除非您确实必须隐藏中间修订。(另外:分批压缩你的历史并不容易,因为 rebase 将移动/复制“源”修订的所有后代。)
所有这些都需要你做一些额外的工作。这是不可避免的,因为 mercurial 无法知道您想要压缩哪些修订集。