mercurial - 如何对 Mercurial 中的先前标签提交错误修复?

标签 mercurial tags workflow branch

假设我有两个 Mercurial 分支:(1) 默认 和 (2) 稳定。我将错误修复推送至稳定,并将新功能推送至默认。当default中添加了足够的功能时,default就会被 merge 到stable中。然后稳定会被贴上合适的标签。为了简单起见,我们假设我使用标签 1.0、1.1、1.2、1.3 等。

现在,假设我发布了带有标签 1.3 的稳定。然后我继续开发,后来发布了 1.4 和 1.5。然后我注意到 1.3(和 1,4 + 1.5)中存在一个主要错误,我需要修复该错误。我如何最好地返回到 1.3,修复该错误,并确保该错误也适用于 1.4 和 1.5?

当我谈论标签而不是分支时,这可能吗?从我的头脑中,我想说我需要以某种方式回滚到 stable 1.3 标签,修复错误,然后将错误推送到 1.3(然后将错误修复转发到1.4 和 1.5)。然而,回滚到标签本质上与回滚到修订版本相同。是否可以回滚到以前的标签/修订版并将更改应用到该“时间点”?

如何最好地解决这个问题?

最佳答案

However, rolling back to a tag is essentially the same as rolling back to a revision. Is it even possible to roll back to a previous tag/revision and apply changes to that "point in time"?

没有什么可以阻止你。您可以 checkout 任何修订并通过简单的提交从那里开始一个新的头。仅当推送更改时,当您推送具有多个头的分支时,Mercurial 才会阻止您(除非使用 --force 选项)。但无论如何你都不想推送多个头,因为错误修复提交应该 merge 到主稳定和默认头中。

From the top of my head, I'd say that I would somehow need to roll back to stable's 1.3 tag, fix the bug and then push the bug to 1.3 (and then forward-port the bugfix to 1.4 and 1.5)

是的,这就是基本思想。让我们创建一个错误修复 merge 级联!

假设你有这样的历史:

@  changeset:   7:83f16f6d167d (tip)
|  summary:     new feature bar
|
| o  changeset:   6:c20d6c330271 (stable)
| |  summary:     Added tag v1.1.0 for changeset fd09feac2b59
| |
| o  changeset:   5:fd09feac2b59 (stable) (v1.1.0)
|/|  summary:     merge default into stable
| |
o |  changeset:   4:38ace577cfb7
| |  summary:     new feature foo
| |
| o  changeset:   3:0581117b05f7 (stable)
| |  summary:     Added tag v1.0.0 for changeset 5305c84aeebb
| |
| o  changeset:   2:5305c84aeebb (stable) (v1.0.0)
|/   summary:     new branch stable
|
o  changeset:   1:a8bf2fb0f30a
|  summary:     new features
|
o  changeset:   0:c70ef214ec57
   summary:     initial

也就是说,您在稳定分支上有 2 个版本:v1.0.0v1.1.0。现在您有一个紧急的错误需要修复,您需要修复两个版本,当然也需要修复您的默认分支。这就是我要做的:

$ hg up v1.0.0
... fix the bug ...
$ hg commit -m 'fix that bug in v1.0'
$ hg tag v1.0.1
$ hg up v1.1.0
$ hg merge tip
... the merge  will raise conflicts in `.hgtags` ...
... make sure the resolved version contains the content of both sides ...
$ hg commit -m 'merge bugfix into v1.1'
$ hg tag v1.1.1
...

执行此操作,直到所有版本都 merge 了错误修复。最后,还将错误修复 merge 到稳定分支的原始头部和默认分支中。

$ hg up c20d6c330271
$ hg merge tip
$ hg commit -m 'merge bugfix into main head of stable'
$ hg up default
$ hg merge stable
$ hg commit -m 'merge bugfix from stable into default'

现在历史看起来像这样:

@    changeset:   13:358084bd1a91 (tip)
|\   summary:     merge bugfix from stable into default
| |
| o    changeset:   12:a12c5c10d9db (stable)
| |\   summary:     merge bugfix into stable
| | |
| | o  changeset:   11:e78d7ea72624 (stable)
| | |  summary:     Added tag v1.1.1 for changeset abd62a5ba092
| | |
| | o    changeset:   10:abd62a5ba092 (stable) (v1.1.1)
| | |\   summary:     merge bugfix into v1.1
| | | |
| | | o  changeset:   9:8f272cc5a565 (stable)
| | | |  summary:     Added tag v1.0.1 for changeset 21f31836b80c
| | | |
| | | o  changeset:   8:21f31836b80c (stable)
| | | |  summary:     fix that bug in v1.0
| | | |
o | | |  changeset:   7:83f16f6d167d
| | | |  summary:     new feature bar
| | | |
| o | |  changeset:   6:c20d6c330271 (stable)
| |/ /   summary:     Added tag v1.1.0 for changeset fd09feac2b59
| | |
| o |  changeset:   5:fd09feac2b59 (stable) (v1.1.0)
|/| |  summary:     merge default into stable
| | |
o | |  changeset:   4:38ace577cfb7
| | |  summary:     new feature foo
| | |
| o |  changeset:   3:0581117b05f7 (stable)
| |/   summary:     Added tag v1.0.0 for changeset 5305c84aeebb
| |
| o  changeset:   2:5305c84aeebb (stable) (v1.0.0)
|/   summary:     new branch stable
|
o  changeset:   1:a8bf2fb0f30a
|  summary:     new features
|
o  changeset:   0:c70ef214ec57
   summary:     initial

请注意,该错误修复仅提交了一次,但已将其 merge 到需要的所有修订和分支中。

关于mercurial - 如何对 Mercurial 中的先前标签提交错误修复?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21596618/

相关文章:

mercurial - Capistrano、Mercurial 和分支机构

version-control - 版本控制 : moving a bug fix/code enhancement around feature development

python - 从 python 中的特定标记中提取 URL

git - 在 github 上标记消息

java - 操作系统工作流程更换

mercurial - 我可以将对多个 mercurial 子存​​储库的更改提交到一个新的命名分支吗?

python - Ubuntu Hardy 下的 Mercurial http 接口(interface)。不起作用

html - 在WPF控件中,有哪些类似 `<div>`的HTML标签?

java - 何时在自定义 Java 应用程序中调用工作流

git : Handle multiple variations of th same sofware in a single repo