我正在向我的学生教授HG,因为它是一个很好的playkool DVCS(不像GIT那么强大,但开始使用琐碎的概念很简单)。我使用HG是因为它似乎很难销毁以前的条目(hg rollback
除外),所以你总是有机会在不破坏重要数据的情况下重新上火车。但我最近想知道:
rebase
选项可能非常危险)答案 0 :(得分:13)
两者都是DVCS,这意味着您应该克隆存储库并在需要备份副本时将更改推送到某处。如果你勤奋地这样做,那么你可以使用哪些破坏性工具变得无关紧要,因为备份便宜且易于维护。
现在,请注意我是一个100%有偏见的Git偏见。
开箱即用,Mercurial只附带一个破坏性命令,即回滚。其他一切都被降级为必须手动启用的扩展 - 剥离,变基等等。这些扩展肯定具有破坏性,因为它们重写历史就地,或者它们销毁它。为了避免使用这些,大多数Mercurial用户更喜欢使用Mercurial Queues扩展,它允许您将更改集维护为灵活的补丁,然后再将其设置为提交。这基本上相当于整个VCS,它位于Mercurial之上。它完成了工作,但必须在写入提交之前有意识地应用它。
相比之下,Git附带了几个可能被视为“破坏性”的命令,但有一个至关重要的区别--Git数据库中的任何内容都不会被重写。无论何时使用rebase,filter-branch或reset命令,都会在数据库中创建 new 对象,然后更新分支指针以指向这些对象。每次更新分支指针时,都会在其reflog中附加一个条目,一个位于Git之上的历史记录日志,保护您的分支指针免受不必要的更新; 总是可以恢复“破坏性”命令。事实上,从Git的数据库中永久删除一个对象可能很困难 - 它涉及删除reflog条目然后修剪未完成的对象。
简而言之:
对于你的教学用例,这些差异一般都是无关紧要的 - 你将教授基本的命令,如果有人想要探索,他们学习的唯一方法就是把手臂拉开。据说Mercurial对于初学者来说更容易学习,但我觉得这主要是因为它没有暴露索引,因此更像是Subversion。版本控制的完整新手可能无法从这种相似性中受益。
答案 1 :(得分:9)
我不认为'playskool'是描述Mercurial的好词。它是Python,OpenOffice,Netbeans和many more projects使用的主要的全功能DVCS。 'Playskool'暗示它还没有为生产级别的使用做好准备,或者它是其他东西的淡化版本。两者都是不真实的。尽量不要将可用性与简单性或无意义混淆。
有几位成员提到默认情况下Hg没有安装扩展程序,但由于扩展程序很容易安装,因此可能值得知道哪些可能会导致某些“损坏”。当然,即使造成了损害,Hg的分布式特性也可以让你剥离违规的变更集并从中央服务器重新拔出(有点像你想到它时切断和重新生长肢体)。
我还要区分损坏(存储库损坏或数据丢失)和危险(HG陷阱或不明智的操作 - 没有数据丢失)。
损坏:如果您尝试从revA转换为revB并且它们明显不同,则使用rebase可能会导致严重的合并冲突。在这些情况下,Mercurial将生成.diff文件,让您自己处理失败的合并。如果发生这种情况,合并可能很复杂,数据可能会丢失。
危险: rebase会更改其移动的每个变更集的哈希ID,这意味着一旦推送变更集就不应该使用它。此外,除非您使用--keep-branches
损坏:虽然mq可能是更好的扩展,但hetedit仍可用于重新排列,修改或以其他方式编辑现有的变更集。使用edit
允许任何用户修改修订,包括还原所有更改。使用drop
可以完全删除变更集。这两种操作都可能导致数据丢失。
危险:类似于rebase,histedit可以修改变更集的哈希ID。
伤害: Mq是一个非常强大且多面的功能,因此可能造成的伤害是多种多样的。 mq strip
是潜在数据丢失的简单示例。
危险:会导致ID更改。
如您所述,此操作可能会造成一些损害。帮助文本说得最好:
应谨慎使用此命令。 只有一个级别的回滚, 并且没有办法撤消a 回滚。它还将恢复 在最后的时候吃不饱 交易,失去任何dirstate 从那时起的变化。
在使用任何这些选项之前制作安全克隆应该可以让您克服甚至是灾难性的损害。依赖于Hg是一个DVCS,以确保您在尝试任何疯狂之前始终拥有存储库的副本!
答案 2 :(得分:6)
由于repo是本地的,因此您可以通过直接对文件执行操作来轻松销毁repo。因此,破坏条目本身并不困难。
但是,使用命令,它几乎归结为您在Mercurial中启用的扩展。例如,strip
非常“危险”,只要您选择使用mq
扩展程序,它就会启用。
从技术角度来看,默认情况下Git和hg都不会更改过去编写过的数据。 hg总是只将数据附加到文件中,而Git的内部数据表示形式会持久存储在写入后不会改变的文件中。