Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么mercurial在合并时是哑巴?如何使拉入/合并更改更简单?_Mercurial_Merge_Dvcs - Fatal编程技术网

为什么mercurial在合并时是哑巴?如何使拉入/合并更改更简单?

为什么mercurial在合并时是哑巴?如何使拉入/合并更改更简单?,mercurial,merge,dvcs,Mercurial,Merge,Dvcs,我刚刚开始使用Mercurial,我想我正在尝试做一些非常简单的事情,一些应该非常典型的事情,但是我很困惑为什么它如此复杂,为什么它不能按它应该的方式工作(IMO) 我和一个朋友共享了一个存储库,他做了一些更改,签入了几个文件并推送它们。现在在svn,我习惯于只更新我的工作副本并得到他的更改,没有任何麻烦。但显然我必须和mercurial合并。我不明白的是:mercurial难道不应该足够聪明,明白如果我的朋友做了最新的更改,而我没有碰过这些文件,它应该只使用他版本的文件吗??显然,它无法理解这

我刚刚开始使用Mercurial,我想我正在尝试做一些非常简单的事情,一些应该非常典型的事情,但是我很困惑为什么它如此复杂,为什么它不能按它应该的方式工作(IMO)

我和一个朋友共享了一个存储库,他做了一些更改,签入了几个文件并推送它们。现在在svn,我习惯于只更新我的工作副本并得到他的更改,没有任何麻烦。但显然我必须和mercurial合并。我不明白的是:mercurial难道不应该足够聪明,明白如果我的朋友做了最新的更改,而我没有碰过这些文件,它应该只使用他版本的文件吗??显然,它无法理解这一点,相反,它尝试合并完全失败的文件(事实上,我已经安装了自动打开的Beyond Compare,因此我不能将错误的合并完全归咎于mercurial)


无论如何,我不知道为什么它甚至必须“合并”文件,而(对我来说)它显然应该只进行远程(即最近的)更改。我在使用这个工具的过程中是否做错了什么,或者我可以做些什么来让它以一种更简单的方式工作(就像我习惯于在subversion中工作的方式)。。。是否有任何关于命令行标志的配置设置和提示可供我使用,以使其更好地工作?

只有在存储库中提交后,才需要合并。如果您与朋友共享存储库,他会在您不做任何事情时提交一次或多次,当他完成所有操作时,您需要做的只是拉取和更新,而不是合并

如果您完成了本地提交,下面是场景的展开方式:

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
他承诺:

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
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
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
他承诺:

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
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
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会将您的本地更改与服务器更改合并,并将您的修订点更新到tip。如果没有冲突,这将是一个静默合并,否则您将得到合并冲突

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

如果两人没有处理过相同的文件,或者对相同文件所做的更改彼此没有冲突,那么只需单击几下鼠标,合并就完成了


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

您能更具体地说一下“完全失败”吗?是他更改的文件失败了,还是其他文件也失败了?你做过树枝吗?您具体以什么顺序使用什么命令?你们都在同一个操作系统上吗?您收到了哪些具体的错误消息?在执行“hg拉动”之后是否执行了“hg更新”?使用“hg pull”,任何可用的变更集都会被拉入本地存储库。然后,您必须执行“hg update”将变更集引入到您的工作项目中。或者,如果您希望在单个命令中进行与SVN等效的更新,最好使用“hg pull-u”。如果它尝试合并,则意味着本地和远程分离,因此我敢肯定我们在图片中遗漏了一些内容。如果您没有接触文件,这些文件根本不会合并。事实上,合并“完全失败”意味着你们两个都对文件做了更改。好的,有了你的回答,我理解得好多了。问题是我不知道需要hg更新(我认为pull命令已经做到了这一点)。所以hg输出的一条消息让我觉得我需要做“hg合并”,所以我这么做了,我认为这样做是错误的。我想也许hg应该给出更好的提示,如果在拉它之后会给出提示说“您可能需要立即运行hg更新”,那么我就知道该怎么做了。我确实在我的项目中做了更改,我只是没有和我的朋友接触相同的文件,所以我们不应该有任何冲突的更改。