我刚刚开始使用Mercurial而且我认为我正在尝试做一些非常简单的事情,这应该是非常典型的,但我很难理解为什么它如此复杂,以及为什么它不仅仅是这样的方式它应该(IMO)。
我与朋友分享一些存储库,他做了一些更改并检查了几个文件并推送它们。现在在svn我习惯只是更新我的工作副本并获得他的更改,没有麻烦。但有了mercurial显然我必须合并。我没有得到的是:不应该变得聪明,以至于如果我的朋友做了最新的更改,并且我没有触及文件,它应该只使用他的文件版本?显然它无法解决这个问题,而是试图合并完全失败的文件(实际上我已经安装了自动打开的Beyond Compare,所以我不能完全归咎于糟糕的合并)。
无论如何,我不知道为什么它甚至必须“合并”文件,这显然(对我来说)它应该只是采取了远程(即最近的)更改。我在如何使用该工具时做错了什么,或者我能做些什么来使它以更简单的方式工作(我习惯它只是在颠覆工作的方式)...是否有任何配置设置,命令行标志的任何提示,我可以使用它来更好地工作?
答案 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有很多选择,但分布式部分确实改变了你需要考虑历史的方式。