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