设计更好的git分支模型策略 简要概述

设计更好的git分支模型策略 简要概述,git,version-control,branching-and-merging,branching-strategy,Git,Version Control,Branching And Merging,Branching Strategy,我们是一家产品公司,我们为50多个客户提供解决方案,他们每个月都在增长,我们有相当简单的分支模型,如果可能的话,我想升级 模型 我们在做敏捷,因此我们有冲刺和发布。每一两个月,我们将从master开设新的发行版分支机构,该分支机构将稳定下来,稍后将提供给对it功能感兴趣的客户。到现在为止,一直都还不错。在开发过程中,会创建新的客户机。假设我们开始开发一个客户机a,我们决定这个客户机将使用特定的版本,比如说release/1.0,所以我们制作了分支release/a_1.0,我们在那里开始开发,

我们是一家产品公司,我们为50多个客户提供解决方案,他们每个月都在增长,我们有相当简单的分支模型,如果可能的话,我想升级


模型 我们在做敏捷,因此我们有冲刺和发布。每一两个月,我们将从master开设新的发行版分支机构,该分支机构将稳定下来,稍后将提供给对it功能感兴趣的客户。到现在为止,一直都还不错。在开发过程中,会创建新的客户机。假设我们开始开发一个客户机a,我们决定这个客户机将使用特定的版本,比如说
release/1.0
,所以我们制作了分支
release/a_1.0
,我们在那里开始开发,完成后,我们合并
release/A_1.0
->
release/1.0
,并从
release/1.0
分支部署到生产中

在我继续解释问题所在之前,我将制定一些我们遵守的规则:

  • 一旦
    release
    分支打开,
    master
    就不会在那里合并
  • release/{client}{version}
    分支偶尔会更新为
    release/{version}
    分支(版本号应该匹配)
  • 只有
    hotfix
    分支合并到
    release/{version}
    分支中
  • 在打开新的
    release/{version}
    branch 2-3以前的版本
    release
    分支合并到
    master
    ,因此这些以前版本中的所有修补程序也都在新版本中
  • 打开
    release/{version}
    分支后,不允许使用以前版本的修补程序

问题在哪里? Tbh问题是一个糟糕的计划,但这种情况会发生,而且无法避免。 假设我们与一个客户(B)进行了协商,并决定给他们提供1.0版,即开设一个分支,使其成为
release/B_v1.0
,而我们在该分支中开发该客户,随着时间的推移,我们的产品团队sprint将开启另一个
release
,例如1.1.有时,客户机的开发过程需要足够的时间来打开产品,如果不是一个而是两个或三个新的
release/{version}
分支的话。因此,如果发生这种情况,管理层和客户机可能会决定使用较新的版本(比如1.3—以前它是为1.0开发的)。 现在需要做的是,我们需要为该客户端从
release/1.3
打开分支,然后合并以前打开的分支-这将使merge
release/B_1.0-->release/B_1.3
成为可能,这可能是痛苦的。为什么?

因为
release/B_1.0
偶尔会更新为
release/1.0
这意味着1.0版的所有修补程序都将在
发行版/B_1.0
(这是不可避免的,因为一些修补程序对 客户机的开发)以及何时进行合并
release/B_1.0-->release/B_1.3
这将包括所有这些修补程序 从
release/B_1.3
中的1.0版,以及更高版本的
release/B_1.3-->
1.3版
merge已推出,它们将包含在1.3版中 这是禁止的


在这种情况下我会怎么做? 我将
release/B_1.0
中的所有提交/合并都挑选到
release/B_1.3
中,这些提交/合并不是来自
release/1.0
的热修复程序,但这可能非常耗时,而且由于git历史的工作方式,也可能会出错

我建议可以锁定这些客户机分支以进行提交,因此只有合并才会进入其中,当可以进行此类合并时,我可以轻松地从相关分支中挑选合并(忽略
release/{version}
中的合并),而不必担心留下后续提交,但这意味着在这个分支工作的每个人都必须创建自己的分支,并将其合并到其中,这在我看来有点减缓了开发过程

你还有什么其他的建议可以缓解这种合并吗


为什么不为不同的git存储库管理这些客户机呢

在git回购中管理所有客户似乎很有效,但实际上并非如此。这是基于所有客户端都有相同的需求/bug,或者您必须协商它们以与其他客户端同步

所以你最好把它们分开管理。即使两个客户端具有相同的功能,也可以轻松跨存储库使用这些功能:

# In repoA
git remote add B <URL for repo B> -f
gitk --all # find the commit of repoB you want to use in repoA
git cherry-pick <commit in repoB>
repoA中的
#
git远程添加B-f
gitk——all#查找要在repoA中使用的repoB的提交
吉特樱桃采摘

这个问题在我看来太宽泛了。你会得到更好的回答,向我们展示一个仔细的分支图,并指出问题发生的地方。你知道有什么工具可以帮助我在不增加太多开销的情况下重现我的行为吗,因为我没有发现任何有用的东西并创建了我的案例,但似乎它仍然不能完成工作?在我看来,这是一个很大的冗余,但我将进一步调查,感谢您的建议。这难道不是意味着我们每次都需要为每个存储库配置自动部署吗?很可能是的。。我认为这不是一个好主意。如果很容易让所有客户使用相同的版本,当然你可以将他们放在相同的回购协议中。但是,一般来说,这很难实现,因为不同的客户有不同的需求和功能,而区别对待它们更有意义。我认为我更愿意建议我的公司采用这种模式,但我们会有多个发布分支,每个客户一个。我认为多个存储库的开销有点太大了,因为我们有70-80个客户端,这是很多存储库。。。