合并Mercurial中的书签

7

昨天我在Mercurial中询问这个问题后,我决定尝试使用书签来管理短期分支(特性),如下所示。
然而,现在当我试图将我的标记头合并到开发修订版时,我遇到了以下错误:

hg update dev-1.1
hg merge feature1
abort: nothing to merge

我做错了什么?

我的存储库的图形表示:

o  changeset:   5:fa2b19961b46
|  bookmark:    feature1
|  description:  Work on feature 1 finished.
|
| o  changeset:   4:6ea0155d4d89
| |  bookmark:    feature2
| |  description: Work on feature 2 started. 
| |
o |  changeset:   3:44e335b5426c
| |  bookmark:    feature1
|/   description: Work on feature#1 started.
|
@    changeset:    2:407b3b94624f
|    tag:          dev-1.1
|    description:  Development for release 1.1 started. 
2个回答

14

正如它所说,没有要合并的东西 - 你应该使用更新(update)代替:

$ hg update feature1

您只能合并不同的历史部分,而在这里dev-1.1更改集仅是feature1更改集的祖先。Mercurial 2.1表示:

$ hg merge feature1
abort: nothing to merge
(use 'hg update' or check 'hg heads')
在这种情况下,我们希望这将使错误更清晰。
如果您已经将 dev-1.1 的变更集加为书签(而不是标记它),那么一个简单的
$ hg update

从现在开始(使用Mercurial 2.1),将会对dev-1.1书签进行更新。所以,如果您从以下位置开始:

$ hg bookmarks
 * dev-1.1                   0:b1163a24728f
   feature1                  3:c84f04513651
   feature2                  2:e60dd08af282

然后进行更新:

$ hg update
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
updating bookmark dev-1.1

那么书签就会被更新:

$ hg bookmarks
 * dev-1.1                   3:c84f04513651
   feature1                  3:c84f04513651
   feature2                  2:e60dd08af282

在早期版本中,你需要这样做:

$ hg update feature1
$ hg bookmark -f dev-1.1

如果使用普通的hg update不能让你到达正确的变更集,例如,如果你想要与feature2进行“合并”,那么仍然适用这个方法。


在Git中,当历史记录没有真正发散时使用合并(merge)的想法。在该系统中,有一个快进合并(fast-forward merge)的概念,这是我们在Mercurial中称为更新(update)的东西。


哦,所以我需要运行 hg update feature1 && hg merge feature2 等等,对于每个从 dev-1.1 版本开始的功能分支都要这样做? - Industrial
1
合并 feature1feature2 是另一回事。但是,当这些功能是并行开发的(就像您的情况一样),那么您需要将它们合并到您的 dev-1.1 分支中。如果您只有 feature1,那么没有并行开发,因此 hg update 就是正确的答案。 - Martin Geisler
在Mercurial 2.7中,hg merge --preview feature1至少会列出所有适当的变更集,但实际合并仍会出现此处讨论的错误,这并没有帮助。 - Ti Strga
@TiStrga:这是因为 hg merge --preview REV 仅仅展示了 hg log -r '::REV - ::.' 的结果。也就是说,它会展示与你合并的那个版本的祖先节点,但这些祖先节点并不是当前工作副本的父节点的祖先节点。当 REV 不是一个有效的合并版本时,或许我们应该中止操作而不是继续展示结果。 - Martin Geisler
有没有其他的替代方案来“合并” feature2 而不是 feature1,而更新并推进 dev-1.1 书签呢? - Robert Tupelo-Schneck

3
如果更改集已经公开,您可以强制Mercurial进行合并,如果您希望每个功能作为存储库中的合并存在。
$ hg update feature1
$ hg debugsetparents dev-1.1 feature1
$ hg commit -m 'Feature 1 reviewed by me.'
$ hg bookmark -d feature1

如果更改集还没有公开,您可以将更改集合并为一个:

$ hg update feature1
$ hg rebase --dest dev-1.1 --collapse
$ hg bookmark -d feature1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接