【问题标题】:Mercurial Reverting Back, then Reapplying ChangesetsMercurial 恢复,然后重新应用变更集
【发布时间】:2011-04-05 17:57:15
【问题描述】:

我有提交 A、B、C、D 和 E。我意识到提交 B 中发生了一些非常糟糕的事情,所以我想恢复到 A,这次正确地进行更改,之前搞砸了 B,并且然后自动重新应用 C、D 和 E。

您可能想知道为什么我不返回到 B 并在那里进行修复,然后重新合并到 E(这是一个好主意吗?)。我不太了解原因,但这与一组特殊的 Visual Studio 文件(只能通过 Visual Studio 中的某些 GUI 屏幕编辑)中出现的问题有关,这些文件不能很好地进行简单的纠正发生错误后的文件...如果我知道,我会提供更多详细信息

【问题讨论】:

  • 如果更改不是特别大,我可能会手动撤消它,并签入新版本 F。如果更改很大,您就知道了。我自己刚开始使用 mercurial,所以我也会对答案感兴趣!

标签: mercurial


【解决方案1】:

只需取消您在 B 中所做的操作并将其提交为 F。这样,历史记录将保持不变,您的同行将获得更改而无需知道它。

如果 B 是服务版本,请在此处进行更改,然后将其合并到 F 中。

【讨论】:

    【解决方案2】:

    这可以使用Mercurial Queues (mq) 来完成。你想:

    1. 将变更集 B 到 E 导入到 mq
    2. 取消应用变更集 C 到 E
    3. 修复变更集 B 并刷新补丁
    4. 重新申请 C 到 E
    5. 完成补丁

    按如下方式完成:

    1. cd <project>
    2. hg qinit
    3. hg qimport --rev B:E
    4. hg qpop --all
    5. hg qpush <patch name for B>
    6. ...修复您在B中发现的问题
    7. hg qrefresh
    8. hg qpush --all
    9. hg qfinish --applied

    这一切都假设 B 到 E 没有被推送到任何公共存储库。如果它们已经被推送,那么最好的办法是在新的变更集 (F) 中简单地解决问题。

    【讨论】:

    • 这里的想法是实际改变记录的变更集的历史。根据我对 Mercurial 和 GIT 的理解,GIT 比 mercurial 更适合改变历史,但我也知道 mercurial 可以做到。不过,对我来说,似乎我几乎不想更改历史变更集,相反,我总是希望以任何必要的方式“修复”最新的提示,然后作为新的变更集提交,并进行适当的评论。不建议这样做吗?我对自己很陌生......
    • @drventure:我的回答中列出的操作将改变历史。这在 Mercurial 中通常不受欢迎,但如果您更改的变更集从未被推送到远程,则它是安全的。一旦变更集被推送到远程,那么您永远不应该尝试更改它们。相反,您应该创建一个新的变更集来逆转/修复问题(正如您已经指出的那样)。
    • 可以安全地更改尚未分发的历史记录(推入或拉出)。很多人不赞成修改历史,但我个人更喜欢保持历史干净。如果我搞砸了一个提交,我的团队的存储库就没有必要被它弄得乱七八糟。我可以在与他们分享我的提交之前修复它。
    • 明确一点,如果您已经推送过,则无法执行此操作。
    【解决方案3】:

    您也可以使用 HisteditExtension(而不是 MqExtension)。 MqExtension 更强大,但我认为它也更复杂。 HisteditExtension 有点像git rebase --interactive

    # Ordinarily it would be something like (I'd normally do -r -5, instead):
    hg histedit d0844102a010
    

    您的文本编辑器将打开一个如下所示的文件:

    pick d0844102a010 A
    pick a9448f0ba534 B
    pick b754f9f2513b C
    pick 736f7f2363ff D
    pick 05bb58f48597 E
    
    # Edit history between d0844102a010 and 05bb58f48597
    #
    # Commands:
    #  p, pick = use commit
    #  e, edit = use commit, but stop for amending
    #  f, fold = use commit, but fold into previous commit
    #  d, drop = remove commit from history
    #
    

    每一行对应一个提交。第一个词是指要应用于该提交的命令。默认的“pick”只是保持提交不变。使用“edit”进行更改(包括提交日志更改),使用“fold”将其与之前的提交合并,使用“drop”将其完全删除。

    在您的情况下,您可能只需将第一行更改为“编辑”。

    请记住,您必须使用 hg histedit --continue 而不是 hg commit(如果您正在“编辑”或存在合并冲突)。 :) 如果您遇到冲突并且事情看起来不太好并且您只想取消,那么您可以使用hg histedit --abort

    # Fix up files...
    vim foo bar baz
    
    # Finished; apply the changes (and pray for a clean merge ;).
    hg histedit --continue
    

    当然,编辑历史需要自担风险。我建议您在编辑历史记录之前创建源代码树的备份 tarball 或 zip,直到您熟悉这些命令。

    【讨论】:

      猜你喜欢
      • 2011-12-29
      • 1970-01-01
      • 2012-06-25
      • 2011-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多