Git 维护不同版本的分支模型

Git branching model for maintaining different versions

我最近读了很多关于不同分支模型的文章,但总是以 Vincent Driessen's 结尾 方法作为我的开发团队的最佳设置。

困扰我的一件事是当部署在不同客户的不同版本应该获得修补程序时的问题。 在这个模型中,每个修补程序都应该被标记并合并到 master 中。

但这可能意味着 master 上的 timelime 变得混乱,因为一个修补程序将在 master 上合并 一个较新的版本被标记之后......?

In this model each hotfix should be tagged and merged into master.

这听起来像是一个坏掉的模型。修复需要应用于它们适用的任何版本。 master(或任何其他分支)可能需要也可能不需要任何给定的修复。

此外,“标记修补程序”没有意义。标签是提交的名称,而不是 patches/diffs.

But this could imply the timelime on master gets messed up as the one hotfix would be merged on master after a newer version was tagged...?

修补程序应该是 cherry-picked/rebased。将另一个版本的分支合并到 master 中只是为了修复一个错误是没有意义的。

One thing which bothers me is the problem when different versions deployed at different customers should get hotfixes. In this model each hotfix should be tagged and merged into master.

您对修补程序的定义与 Git Flow 的定义不同。你想要的是支持分支,例如 support/1.0,从标记为 1.0 的提交分支出来,同时继续你的下一个版本的工作。

在这个支持分支上,一旦您对特定版本进行了更改,您就可以为每个版本启动该分支,您可以为该特定版本应用所谓的修补程序。如果主分支刚刚有一个 2.0 版本并且必须在那里应用相同的修复程序,它会变成一个 Git Flow 修补程序,完成后会合并回主要(和开发),但不会合并回您的支持分支.

如果完全相同的更改适用于多个版本,您可以通过变基或 cherrypicking 将它们应用到每个支持分支。

下面并不是对每种方法的详尽解释,但它应该回答问题的核心。如果有人提出改进建议,我会很乐意修改。

修补程序应该部署到您维护的任何软件版本,作为您对用户的承诺的一部分。如果您支持最新的三个次要版本,那么您将在纠正漏洞或错误时向每个受支持的版本推送补丁。

但是,新功能和 non-critical 补丁将只适用于您的最新版本。

例如:

如果我的最新版本是 2.3.0,并且我承诺支持最新的三个版本,我的用户将期望版本 2.2.x2.1.x 和 [=13] =] 都将收到错误和漏洞补丁。

如果我提交一个新的 non-critical 补丁,我的最新版本将变为 2.3.1,并且其他任何内容都不会改变。

然后 假设发现了一个错误。快速浏览了一下,发现前三个小版本的最新补丁分别是2.2.92.1.122.0.15.

所有这三个过去的版本都有不同的 git 历史,因为它们具有不同的功能和 non-critical 补丁。但这并不意味着我不能单独对它们进行新的提交。

有了这些信息,我将创建一个解决当前错误的提交,并将其推送到每个不同的分支。根据代码状态,我可以使用相同的提交并将其推送到所有分支……或者我可能需要为每个版本自定义它。无论如何,我支持的所有三个过去的版本都将与我的最新版本一起获得修补程序。

已收到修复的版本号是 2.3.22.2.102.1.132.0.16

完成后,我现在已经设法兑现了我对用户的承诺,即所有受支持的版本都将收到错误和漏洞补丁。

Each customer has his own server. Customer A uses version 1.0, customer Bversion 1.1 and they only want hot fixes, no version upgrades. Does that answer your question?

是的。您手上有一个维护噩梦。我希望他们能给你很好的报酬。

基本 Gitflow 支持在继续开发下一个版本的同时完成当前版本。它不支持同时修复多个版本。你需要补充一下。

在基本的 Gitflow 中,修补程序从 master 上的最新版本标签分支出来。完成后,它们将合并回 master 并标记以形成新版本。它们也被重新合并到开发中,以将修补程序合并到未来的工作中。如果您一次只支持一个已发布的版本,这很好用。

要修补多个版本,您需要为每个受支持的旧版本创建一个分支。当您从 v1.1 移动到 1.2 时,您会从最后一个 v1.1.x 标签创建 support/1.1

修补程序的开发方式与上述相同,但您还需要将其 rebase 到发布分支并标记结果。变基,而不是合并,因为您不想拖拽所有其他新内容。

假设您在分支 hotfix/123 上对 v1.2 进行了修补程序。现在您想将其应用于 v1.1 和 v1.0。

# Copy the hotfix commits to support1.1
# Tag it as v1.1.1
git rebase --onto support/1.1 v1.2 hotfix/123
git tag v1.1.1 support/1.1

# Copy the hotfix commits to support1.0
# Tag it as v1.0.1
git rebase --onto support/1.0 v1.2 hotfix/123
git tag v1.0.1 support/1.0

这将 将修补程序提交复制到每个发布分支。由于此代码是在较新版本的软件上编写的,因此很可能会发生冲突。随着您获得更多版本,冲突会变得更糟。


任何事情都比维护多个版本更可取。如果是我,在我承诺之前,我会问为什么我的客户想要继续使用旧版本,以及他们是否值得花额外的时间和金钱。

通常是因为他们认为自己的版本“稳定”; 1.0 版适用于他们,他们看不到升级的必要,并且冒着出现错误和破坏他们所依赖的功能的风险。短期是明智的,但长期是灾难性的。随着越来越落后,真正需要升级的时候会越来越难。

这种稳定观有时是想象出来的,有时却是真实存在的。 Regression testing 可以确保每个新版本都不会破坏现有功能。您甚至可以调查您的客户以了解他们特别依赖哪些功能并确保他们经过良好测试。

您可以为他们提供测试服务器,让他们用新版本试用他们的系统,这样他们就可以确定它能正常工作。

最后,作为企业,请问支持旧版本是否值得。