每次保存任何内容时,我的IDE设置都会在本地提交。理想情况下,我希望保留一份未经审查的记录,记录我的愚蠢记忆,以便在极少数情况下使用它们。但大部分时间它都使我的历史变得详细。
我想知道保持这段历史的好策略,但大部分时间都可以忽略它。我每次保存时都会运行自己的脚本,所以我可以控制它。
我对Mercurial很新,所以我需要一个基本的答案。但是,在提交,合并和报告时我应该做的所有步骤是什么,以便能够主要忽略这些自动提交,但实际上却没有压缩它们?或者我最好放弃而只是挤压?
编辑 - 我的观点是,如果Mercurial希望保留所有历史记录(我同意这一点),它应该让您过滤该历史记录以避免看到您可能想要压制的东西。我宁愿不来压缩,我只是在策略中寻求帮助(在常规使用中,尽管不是总是如此)让它看起来尽可能多,就像我压扁了我的历史。 / p>
答案 0 :(得分:4)
您希望在回购中保留详细的历史记录,但是您希望(并能够导出)仅包含“合理”修正的理想化历史记录,对吧?我可以同情。
解决方案1:使用标记标记历史记录中的有趣点,并学会忽略它们之间的所有杂乱位。
解决方案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
时,将从default
复制到release
,如下所示:
hg rebase --source r1 --dest release --keep --collapse
这推动了release
头部的一个修订版,相当于从r1到default
头部的整个变更集。 --keep
选项使其成为副本,而不是破坏性重写。优点是release
分支看起来就像你想要的那样:干净整洁,你可以在不拖动默认分支的情况下推送它。缺点是您无法将其阶段与default
中的修订相关联,因此除非您确实 隐藏中间修订,否则我建议使用方法2。 (另外:在多个批次中压缩历史记录并不容易,因为rebase将移动/复制“源”修订版的所有后代。)
所有这些都需要你做一些额外的工作。这是不可避免的,因为mercurial无法知道你想要压制哪些革命。
答案 1 :(得分:3)
它应该让你过滤那段历史记录,以避免看到你可能想要压制的东西
Mercurial有这方面的工具。如果您不想看到(我在hg log
中),请使用revsets过滤这些变更集:
hg log -r "not desc('autosave')"
或者如果你使用TortoiseHg,只需去查看 - >过滤工具栏,然后在工具栏中输入“not desc('autosave')”。瞧,自动保存条目隐藏在主列表中。
答案 2 :(得分:2)
如果您确实希望保留回购历史记录中每个Ctrl-S
的所有细微更改,并且只有log
显示重要历史记录的子集,那么您始终可以tag
“重要”更改集,然后将别名log
更改为log -r tagged()
。或者您可以使用与其他revset descriptor相同的原则,例如在自动提交的消息中包含文本“autosave”并使用log -r keyword(autosave)
,这将显示所有非自动保存的提交。
为了实现您的目标,至少在我接近它时,我会在每次保存时使用mq
extension并自动提交补丁队列存储库。然后,当你完成了“愚蠢的笨蛋”时,你可以hg qfinish
将补丁作为可以推送的单一变更集。您应该(一如既往地!)将更改保持在一个概念或步骤的中心(例如“修复保存按钮”),但这将捕获到达目的地所需的所有小步骤。
你需要
hg qinit --mq
一次初始化补丁队列仓库(fyi:存储在\.hg\patches\
)hg qnew fixing-the-save-btn
创建补丁然后每次在IDE中保存
hg qrefresh
更新补丁hg commit --mq
在补丁程序队列repo中创建小变更集当你完成时
hg qfinish fixing-the-save-btn
将补丁转换为要推送的变更集这样可以让你的回复本地人与你每次保存时更改的内容保持一致,但只有在完成后才会推送变更集。您还可以qpop
或qpush
更改您正在处理的项目。
如果您尝试使用压缩方法,那么当您压缩变更集时,您将失去笨拙的历史。无论是那个,或者你都被困在试图将工作迁移到'真实'存储库中,我可以从经验中告诉你,你不想这样做。 :)
答案 3 :(得分:1)
我建议你使用分支机构。当您启动新功能时,您将创建一个新分支。您可以在该分支中尽可能多地提交。完成后,将功能分支合并到主干中。通过这种方式,您基本上将历史分为两类:一类是细粒度(特征分支中的历史),另一类是粗粒度(树干中的历史)。您可以使用以下命令轻松查看其中任何一个:hg log --branch <branch-name>
。