帮助理解Mercurial中分支的好处

帮助理解Mercurial中分支的好处,mercurial,branch,Mercurial,Branch,我一直在努力理解分支是如何有益的。我不能推动一个有两个头或两个分支机构的回购。。。那么我为什么需要/使用它们呢?首先,你甚至可以用两个头来推动,但由于你可能不想这样做,默认行为是阻止你这样做。然而,你可以强迫推力通过 现在,对于分支,让我们在一个非分布式版本控制系统中使用一个简单的场景,比如SubVase.< 假设您有一位同事与您在同一个项目中工作。Subversion存储库中当前最新的变更集是修订版100,您都在本地更新到该版本,以便现在都有相同的文件 好的,现在你的同事已经花了几个小时来做他

我一直在努力理解分支是如何有益的。我不能推动一个有两个头或两个分支机构的回购。。。那么我为什么需要/使用它们呢?

首先,你甚至可以用两个头来推动,但由于你可能不想这样做,默认行为是阻止你这样做。然而,你可以强迫推力通过

现在,对于分支,让我们在一个非分布式版本控制系统中使用一个简单的场景,比如SubVase.< 假设您有一位同事与您在同一个项目中工作。Subversion存储库中当前最新的变更集是修订版100,您都在本地更新到该版本,以便现在都有相同的文件

好的,现在你的同事已经花了几个小时来做他的更改,所以他承诺。这将使中央存储库升级到修订版101。您仍在本地使用修订版100,并且仍在进行更改

在某个时刻,您完成了,并且您想要提交,但是Subversion不允许您这样做。它说你必须先更新,所以你开始更新过程

更新过程希望接受您的更改,并假设您实际上是从修订版101而不是100开始的。如果你的改变与你的同事所做的事情没有冲突,那么一切都很顺利,但是如果你的改变有冲突,你就有问题了

现在你必须把你的改变和他的改变合并在一起,事情就会变得一团糟。例如,您可能最终合并了一个文件,第二个文件,或者您认为是这样,然后是第三个文件,您突然发现某些细节有误,最好以不同的方式合并第二个文件

除非您在更新之前备份了更改,并且迟早会忘记,否则您就有问题了

现在,上述情况实际上相当普遍。嗯,可能不是合并部分,这取决于有多少人同时在同一区域或文件中工作,但是“提交前必须更新”部分在Subversion中非常常见

那么Mercurial是如何做到的呢

嗯,Mercurial在本地提交,它根本不与任何远程存储库通信,因此它不会阻止您提交

那么,让我们再次尝试上面的场景,就在这次Mercurial中

远程存储库中的tipmost变更集是修订版100。你们都克隆了它,并且都开始修改版本100

您的同事在本地完成更改并提交。然后,他将他的变更设置推送到中央存储库,将提示带到修订版101

然后您完成更改,并在本地提交,然后您想要推送,但您收到了已经发现的错误消息,并且正在询问

那么这有什么不同呢

好吧,你的更改现在已经提交了,没有办法,除非你真的很努力地不小心丢失或销毁它们

以下是正在使用的3个存储库及其当前状态:

Colleague       ---98---99---100---A

Central         ---98---99---100---A

You             ---98---99---100---B
如果您要推送,并且被允许这样做(或强制推送),则中央存储库将如下所示:

Central         ---98---99---100---A
                               \
                                +--B
You             ---98---99---100---A----M
                               \       /
                                +--B--+
两个头。如果你的同事现在退出,他应该从哪一个继续工作?这个问题是Mercurial默认情况下阻止您造成这种情况的原因

因此,取而代之的是,您在自己的存储库中获得上述状态

换句话说,您可以选择影响您自己的存储库并在那里创建多个头部,但您不会将该问题强加给任何其他人

然后合并,与在Subversion中必须执行的操作类型相同,只是更改集是安全的,它已提交,并且不会意外损坏或破坏它。如果,在合并中期,你想重新开始,你可以,没有损失,没有伤害

合并后,您的本地存储库如下所示:

Central         ---98---99---100---A
                               \
                                +--B
You             ---98---99---100---A----M
                               \       /
                                +--B--+
现在推送是安全的,如果您的同事现在拉,他知道他必须从M变更集继续,该变更集合并了他和您的变更

上述描述是由于Mercurial的分布式特性而发生的

您还可以命名分支,使它们更持久。例如,您可能希望将一个分支命名为“stable”,以表示该分支上的任何变更集都经过了彻底的测试,可以安全地发布给客户或投入生产。然后,只有在所述测试完成后,您才会将更改合并到该分支上


然而,其性质与上述描述相同。无论何时多人使用Mercurial处理项目,都会得到分支,这是一件好事。

无论是否使用
hg branch
命令命名分支,只要创建了多个repo克隆并在这些克隆中进行了提交,都会发生分支。我的理念是,你不妨给他们起个名字。它使事情变得不那么混乱


mercurial分支的一个很好的解释是:

我已经阅读了其中的一些指南,我仍然不明白为什么你要做一个分支,而不是仅仅复制一个repo……在同一个存储库中命名分支会使它们比有多个克隆更紧密地联系在一起。也许你希望你的团队在克隆你的存储库时始终能够访问发布分支或新功能分支,或者你只是不想到处跟踪多个克隆。如果我创建了多个头部,这是我的责任。如果我甚至无法跟踪我正在处理的头部,那么我就不应该创建多个头部。大概当您从远程存储库中取出变更集,这样您就有多个头部时,我的变更集很容易被发现,因为它们上面有我的名字。我不太明白创建分支的好处。。。如果你只能更新到1个头,为什么有两个头?你不总是创造一个新的世界吗