Mercurial/Meld 中的 3 路合并如何工作?
Posted
技术标签:
【中文标题】Mercurial/Meld 中的 3 路合并如何工作?【英文标题】:How does the 3 way merge in Mercurial/Meld work? 【发布时间】:2011-04-20 06:52:33 【问题描述】:我正在做一个项目,我有一个提交,该提交引入了一个没有立即发现的主要问题的功能。现在我想完全删除该修订,同时保持工作遵循它,但我很难围绕这个 3 路合并。这是我的项目的简化图。
o 变更集:134:7f81764aa03a |标签: 小费 |家长:128:451d8a19edea |摘要:退出变更集 451d8a19edea | | @变更集:133:5eefa40e2a29 | |摘要:(更改我需要保持保持) | | *剪切 3 次提交* | o 变更集:129:5f6182a97d40 |/ 摘要:(更改我需要保留) | o 变更集:128:451d8a19edea |摘要:(引入了一个主要问题的变化) | o 变更集:127:4f26dc55455d |摘要:(对于这个问题,摘要无关紧要)如果我理解正确的话,r127 和 r134 是完全一样的。当我hg up -C -r 133
然后运行hg merge
时,Meld 会弹出我的文件之一的三种形式:本地、基础和其他。本地似乎是 r133,但我很难理解“基础”和“其他”的含义。
【问题讨论】:
【参考方案1】:本地是 r133
其他是r134
Base 是 r128(r133 和 r 134 的共同祖先)
当您执行 3 路合并时,它会将所有这三个合并在一起,以帮助您决定从哪里获取什么。通过查看其他修订版中的哪些变化以及共同祖先的外观,您可以就保留哪些内容和更改哪些内容做出更明智的决定。
【讨论】:
所以你是说很多都是手动合并?【参考方案2】:您的问题确实令人困惑,但这里有一些信息可能对您有所帮助。
什么是碱基?Base 是您当前已签出并处理的未修改版本。其他更改可能已经分叉(您可以在当前本地和基础之间进行修订!)。它只是最近的修订版,之后没有其他分叉从那里转移(同一个父级)(在你的情况下是 r128)
什么是头?Head 是版本控制中的最新版本。如果您仅在一份副本上单独工作,则它可能是基础。但是同事可能已经修改了同一个文件并将其签入版本控制,然后 head 比您的 base 晚。
什么是本地?Local 是您的修改版本(在您的情况下为 r133)
什么是其他?其他是一些分支/分支,也有你的 Base 作为父级(在你的情况下是 r134)
三路合并是如何工作的?3 路合并工作(至少在融合中)分层。通常从左到右是这样的:
本地>基地>其他/头
local/base 主要是微不足道的,因为它正是您修改的内容
然后您可以将您的更改合并到头部修订版或您的同事或其他任何人中。
可能有多个其他/主要修订,但合并不是您的工作,因此超过 3 种方式比较没有意义。
【讨论】:
您对头部的定义对于 mercurial 来说并不准确。 mercurial 的最新版本称为“tip”。小费始终是头,但头并不总是小费。在合并中,“head”永远不是“base”,因为“base”是被合并的两个变更集的最新共同祖先。以上是关于Mercurial/Meld 中的 3 路合并如何工作?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 TortoiseHg 2.0.3 和 Beyond Compare 3.2.4 进行 3 路合并
Visual Studio 2015 GIT 是不是使用 3 路合并?