Mercurial/Meld的3路合并是如何工作的?

Asa*_*ers 33 merge mercurial dvcs 3-way-merge

我正在开发一个项目,我有一个提交,它引入了一个主要问题但未立即发现的功能.现在我想完全删除该修订版,同时保持其后的工作,但我很难绕过这种3路合并.这是我的项目的简化图.

o  changeset:   134:7f81764aa03a
|  tag:         tip
|  parent:      128:451d8a19edea
|  summary:     Backed out changeset 451d8a19edea
|
| @  changeset:   133:5eefa40e2a29
| |  summary:     (Change I need to keep keep)
| |
*snip 3 commits*
| o  changeset:   129:5f6182a97d40
|/   summary:     (Change I need to keep keep)
|
o  changeset:   128:451d8a19edea
|  summary:     (Change that introduced a major problem)
|
o  changeset:   127:4f26dc55455d
|  summary:     (summary doesn't matter for this question)

如果我理解正确,r127和r134完全相同.当我hg up -C -r 133然后运行时hg merge,Meld会弹出我的一个文件的三种形式:本地,基本和其他.本地似乎是r133,但我很难绕过"基地"和"其他"的意思.

Mat*_*ela 35

本地是r133

其他是r134

基数是r128(r133和r 134的共同祖先)

当您执行3向合并时,它将所有这三个合并在一起,以帮助您决定要采取什么以及从哪里采取.通过查看其他修订版中的更改以及共同祖先的外观,您可以做出更明智的决定,了解要保留的内容以及要更改的内容.


The*_*can 11

您的问题确实令人困惑,但这里有一些可能对您有帮助的信息.

  • 什么是基地?

Base是您当前已检出并处理的修订版本的未修改版本.可能还有其他变化分叉的地方(您可以在当前本地和基地之间进行修改!).它就是最近的修订版,其他叉子之后没有转移(同一个父母)(在你的情况下为r128)

  • 什么是头?

Head是版本控制的最新版本.如果你只在一个副本上工作,它可能是基础.但是一个co worker可能修改了同一个文件并将其检入版本控制,然后head比你的base更晚.

  • 什么是当地的?

本地是您的修改版本(在您的情况下为r133)

  • 还有什么?

其他是一些fork/branch,你的Base也是父级的(在你的情况下为r134)

  • 3向合并如何运作?

3种方式合并(至少在meld中)分层次地工作.通常从左到右这样:

local> base> other/head

本地/基地大多是微不足道的,因为它正是你所修改的

然后,您可以将您的更改合并到主要版本或您的同事或其他任何人.

可能有多个其他/头部修订,但是然后合并不是你的工作,因此超过3种方式比较没有意义.

  • 你对头部的定义对于mercurial是不准确的.mercurial的最新版本称为"tip".尖端始终是头部,但头部并不总是尖端.在合并中,'head'永远不是'基础'因为'base'是两个变更集合并的最新共同祖先. (13认同)