如何在 git monorepo 中进行合并?

How to do a merge in a git monorepo?

假设我在产品 A 上工作。我的同事在产品 C 上工作。每个产品都依赖于两个产品之间共享的库 B。

组件以传统的 monorepo 方式作为平面树存储在 SCM 中。

我和我的同事开始开发一项影响所有 3 个组件的功能。因此,我们在主干之外创建了一个分支,并开始研究该功能。此功能需要一些时间和许多提交。每个提交都会影响同一提交中的组件 A 和 B,或同一提交中的 B 和 C,或单独影响 3 个组件之一。

最后,我们得到了在两个产品之间工作的功能,是时候将它合并回“主干”了。由于在开发分支上花费的时间,主干分支上的所有 3 个组件都已更改,使此合并成为“大”合并。

问题是,我没有资格处理组件C(不是我的产品)的合并。我的同事无法处理组件 A(不是他的产品)的合并。

在像 Subversion 这样的 SCM 中,可以逐个文件地进行合并,这不是问题。我可以合并A & B,我的同事然后合并C。但是在Git,这是不可能的。这是因为 Git 仅在提交级别执行合并,因此会尝试同时合并所有 3 个组件。那么我们如何将分支合并回主干呢?

我的第一个想法是以某种方式重写历史,要么将每棵树分离到它自己的分支中,要么通过重新排序提交,以便所有 A 提交都是连续的,然后是 B 提交,然后是C 提交。这将允许我们进行单独的合并。但是,我们已经失去了最初发生的事情。新提交可能无法构建,或者测试无法运行。我们不得不失去所有这些,只是为了使用这个系统,这对我来说似乎不是一个好的权衡。

另一种选择是让我们俩一起在同一个终端进行合并。 (老实说,这可能不是坏事)。但是,如果我的产品出现问题需要时间来处理,那么我的同事也会被耽搁。

我知道像 Microsoft 这样的公司有 git monorepos。他们如何处理这个问题?

谈到 PR,您可以创建 PR 并请您的朋友审查与他们命令相关的部分....如果他们有意见,您会照顾他们直到每个人都满意为止。

我认为基本的答案是合并必须在一个单独的分支中完成,在合并到 'trunk'.

之前允许它杂乱或不完整

团队的另一种解决方案是遵循基于主干的开发(参见 trunkbaseddevelopment.com),并将工作分解成更小的块,这些块可以通过功能标志等随意打开和关闭