回滚mercurial最佳实践的变化

时间:2015-01-10 05:41:59

标签: mercurial rollback

我正在尝试撤消尚未推送的承诺更改。

我使用TortisHG。我无法弄清楚如何启用条带扩展。

我怀疑might be best practice有一个解决方案,但我无法理解合并部分。而且我认为它不能解决解决本地提交但未推送的变更集的问题。

我发现Tortis的回滚并没有削减芥末。

最后 - 使用GIT会更容易吗?

4 个答案:

答案 0 :(得分:0)

只需将工作区更新到不需要的已提交更改之前的位置。

然后只需在该更改之后移植后续位,您需要从该位置及时工作

然后你可以使用strip

整理一下

答案 1 :(得分:0)

几天前问了几乎完全相同的问题 - Discarding more than one commit in TortoiseHg。当不需要的变更集位于分支的头部时,它可以工作。为了省去你看的麻烦,我在下面转载了我的答案。如果你已经在不需要的变更集之上提交了理想的变更集,那么使用rebase会有一个稍微复杂的答案,但目前尚不清楚这是一个问题:

在最近的一个mercurial中(我认为是v2.8),你可以使变更集过时,从大多数视图中隐藏它们,但如果你发现你想要它们,它们仍然存在。这是做你想做的事情的推荐方法。

让我们说最近的变化集是132,最新的好变化是130.简单地做变更集131& 132这样过时了:

hg prune -r 131::132

不可能更简单(只需确保当前父级不是不需要的更改集之一)。 [我并没有看到git如何使这更简单。]

如果您发现要查看过时变更集的内容,只需将--hidden添加到正常命令行,例如:

hg log -r 120::132 --hidden

NB。 Tortoise有一个功能来查看过时的变更集,但我不认为它有能力使它们过时。

答案 2 :(得分:0)

你在“最佳实践”中提到的“保持”我的“或”他们的“合并文件”,更多的是放弃其中一个分支的变更。我相信你所需要的只是“剥离”扩展“。

您还可以通过将您的变更集暂时导入补丁程序队列并仅挑选您需要的变更来制作MQ技巧:

  1. 右键单击要放弃的最低变更集,“修改历史记录” - > “导入MQ”
  2. 打开“Patch Queue”对话框,然后按“Unapply all patches”
  3. 使用drag-n-drop
  4. 按照您需要的顺序重新排列补丁
  5. 仅应用您需要的修补程序
  6. 右键点击变更集“修改历史记录” - >完成它们。 “完成补丁”
  7. 关于启用“strip”扩展名。如果您启用了MQ扩展,则“条带”会自动激活,即使它已显示为“未选中”和“已禁用”。禁用MQ(并重新启动TortoiseHG)将允许您显式启用/禁用“strip”。

    PS:在Win32机器上检查,TortoiseHG 3.2.3

    PPS:对不起“GUIsh”解决问题的方法: - )

    更新: 我尝试使用较旧版本的Mercurial重现上述命令行版本。 首先,我们创建一个repo并用变更集填充它:

    C:\temp>mkdir testhg
    
    C:\temp>cd testhg
    
    C:\temp\testhg>hg init
    
    C:\temp\testhg>hg --version
    Mercurial Distributed SCM (version 2.2.1)
    (see http://mercurial.selenic.com for more information)
    
    Copyright (C) 2005-2012 Matt Mackall and others
    This is free software; see the source for copying conditions. There is NO
    warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE
    
    C:\temp\testhg>echo test1 > file.txt
    
    C:\temp\testhg>hg addremove
    adding file.txt
    
    C:\temp\testhg>hg ci -m "test 1"
    
    C:\temp\testhg>echo test2 >> file.txt
    
    C:\temp\testhg>hg ci -m "test 2"
    
    C:\temp\testhg>echo test3 >> file.txt
    
    C:\temp\testhg>hg ci -m "test 3"
    

    这些是我们的变更集:

    C:\temp\testhg>hg log
    2[tip]   201b257237ac   2015-01-13 17:59 +0200   Username
      test 3
    
    1   2054f00740b6   2015-01-13 17:58 +0200   Username
      test 2
    
    0   160251440fb0   2015-01-13 17:58 +0200   Username
      test 1
    

    将最后两个更改移动到修补程序队列中:

    C:\temp\testhg>hg qimport -r 1 -r 2
    
    C:\temp\testhg>hg qseries
    1.diff
    2.diff
    

    删除中间的更改(虽然补丁文件本身仍保留在已修补的目录中):

    C:\temp\testhg>hg qremove -k  1.diff
    

    推回我们想要保留在历史记录中的更改并最终确定:

    C:\temp\testhg>hg qpush
    applying 2.diff
    patching file file.txt
    Hunk #1 succeeded at 2 with fuzz 2 (offset -1 lines).
    now at: 2.diff
    
    C:\temp\testhg>hg log
    1[2.diff,qbase,qtip,tip]   9d0771cf5145   2015-01-13 17:59 +0200   Username
      test 3
    
    0[qparent]   160251440fb0   2015-01-13 17:58 +0200   Username
      test 1
    
    C:\temp\testhg>type file.txt
    test1
    test3
    
    C:\temp\testhg>hg qfinish 1
    
    C:\temp\testhg>hg log
    1[tip]   9d0771cf5145   2015-01-13 17:59 +0200   Username
      test 3
    
    0   160251440fb0   2015-01-13 17:58 +0200   Username
      test 1
    

答案 3 :(得分:0)

一种选择是修改旧的变更集。这个特别有用的是您要撤消的变更集是提示,但包含您想要还原的一些更改以及您希望保留的一些更改。只需还原您要撤消的文件,然后运行hg commit --amend即可。这会将任何工作目录更改应用于上一次提交。这将产生的影响是取消你想要摆脱的变化。