是否有 安全方式 重命名一个旧提交(在此期间没有发生分支),这是从当前提示开始的五六次提交?
答案 0 :(得分:3)
这取决于你是否已经将此提交推送到公共回购,或者共同合并。当提交已公开可见时,之后无法更改提交。此外,可能MQ工作不允许在之后编辑合并提交。
当提交不公开可见时,您可以将所有提交导入MQ(启用mq扩展并为您的提交是祖先的每个修订调用hg qimport -r»Revision«
)。然后,您使用hg qpop --all
取消应用所有修补程序。之后,当提交确实引入新的分支名称时,您可以使用hg branch »name«
更改分支名称,这也是您需要调用的(在qpop之后,您的提交的祖先的分支名称将用于下一个qpush命令,如果没有明确设置分支名称)。如果要编辑提交消息,可以hg qpush && hg qrefresh -e
执行此操作。要完成编辑,请致电hg qpush --all && hg qfinish --applied
。
编辑:示例工作流程
说这是初始状态,你想编辑4:
8 [default] (tip)
|
7
|
6
|
5
|
4
|
3
|
2
|
1
|
0
现在您将所有修订版本(包括4个)导入到hg qimport -r 4:8
的mercurial队列中,现在您有以下历史记录:
8 [default] (8.diff, qtip, tip)
|
7 (7.diff)
|
6 (6.diff)
|
5 (5.diff)
|
4 (4.diff, qbase)
|
3 (qparent)
|
2
|
1
|
0
下一步是取消应用所有补丁:hg qpop --all
3 [default] (tip)
|
2
|
1
|
0
不要惊慌,你的历史不会消失,它仍然存在于.hg / patches中。现在可以使用hg branch newbranch
设置分支名称。在创建新提交之前,这在历史记录中不可见。但分支名称可以显示hg branch
。
现在可以使用hg qpush
重新应用第一个冻结提交:
4 [newbranch] (4.diff, qbase, qtip, tip)
|
3 [default] (qparent)
|
2
|
1
|
0
现在,您可以使用hg qrefresh --edit
重新提交提交消息。您还可以通过编辑工作副本中的某些文件来更改内容。因此,如果您只想更改提交消息,请确保在调用hg qrefresh
之前未修改工作副本中的任何文件。如果您在致电hg status
之前运行hg qrefresh
,则可以查看此内容。
4 [newbranch] (4.diff, qbase, qtip, tip) {new commit message}
/
3 [default] (qparent)
|
2
|
1
|
0
您可以使用hg qpush
和hg qpop
导航到每个提交,以进一步修改提交。完成后,您需要将补丁转换回常规修订版。这是通过应用所有修补程序并完成队列来完成的。这是由hg qpush --all
完成的,后跟`hg qfinish --all
。现在历史看起来像这样:
8 [newbranch] (tip)
|
7
|
6
|
5
|
4 {new commit message}
/
3 [default]
|
2
|
1
|
0
答案 1 :(得分:0)
由于这是一个未被推送到任何地方的私人仓库,因此编辑历史记录应该非常安全。 (请注意,在一般情况下,历史编辑不是一个可行的选项。它仅适用于尚未发布回购的情况。)
有许多Mercurial扩展允许编辑历史记录,mq
是其中之一。但是,histedit
扩展名可能更容易。它不包含在Mercurial中,但可以从https://www.mercurial-scm.org/wiki/HisteditExtension轻松安装。
一旦设置完毕:
$ hg histedit -r $ID_OF_THE_CHANGESET_YOU_WANT_TO_EDIT
这将打开您通常用于hg commit
的任何文本编辑器,其中包含更改集列表;此列表包含之后的每个变更集您指定的变更集,因此请滚动到底部。对于每个变更集,您都会看到类似的内容:
pick 2d5657b340e5 The original message for that commit
对于您需要修改的变更集,请将pick
更改为edit
。然后保存并退出。回到shell提示符,执行:
$ hg histedit --continue
并且会像往常一样提示您提交新的提交消息。