2011-02-24 50 views
2

我刚开始使用水银,我想我试图做一些很简单的东西,应该是比较典型的,但我难倒,为什么它是如此复杂,为什么它不只是工作的方式,应该(IMO)。合并时为什么会变得笨拙?我怎样才能使拉/合并更改变得更简单?

我分享一些与朋友的仓库,他做了一些变更,并检查在几个文件中,并推动他们。现在在svn我习惯于更新我的工作副本并获得他的更改,没有麻烦。但与mercurial显然我必须合并。我不明白的是:mercurial是否应该足够聪明以便弄清楚,如果我的朋友做出了最近的更改,而且我没有触及这些文件,那么应该只使用他的文件版本?显然,它不能明白这一点,相反,它试图合并其彻底失败的文件(其实我已经安装了无法比拟的,其自动打开,所以我不能坏合并怪善变完全)。

无论如何,我不知道为什么它甚至有可能“合并”的文件时,很明显(我),它应该只是采取远程(即最近)的变化。难道我做错了什么在我如何使用工具,或者是有什么我可以做,使之以更简单的方式(我已经习惯了它只是在Subversion工作的方式)工作...有什么配置设置,关于命令行标志的任何提示,我可以用它来使它更好地工作?

+1

你能更具体地说“完全失败吗?”他只改变了文件失败,还是其他文件?你有任何分支?你以什么顺序专门使用了哪些命令?你们是否都在同一个操作系统上?你得到了什么具体的错误信息? – 2011-02-24 05:46:38

+2

执行'hg pull'后执行'hg update'吗?使用'hg pull'时,任何可用的变更集都会被拉入您的本地存储库。然后您必须执行“hg update”将变更集引入您的工作项目中。 – 2011-02-24 06:54:47

+1

或更好,如果你想在一个命令中使用“hg pull -u”来进行SVN等效更新。 – Serkan 2011-02-24 07:21:50

回答

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 

您拉动并更新:


其原因,这是从Subversion是如何做到的是与颠覆你有集中式存储库,每个人都不得不谈不同。因此,当你开始提交你的本地修改时,Subversion客户端会说“对不起,你需要更新才能提交”,并且你必须执行那个更新。

如果在那时您更改了在中央存储库中也发生更改的文件,Subversion会将您的本地更改与服务器更改合并,并将您的修订点更新为提示。如果没有冲突,这将是一个无声的合并,否则你会得到合并冲突。

Mercurial完全一样,除了合并不是沉默的。您既可以在自己的本地存储库中单独提交,也不需要彼此交谈,但是当您尝试将所有更改集成到一个公共存储库时,则需要合并。 Mercurial从不改变现有的变更集(除非你使用一些扩展名进行历史编辑),所以它不能自动找出你的并行变更集如何协同工作。

如果你们两个都没有处理过相同的文件,或者你们对相同文件所做的更改没有相互冲突,那么只需点击几下鼠标就可以完成合并。

在任何情况下,Mercurial都有很多选择,但分布式部分确实改变了您需要考虑历史的方式。

+0

好的,你回答我明白了很多。问题是我不知道需要更新hg(我认为pull命令已经做到了这一点)。所以hg输出的信息之一让我觉得我需要做“hg merge”,所以我这样做了,我认为这是错误的做法。我想或许hg应该给出更好的提示,如果在拉动之后会给出一个提示“你现在可能需要运行hg update”,那么我会知道该怎么做。 – Otto 2011-02-24 18:05:43

+0

ps.s.我在我的项目中进行了修改,我只是没有碰到与我的朋友相同的文件,所以我们不应该有任何冲突的变化。 – Otto 2011-02-24 18:11:02

相关问题