Mercurial:回滚"hg commit --amend".

Don*_*n P 27 mercurial

我不小心做了一个"hg commit --amend"而不是一个提交.如何在修改之前回滚提交?

小智 55

您可以使用hg reflog(来自期刊延期)和hg reset <hash>.

hg reflog -v
Run Code Online (Sandbox Code Playgroud)

应该给出类似的东西:

<old-hash> -> <new-hash> <user> <timestamp>  commit --amend <some-path>
Run Code Online (Sandbox Code Playgroud)

如果这是你要恢复的修改,只需使用:

hg reset <old-hash>
Run Code Online (Sandbox Code Playgroud)

提交将恢复到以前的状态,修改后的更改现在应该是未提交的更改(使用hg status和检查hg diff).

  • 这是一个正确的答案.mercurial支持reflog和重置 (6认同)
  • 也许我错过了一些东西,[期刊扩展维基页面](https://www.mercurial-scm.org/wiki/JournalExtension)确实提到了这些命令,但Mercurial 4.5的实际扩展只包含了` hg journal`命令.我糊涂了. (4认同)
  • 截至 2019 年,当启用期刊扩展时,似乎既不识别“reflog”或“重置”,[期刊扩展 wiki 页面](https://www.mercurial-scm.org/wiki/) 中也未提及它们期刊扩展名) (2认同)

小智 10

如果您的 Mercurial 版本足够新,我相信您应该能够使用Mercurial 附带hg unamenduncommit扩展程序中的命令。这可能需要启用过时标记,我不确定。

  1. 启用uncommit扩展,将其添加到您的~/.hgrc

    [extensions]
    uncommit =
    
    Run Code Online (Sandbox Code Playgroud)
  2. 实际运行 unamend:

    hg unamend
    
    Run Code Online (Sandbox Code Playgroud)


小智 5

  1. .hg/strip-backup目录中查找最新保存的备份
  2. hg unbundle .hg/strip-backup/<latest backup>
  3. 现在您应该有两个负责人-一个负责修改的提交,另一个负责两个提交(第一个-修改之前的旧提交,第二个经过校准:“针对(旧提交哈希)的临时修改提交”。
  4. 如果您有histedit扩展名,则可以hg histedit对其进行更改以进行更改(例如,选择edit以便在提交之前获得状态,即使用可以看到所有更改hg diff)。

别忘了剥掉旧头。


Tim*_*gan -4

注意:此答案现已弃用。请参阅@Sorina Sandu 的答案。


看看hg help commit,它说:

--amend 标志可用于使用新的提交修改工作目录的父目录,其中包含父目录中的更改以及“hg status”当前报告的更改(如果有)。 旧的提交存储在“.hg/strip-backup”中的备份包中(有关如何恢复它的信息,请参阅“hg help bundle”和“hg help unbundle”)。

  • 请通过解释解绑后需要执行哪些步骤才能真正达到未修改的提交来改进此答案。 (6认同)