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

Mercurial: devs work on separate folders, why do they have to merge all the time

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

有更好的方法吗?

Mercurial 是 分布式,这意味着如果你有一个中央存储库,每个开发人员 在 [=39] 上有一个私有存储库=] 工作站,当然还有工作副本。

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

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

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

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

当提交是针对最新的中心版本时,不需要合并。 如果他们在同一代码上工作,则在拉取和更新之后还需要进行一些 运行 测试,以确保当其他开发人员的工作已集成时,孤立工作的内容仍然有效。经常接受他人的贡献并经常推动我们自己的更改也称为持续集成,并确保快速发现集成问题。

希望对您有所帮助。

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

首先,将其放入您的 .hgrc 文件中:

[extensions]
rebase =

现在,不是合并,而是 hg rebase。它将 "detach" 您的本地变更集并将它们移动到 public 提示的后代。您还可以传递各种参数来修改变基的内容。

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

您的开发团队承诺很少但经常; 这正是您想要的 所以您不想为了干净的提交行而改变这个习惯。

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

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

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