非常大的树:我们的分支工作流程有什么问题以及如何解决它?

时间:2016-06-13 10:39:19

标签: git merge azure-devops rebase git-flow

我的团队已经开始在git下工作,其工作流程接近GitFlow。 我们有几个限制因素:

  • 我们需要一个目前正在开发的所有功能的分支机构,为用户提供测试环境。我们将该分支称为集成
  • 我们需要一个仅具有用户验证功能的分支以及通过Pull-Request的每个技术功能,以便能够创建发布包。我们将该分支称为 dev
  • 我们希望将我们的功能开发成分支,从 evol - 开始,并从 dev 分支
  • 我们希望每个功能分支都能从任何技术(=无需用户验证)推进中受益:我们决定从 evol 分支机构中挑选技术提交到dev(进入 tech - 分支关闭dev,将请求拉入dev)。然后我们将dev合并到任何需要它的 evol 分支

当某个功能准备好进行测试时,我们会将其合并到集成中,让用户对其进行测试,如果有效,请将功能合并为 dev

这意味着许多合并到集成,从许多不同版本的 dev 的功能分支,所以我们有这种树(左边是当前的集成分支)

horrible git tree

团队规模为5个开发者。我们通常同时存在许多功能分支,每个分支都需要很长时间才能完成和验证。

由于Visual Studio Team Services(Visual Studio Online)处理拉取请求的方式(显示来自源分支的任何差异,因为它偏离目标,而不是模拟合并真实结果)我们希望减少从 dev 获得最新技术进步的功能分支引起的差异。

我想要走的路是rebase将它们放到 dev 而不是将dev合并到它们中,但是当涉及到集成的合并时,这显示出一个问题:合并保持不变指向旧提交而不是rebase的新提交。

我得到了git rebase -p --onto new old每次合并时想要的结果,但这看起来有点不对,特别是当从功能到集成有多个合并时。

After two rebase --onto for B and B2

我做了:
git rebase -p --onto <new B> <old B>
git rebase -p --onto <new B2> <old B2>
我甚至逃脱了更好看的树,因为git删除了B之后的第一次合并。

有没有办法:

  • 指定rebase选项,以便使用该重新分配的分支提交作为源的合并使用新的更新
  • 修复我们的工作流程,以便我们不再拥有一个可怕的超级树,并且没有问题可以在重新定位之前以某种方式删除从某个功能中合并到 integration

1 个答案:

答案 0 :(得分:0)

看来我们可以使用Use Gradle Wrapper集成上创建一个提交,它承载来自源分支的差异,但没有指向该分支的父指针。这将允许我们轻松地在开发HEAD上重新绑定 evol 分支,而不会在集成合并中指向旧提交的冲突指针。
我将与我的团队讨论这个问题,并在更新此答案之前进行几天试用。

见下图:
effects of squash merge and rebase

我在执行git merge --squash之后将 evol-B 重命名为 evol-B-rebased 以保持此视图并仍然能够创建拉取请求在github上。
集成上的提交是使用git rebase dev

创建的压缩合并

这似乎比我们原来的树看起来好多了。我们应该确保只允许压缩合并集成,并且每个人都将源分支的名称放在该壁球的提交消息中。

唯一不完美的是,pull请求仍会显示所有功能的提交,而不仅仅是那些尚未压缩集成的提交,但是那个&#39; sa我想是必要的邪恶。

以下是将 evol-B-rebased 合并回 dev 并清理旧的 evol-B 后的情况:<登记/> clean tree
分支机构甚至独自落入自己的泳道,这很不错!

对于长期功能分支,在合并到集成时会产生巨大的拉取请求,我们只需为该功能的每个部分创建一个子分支并拉动请那些回到功能的主分支中(就像sprint分支/ sprint集成分支一样)