Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我能用Mercurial压扁你吗?_Mercurial - Fatal编程技术网

我能用Mercurial压扁你吗?

我能用Mercurial压扁你吗?,mercurial,Mercurial,我有一对承诺,实际上应该只有一个。如果我使用git,我会使用: git rebase -i <some-commit-before> git-rebase-i 然后把它们压扁 我可以在mercurial中这样做吗?如果是这样,怎么做?是的,您可以使用mercurial来实现这一点,而无需任何扩展 或者,如果要使用扩展,可以使用: 手术室 我最喜欢的是hg strip--keep命令。然后我在一次提交中提交所有更改 对我来说,这是最快、最舒适的方式,因为我喜欢在日常工作中做很

我有一对承诺,实际上应该只有一个。如果我使用git,我会使用:

git rebase -i <some-commit-before>
git-rebase-i
然后把它们压扁


我可以在mercurial中这样做吗?如果是这样,怎么做?

是的,您可以使用mercurial来实现这一点,而无需任何扩展

或者,如果要使用扩展,可以使用:

  • 手术室

    • 我最喜欢的是
      hg strip--keep
      命令。然后我在一次提交中提交所有更改

      对我来说,这是最快、最舒适的方式,因为我喜欢在日常工作中做很多小事情;)


      注1:
      strip
      需要启用内置扩展
      mq

      注2:默认情况下,我最喜欢的Git/Mercurial客户端(SmartGit/Hg)会追加
      ——在
      剥离期间保留
      参数。更方便的是:它提供了一个名为
      join-commits
      :]

      的选项,它的工作就像一个符咒。要挤压2,请执行以下操作:

      $ hg rebase --dest .~2 --base . --collapse
      
      点是当前修订的快捷方式

      当您在一个分支上有几个提交,并且希望将它们全部折叠为一个时,这就更容易了:

      $ hg rebase --dest {destination branch (e.g. master)} --base . --collapse
      
      工作原理:

      (来自)

      如果你正在阅读这个答案,你可以忘记所有其他的选择 并使用来自的
      折叠
      命令

      evolve
      是mercurial的一个扩展,它帮助我们拥有安全的可变历史,但它仍然是实验性的。您可以使用它,方法是从其中克隆它并将其添加到.hgrc中,如下所示

      [extensions]
      evolve = ~/evolve/hgext/evolve.py
      
      假设您在主目录中克隆了evolve repo。现在你可以走了。您还可以通过
      hg help fold
      查找帮助

      您可以告诉
      折叠
      挤压/折叠未断开的线性提交链。fold所做的是,它创建一个新的变更集,其中包含来自所有变更集的变更,并将所有这些提交标记为过时。你可以在网站上对此有更深入的了解

      现在假设您有以下历史记录

      a -> b -> c -> d -> e -> f -> g
      
      你想挤压
      e
      f
      g
      。你能行

      hg up g
      hg fold -r e
      
      hg up d
      hg fold -r b
      hg evolve --all
      
      结果将是

      a -> b -> c -> d -> h
      
      其中,
      h
      是变更集,它包含来自所有三个提交
      e
      f
      g
      的变更

      您还可以从历史记录的中间折叠变更集,也就是说,您不必选择包含提示的链。假设您要折叠
      b
      c
      d
      。你能行

      hg up g
      hg fold -r e
      
      hg up d
      hg fold -r b
      hg evolve --all
      
      这将导致

      a -> i -> j
      
      其中,
      i
      b
      c
      d
      j
      的折叠变更集,与
      h
      是相同的变更集。
      必须阅读。

      我认为
      chistedit
      (自Mercurial 2.3以来内置)最接近纯Mercurial的
      rebase-I
      chistedit
      histedit
      的交互式版本)。进入histedit后,将
      折叠
      命令映射到rebase的
      挤压
      滚动
      命令映射到rebase的
      修复
      。有关更多信息,请参阅文档

      下面是一个简单的例子。假设您有以下内容,并且希望将所有1e21c4b1的更改移动到上一版本中,并且只保留上一版本的消息

      @  1e21c4b1 drees tip
      |  A commit you want to squash
      o  b4a738a4 drees
      |  A commit
      o  788aa028 drees
      |  Older stuff
      
      您可以运行
      hg chistedit-r b4a738a4
      将历史编辑回b4a738a4。在chistedit中,然后将光标向下移动到1e21c4b1,点击
      r
      ,表示要滚动该修订。请注意,histedit(从最旧到最新)中的顺序与hg日志(从最新到最旧)中的顺序相反

      选择更改后,然后选择
      c
      提交更改。结果如下:

      hg strip .
      hg add
      hg commit --amend
      
      @bfa4a3be drees尖端 |承诺 o 788aa028 drees |老东西

      如果您对它们比较陌生,那么
      histedit
      可能是比
      chistedit
      更好的选择,因为它在histedit文件中提供了命令描述供参考。使用普通文本编辑(就像普通的重基一样)设置命令只需要再进行一些编辑

      注意,要使用
      histedit
      chisteedit
      ,您需要将
      histedit
      添加到~/.hgrc中的扩展中:

      [extensions]
      histedit =
      
      [extensions]
      strip =
      
      我建议使用
      chistedit
      ,因为它最接近
      rebase-I
      ,在历史上任何地方都可以使用。如果你真的只想将当前版本包含/调整到上一个版本中,那么@G.Demecki的
      strip
      建议会很好,因为所发生的事情是清楚的。它是自Mercuria 2.8以来内置的。要获得与上述相同的结果,您可以执行以下操作:

      hg strip .
      hg add
      hg commit --amend
      
      注意~/.hgrc中需要启用与histedit类似的
      strip

      [extensions]
      histedit =
      
      [extensions]
      strip =
      
      我使用:


      让我们假设您想要挤压(联合)2个最近的提交

    • 查找修订号

      hg log -G -l 3
      
      可能的产出:

      @  changeset:   156:a922d923cf6f
      |  branch:      default
      |  tag:         tip
      |  user:        naXa!
      |  date:        Thu Dec 13 15:45:58 2018 +0300
      |  summary:     commit message 3
      |
      o  changeset:   155:5feb73422486
      |  branch:      default
      |  user:        naXa!
      |  date:        Thu Dec 13 15:22:15 2018 +0300
      |  summary:     commit message 2
      |
      o  changeset:   154:2e490482bd75
      |  branch:      default
      ~  user:        naXa!
         date:        Thu Dec 13 03:28:27 2018 +0300
         summary:     commit message 1
      
    • 软复位分支

      hg strip --keep -r 155
      
    • 再次提交更改

      hg commit -m "new commit message"
      
    • 笔记
      strip
      需要启用内置扩展。使用以下内容创建/编辑
      ~/.hgrc
      配置文件:

      [extensions]
      strip = 
      

      汞代4.8(11~2018, 9年后),可考虑新的命令<代码> Hg吸收< /代码>(a)。 见“

      absorb扩展将接受工作目录中的每一项更改,找出系列中修改该行的提交,并自动将更改修改为该提交。
      如果存在任何歧义(即多个提交被修改到同一行),那么absorb将忽略该更改,并将其保留在工作目录中以手动解决

      在技术层面,
      hg
      查找所有未提交的更改,并尝试将每个更改的行映射到明确的先前提交。
      对于可以清晰映射的每个更改,未提交的更改都会被吸收到相应的先前提交中。受该操作影响的提交将被重定基础