【发布时间】:2016-07-14 09:04:21
【问题描述】:
我确实提交了合并,之后我在主分支中退出以恢复上次合并。 一段时间后我需要合并分支,但 mercurial 说 abort: 与工作目录祖先合并没有效果
但在开发分支中,我看不到其他分支的更改。
【问题讨论】:
我确实提交了合并,之后我在主分支中退出以恢复上次合并。 一段时间后我需要合并分支,但 mercurial 说 abort: 与工作目录祖先合并没有效果
但在开发分支中,我看不到其他分支的更改。
【问题讨论】:
Merge 只会选取自上次合并后的新内容。例如:
default: *------------?
\ /
develop: o--o--o--o
每个o 代表一些提交。我们从默认分支(名为default)开始,只有一次提交,这里标记为* 而不是o。然后我们从同一个第一次提交开始创建了一个develop 分支,并做了一些工作。
工作准备就绪后,我们回到default 分支并使用hg merge。这建议进行新的提交,?。它是通过回顾 *(default 和 develop 之间的共同提交)并查看我们在两个分支上所做的并将它们组合来实现的。
我们在default 上什么也没做,所以合并很容易。 Mercurial 能够将我们在develop 上所做的一切都放入default。现在让我们将合并填写为真正的提交:
default: o------------*
\ /
develop: o--o--o--o
请注意,我已移动 *。现在是新的合并。这是链接两个分支的最新提交。
与此同时,hg backout 进行了一个新的提交,该提交撤消了之前的提交。具体来说,您要求退出合并。让我们画出来:
default: o------------*--u
\ /
develop: o--o--o--o
就无论如何所做的更改而言,这个新的提交有点像反物质版本的合并。 default 中的所有内容都回到了合并之前的状态。所以我使用字母 u(表示“撤消”)而不是通常的圆形 o 点来进行更典型的提交。
但是,两个分支上最新的共同提交在哪里?答案应该很明显:仍然是*。
现在您要求 Mercurial 再次合并。它会在 develop 中找到自合并以来的更改——并且没有任何。没有新作品可以合并!
假设我们再次检查develop 并进行一些新 提交:
default: o------------*--u
\ /
develop: o--o--o--o------o--o
现在我们可以再次将hg merge develop 转换为default,以从两个new 提交中获取更改。但是您撤消的更改以及提交u(回退提交)仍然未完成。我们只会从develop 上的new(自合并以来)提交中获取更改,并且我们保留在@987654351 上所做的更改(自合并以来) @,也就是u的undo变化:
default: o------------o--u------*
\ / /
develop: o--o--o--o------o--o
如果您想恢复所有这些更改,您可以简单地退出回退。也就是说,在develop 上添加新提交之前或之后的任何时间,甚至在合并这些新提交之前或之后,您都可以撤消撤消操作。让我们将 u 倒置为“重做”,看看如果我们在下一次合并之前插入它会是什么样子:
default: o------------o--u--n-----*
\ / /
develop: o--o--o--o--------o--o
换句话说,提交u(hg backout)取消了合并中的更改。它不会也不能真正使合并不会发生。因此,要重新获得合并中的更改,您必须撤消撤消操作,这里是我们的n。
【讨论】: