不针对Git专家的多个发布线和Git-Flow建议

46
我们的软件产品线需要同时开发和维护多个软件版本。我们是相对新手的Git用户,最近采用了Driessen的分支模型来充分利用它。我们有一个非常小的软件团队,只有少数专门的开发人员(我们都扮演许多角色),没有“集成大师”。
尽管我们进行了大量搜索,但很少有关于如何将Git和Git Flow适应我们需求的具体建议。已经发现的是,Git Flow不适合同时支持多个版本。在SO上相关的讨论中,一些答案表明需要使用单独的分支名称来跟踪不同版本的历史记录。这种方法及其相关策略消除了Git Flow,除非对其进行修改;请参见我们团队的限制原因,这不是我们实际可行的。
关键问题是,其他人发现实施Driessen的分支模型时,最好的方法是什么,同时支持多个发布线?
更新:

通过仔细阅读下面的答案(特别是@Rasmus的答案),并进行更有针对性的搜索和内部讨论,我们得出了以下解决方案。我们正在实施这个方案,并将其作为一种适用于类似条件下的团队的方法。

我们不会继续使用Git Flow。相反,我们将对每个版本库中的每个发布线路应用Driessen的模型,并在每个分支名称前加上其预期的发布字符串,例如:

r1.5/develop

所有项目的版本都包含在Git存储库中。启动新项目版本需要创建一组以发布字符串为前缀的新长期分支(例如r1.6/develop和我们的情况下r1.6/release;没有master,其暗示单个当前可构建状态)。

我们在服务器上为每个项目建立一个中央公共存储库,这将是通过本地repo remote链接共享代码的主要途径。向该存储库推送表示代码已准备好供他人使用。将RX.Y/develop合并到RX.Y/release分支中,然后推送,表示该代码旨在发布。featurehotfix等分支也采用类似的处理方式。给定发布线的分支合并/提交历史记录干净且易于理解。我们不希望采用典型的Git分布式repo策略,而是避免合并此类repo的复杂性,这些repo随着时间的推移可能会发生结构分歧。

在某些Git GUI(例如SourceTree),此分支结构被识别并显示为分层结构,有助于从分支结构理解项目的顶级历史。

很抱歉没有为任何答案点赞;我在SO上的声望还不足以这样做。


这个问题似乎与编程本身无关,而是关于软件开发和版本控制的最佳实践。因此,它不适合在此讨论。 - Hans Then
22
我不同意。软件最佳实践和软件设计模式一样,都是编程的主题。我搜索了这个话题,在stackoverflow上找到了我期望找到的内容。 - Bernard
3个回答

9
我们的设置与您类似,除了我们有超过300名专业开发人员,并且我们需要向不同的客户交付多个版本。我们将其分为初始参考refs/heads/platformX.Y/,然后在此基础上建立。因此,根据您需要做什么,您可以检出platformX.Y/develop并从该点开始在功能分支上工作,并在完成后将其合并回develop。这对我们很有效,我们可以遵循nvie模型。此外,我们正在将所有这些platformX.Y分支合并到我们的主develop分支中,因此在这些分支上纠正的错误也会发布到最新的软件中。

感谢 @Rasmus。根据您的回答,我的想法正在朝着为“发布分支组”(因缺乏更好的名称)定义两个长期存在的分支,即开发和发布,例如 r1.2/develop 和 r1.2/release。将所有 platformX.Y 分支合并到主开发分支中是否会导致难以理解分支历史,特别是对于非专家而言?如果多个版本在长时间内处于积极开发状态,如何理解顶级开发分支的状态? - mklein9
这完全取决于情况,我们有一些不合并的区域,因此我们将其合并到主“trunk”并对不应合并到develop分支的子目录进行git checkout。但是这种情况是逐个分支处理的。 - Rasmus Østergaard Kjær Voss
我不理解Rasmus git工作流模型中,当将功能/错误合并到refs/heads/platformX.Y/中时,如果这些功能/错误在develop中不存在会发生什么?(我知道这是一个旧的讨论,但我们遇到了类似于OP的问题,正在尝试找到最佳解决方案)。 - viktor

2
我们通常的开发流程适用于Driessen的工作流,但有时我们需要为专门的发布开发一个包含多个功能的分支,而不希望包括正在进行中的大部分开发。我们已经找到了一种使用现有工具在flow中实现这一点的方法,只需添加几个额外的步骤。(我们在mercurial上工作,但对于git flow和hg flow的选项是相同的。)
例如,我们下一个正常发布版本是23.0,我们特殊的“沙盒”发布版本是22.4.2。对于这些情况,我们需要:
1. 在新功能创建之前,在develop的基础上为特殊版本创建一个22.4.2的发布分支。如果某些功能早些时候已经开始,只要它们不在我们想要排除的develop工作之后即可。
2. 为方便起见,在那里创建一个标记(start-22.4.2)。
3. 每个新的22.4.2功能都以start-22.4.2 (develop上的一个changeset)作为其父/基础开始。这可以防止任何同时合并到develop的工作泄漏到发布分支。命令行和Sourcetree都支持选择除tip之外的父级来启动git flow feature。
4. 如果需要,手动从22.4.2分支的tip向功能合并,并尽可能经常地合并,以引入分支中完成的任何功能。这使我们可以处理分支上新22.4.2功能之间的任何相关问题。
5. 使用git flow feature finish将功能合并到develop中,就像正常情况下一样。(对我们来说,这些功能是打算包括在未来发布中的。我们只是保护22.4.2免受测试不足的工作的影响。)
6. 在finish之后,我们手动将关闭功能之前的最后一个changeset合并到22.4.2分支上。

我注意到上面有一个错误:你必须从新分支的父变更集开始流程,因为起始变更集需要在develop上。 (你不能从实际创建分支的变更集开始。) - Joshua Goldberg
要从第3步开始,不带标签:1.合理性检查:hg log -r 'branch(default) and parents(first(branch(beta24.0)))'应该只返回一个结果。2.hg flow feature start <featurename> -r 38f21bfeef47(由于某些原因,您无法以编程方式指定修订版)。3.合理性检查#2:hg log -r 'children(parents(.))'应包括您想要先行的分支的起点。 - Joshua Goldberg
建议同时使用 hg commit --amend -e 命令,将“来自 beta24.0 的父级”添加到功能启动的提交消息中。 - Joshua Goldberg

1
一种解决方案是更改配置变量gitflow.branch.develop。您在发布的版本上创建一个分支,将该分支用作新的开发分支。从那里开始,您可以使用常规的git-flow命令。如果您想自动将该工作合并回原始开发分支,请在git-flow完成命令之前更改gitflow.branch.develop变量。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接