合并时为什么会变得愚蠢?如何使拉/合并更改变得更简单?

时间:2011-02-24 05:01:59

标签: mercurial merge dvcs

我刚刚开始使用Mercurial而且我认为我正在尝试做一些非常简单的事情,这应该是非常典型的,但我很难理解为什么它如此复杂,以及为什么它不仅仅是这样的方式它应该(IMO)。

我与朋友分享一些存储库,他做了一些更改并检查了几个文件并推送它们。现在在svn我习惯只是更新我的工作副本并获得他的更改,没有麻烦。但有了mercurial显然我必须合并。我没有得到的是:不应该变得聪明,以至于如果我的朋友做了最新的更改,并且我没有触及文件,它应该只使用他的文件版本?显然它无法解决这个问题,而是试图合并完全失败的文件(实际上我已经安装了自动打开的Beyond Compare,所以我不能完全归咎于糟糕的合并)。

无论如何,我不知道为什么它甚至必须“合并”文件,这显然(对我来说)它应该只是采取了远程(即最近的)更改。我在如何使用该工具时做错了什么,或者我能做些什么来使它以更简单的方式工作(我习惯它只是在颠覆工作的方式)...是否有任何配置设置,命令行标志的任何提示,我可以使用它来更好地工作?

1 个答案:

答案 0 :(得分:9)

如果您已在存储库中提交,则只需要合并。如果你与你的朋友共享存储库,他会在你没有做任何事情时提交一次或多次,当他完成所有你需要做的就是拉动和更新,没有合并。

如果您已完成本地提交,则此方案将如何展开:

local:    1---2---3---4
central:  1---2---3---4
friend:   1---2---3---4

他承诺:

local:    1---2---3---4
central:  1---2---3---4
friend:   1---2---3---4---5---6

你承诺:

local:    1---2---3---4---X---Y
central:  1---2---3---4
friend:   1---2---3---4---5---6

他推动:

local:    1---2---3---4---X---Y
central:  1---2---3---4---5---6
friend:   1---2---3---4---5---6

你拉:

local:    1---2---3---4---X---Y
                       \
                        +-5---6

central:  1---2---3---4---5---6
friend:   1---2---3---4---5---6

你合并:

local:    1---2---3---4---X---Y---7
                       \         /
                        +-5---6-+

central:  1---2---3---4---5---6
friend:   1---2---3---4---5---6

然后你推,他拉,所有的存储库是相同的。

但是,如果你在项目工作期间没有做任何事情,那么这个场景就是如何展开的:

local:    1---2---3---4
central:  1---2---3---4
friend:   1---2---3---4

他承诺:

local:    1---2---3---4
central:  1---2---3---4
friend:   1---2---3---4---5---6

他推动:

local:    1---2---3---4
central:  1---2---3---4---5---6
friend:   1---2---3---4---5---6

你拉动并更新:

local:    1---2---3---4---5---6
central:  1---2---3---4---5---6
friend:   1---2---3---4---5---6

这与Subversion的不同之处在于,使用Subversion,您拥有了每个人都必须与之交谈的集中式存储库。

因此,当您开始提交本地更改时,Subversion客户端会说“抱歉,您需要在提交之前进行更新”,并且您必须执行该更新。

如果此时您更改了中央存储库中也更改的文件,Subversion会将您的本地更改与服务器更改合并,并将修订点更新到提示。如果没有冲突,这将是一个静默合并,否则你会遇到合并冲突。

Mercurial完全相同,只是合并不是沉默。您可以在您自己的本地存储库中单独提交,而无需相互通信,但是当您尝试将所有更改集成到一个公共存储库时,您需要合并。 Mercurial从不更改现有的变更集(除非您使用某些扩展程序进行历史记录编辑),因此它不能自动确定您的并行变更集如何协同工作。

如果你们两个没有处理相同的文件,或者你对同一个文件所做的更改没有相互冲突,那么只需点击几下即可完成合并。 / p>

无论如何,Mercurial有很多选择,但分布式部分确实改变了你需要考虑历史的方式。