如何在 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),并将工作分解成更小的块,这些块可以通过功能标志等随意打开和关闭
假设我在产品 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),并将工作分解成更小的块,这些块可以通过功能标志等随意打开和关闭