Mercurial:开发人员在单独的文件夹上工作,为什么他们必须一直合并

时间:2015-01-13 15:51:00

标签: mercurial

我有四个开发人员在一个mercurial仓库中的四个独立的源文件夹中工作。为什么他们必须一直合并并用合并变更集污染回购?它让他们烦恼,让我很烦恼。

有更好的方法吗?

3 个答案:

答案 0 :(得分:2)

Mercurial 分布式,这意味着如果您有一个中央存储库,每个开发人员在他/她的工作站上都​​有一个私有存储库,还有一个工作副本当然。

现在让我们假设他们进行了更改并将其提交到了他们的私有存储库。当他们想要 hg push 时,可能会发生两件事:

  • 他们是第一个在中央服务器上推送新变更集的人,然后不需要合并,或者
  • 从同一版本开始,其他人已提交并推送之前。我们可以看到这里有一个分支:从同一起点Mercurial有两个不同的方向,因此即使没有冲突也需要合并,因为我们不希望中央服务器上有四个不同的不同上下文(通过Mercurial的方式是可行的,它们被称为 head ,你可以强制推送而不合并,但你仍然有分歧,没有魔法,这可能不是你想要的,因为你想成为能够结清所有贡献的总和..)。

现在如何避免执行合并非常简单:您需要告诉开发人员在提交之前整合其他更改

$ hg pull
$ hg update
$ hg commit -m"..."
$ hg push

当针对最新的中央版本提交时,不需要合并。 如果他们在同一个代码上工作,那么在拉动和更新之后,还需要运行一些测试,以确保在集成其他开发人员工作时隔离工作仍然有效。经常采取其他人的贡献并经常推动我们自己的变化被称为持续集成,并确保快速发现集成问题。

希望它能提供帮助。

答案 1 :(得分:1)

假设更改确实不冲突,您可以使用rebase extension代替合并。

首先,将其放在.hgrc文件中:

[extensions]
rebase =

现在,不要合并,只需hg rebase。它将“分离”您的本地变更集并将其移动为公共提示的后代。您还可以传递各种参数来修改被重新定义的内容。

再次,如果您的开发人员遇到物理合并冲突或逻辑冲突(例如Alice在Bob更改相关功能的同时更改了文件A中的功能),那么不是一个好主意在文件B)中。在这些情况下,您应该使用真正的合并以正确表示相关历史记录。如果遇到物理冲突,hg rebase可以轻易中止,但最好手动检查逻辑冲突,因为扩展无法自动检测到这些冲突。

答案 2 :(得分:1)

您的开发团队承诺很少而且经常; 这正是你想要的所以你不想为了清晰的提交而改变这种习惯。

@Kevin描述了使用rebase extension并且我同意可以正常工作。但是,您还会看到每个开发人员的所有工作顺序在一行提交中被挤压在一起。如果您正在开发稳定的代码库并且只是提交快速的单一提交修复程序,那么这可能没问题 - 如果您有持续的开发线,那么您可能不会想要失去开发人员的连续性& #39; s提交。

另一种选择是将您的存储库拆分为较小的独立存储库。

如果您的开发人员总是在4个单独的文件夹中工作,那么这些文件夹的内容可能会模块化并存储为单独的Mercurial存储库。然后,您可以拥有一个单独的主存储库,将所有这些较小的存储库放在sub-repository框架内。