使用GIT和HG是否有任何有害的命令

使用GIT和HG是否有任何有害的命令,git,mercurial,dvcs,Git,Mercurial,Dvcs,我在教我的学生HG,因为它是一个很好的playskool DVCS(没有GIT强大,但很容易开始使用琐碎的概念)。我使用HG是因为销毁以前的条目似乎非常困难(除了HG rollback),所以您总是有机会在不销毁重要数据的情况下返回列车。但我最近想知道: 这是真的吗 GIT是否提供了同样的保护(我在某处读到了关于rebase选项的文章,这可能非常危险) 由于回购协议是本地的,您可以通过直接对文件执行操作来轻松销毁回购协议。因此,销毁条目本身并不困难 然而,通过使用命令,可以归结为您在Mercu

我在教我的学生HG,因为它是一个很好的playskool DVCS(没有GIT强大,但很容易开始使用琐碎的概念)。我使用HG是因为销毁以前的条目似乎非常困难(除了
HG rollback
),所以您总是有机会在不销毁重要数据的情况下返回列车。但我最近想知道:

  • 这是真的吗
  • GIT是否提供了同样的保护(我在某处读到了关于
    rebase
    选项的文章,这可能非常危险)

由于回购协议是本地的,您可以通过直接对文件执行操作来轻松销毁回购协议。因此,销毁条目本身并不困难

然而,通过使用命令,可以归结为您在Mercurial中启用了哪些扩展。例如,它非常“危险”,并且每当您选择使用
mq
扩展时都会启用它


从技术角度来看,默认情况下Git和hg都不会更改过去编写的数据。hg总是只将数据附加到文件中,Git有其内部数据表示形式,保存在写入后不会更改的文件中。

两者都是DVCSs,这意味着您应该克隆repo,并在需要备份副本时将更改推到某个位置。如果您努力做到这一点,那么您可以使用哪些破坏性工具就变得无关紧要了,因为备份既便宜又易于维护

现在,请注意,我是一个100%有偏见的吉特偏执狂

开箱即用,Mercurial只提供一个破坏性命令rollback。所有其他的东西都被降级到必须手动启用的扩展中——剥离、重基等等。这些扩展肯定具有破坏性,因为它们重写了历史,或者破坏了历史。为了避免使用这些,大多数Mercurial用户更喜欢使用Mercurial队列扩展,它允许您在将变更集设置为提交之前,将变更集维护为灵活的补丁。这实质上相当于一个位于Mercurial之上的整个VCS。它完成了任务,但在编写提交之前必须有意识地应用它


相比之下,Git附带了几个可能被认为是“破坏性”的命令,但有一个关键区别——Git数据库中的任何内容都不会被重写。无论何时使用rebase、filter branch或reset命令,都会在数据库中创建新对象,然后更新分支指针以指向这些对象。每次更新分支指针时,都会在其reflog中添加一个条目,reflog是位于Git顶部的一个历史日志,用于保护您的分支指针不受不必要的更新的影响;始终可以恢复“破坏性”命令。事实上,要从Git的数据库中永久删除一个对象是很困难的——它需要删除reflog条目,然后修剪未修复的对象

简言之:

  • Mercurial在默认情况下是安全的,但是添加链锯可以完全破坏它
  • Git是用链锯从地上爬起来建造的,增加了明显的危险性,但也有安全性

对于您的教学用例,这些差异通常是无关紧要的——您将教授基本命令,如果有人想探索,他们学习的唯一方法就是用链锯断他们的手臂。据说Mercurial对初学者来说更容易学习,但我觉得这主要是因为它不公开索引,所以更像Subversion。版本控制的完全新手可能不会从这种相似性中获益。

我不认为“playskool”是描述Mercurial的好术语。它是Python、OpenOffice、Netbeans等公司使用的一款功能齐全的大型DVCPlayskool’意味着它还没有准备好用于生产级别,或者它是其他东西的淡化版本。两者都不正确。尽量不要把可用性与简单性或无足轻重混为一谈

一些成员提到,默认情况下,Hg没有安装扩展,但由于扩展非常容易安装,因此可能值得知道哪些扩展会造成一些“损害”。当然,即使造成了损害,Hg的分布式特性也会允许您剥离有问题的变更集,并从集中式服务器中重新提取(有点像在您考虑时切断并重新生长肢体)

我还将区分损坏(存储库损坏或数据丢失)和危险(汞陷阱或不明智的行为-无数据丢失)

损害:如果您试图从revA重新设置到revB,并且它们之间存在显著差异,则使用重新设置可能会导致严重的合并冲突。在这些情况下,Mercurial将生成.diff文件,让您自己处理失败的合并。如果发生这种情况,合并可能会很复杂,数据可能会丢失

危险:重基更改它移动的每个变更集的哈希ID,这意味着一旦推送了变更集,就不应该使用它。此外,rebase将对默认分支应用变更集,除非您使用
--keep branchs

损坏:尽管mq可能是更好的扩展,但histedit仍然可以用于重新排列、修改或以其他方式编辑现有变更集。使用
edit
允许用户对修订进行任何修改,包括恢复所有更改。使用
drop
可以完全删除变更集。这两种操作都可能导致数据丢失

危险:与rebase类似,histedit可以修改变更集的哈希ID

损害:Mq是一个非常强大且多方面的功能,因此它可能造成的损害是多种多样的
mq strip
是潜在数据丢失的一个简单示例

危险:再次导致ID更改

正如您所提到的,此操作可能会造成一些损坏。帮助文本最能说明这一点:

这个命令应该是我们的