Git-flow和master带有多个并行释放分支


86

我们正在尝试采用由git-flow实现的成功的Git分支模型。现在,我们至少在两个分支上工作,一个用于最新的稳定版本,另一个用于下一个(“预览”)版本。我不明白的是为什么所有发行版似乎都对版“线性化”并在那里标记。为什么不在发行分支中标记发行?为什么要高手呢?还是为什么要开发分支而不使用master

Answers:


77

在git-flow模型中,“最新发布”版本实际上映射到master,而“预览版本”则映射到git-flowrelease分支。它是在实际发布发生时从其中分叉develop并最终合并到master其中的。然后,这将成为您的“最新版本”,并且通常您将使用git-flowhotfix分支仅修复该版本的错误。这样,您master始终代表着最新发行版本的最稳定状态。

如果要修复较旧版本的错误或在此处进行任何其他开发,则应support从相应的提交派生一个分支master(您将在创建所有版本)。support分支机构仍处于试验阶段(根据docs),并且记录不充分。但是从命令行帮助中可以看到:

usage: git flow support [list] [-v]
       git flow support start [-F] <version> <base>

这些分支只是开始而不是打算合并到masternor develop。这通常很好,因为不能或不应该使用“古老”版本的修复程序或客户要求在“古老”版本中实现的功能master。如果您仍然认为,您想将修补程序移植到您的主要开发线(由master和表示develop),只需开始a hotfix,选择您的更改并完成hotfix


17
这并没有解决从测试到质量检查再到生产的缓慢流程。可能有两个(或什至更多,但现在只说两个)发布分支打开,每个分支在该管道的不同阶段,每个分支都需要允许修复测试中发现的错误。然后,develop分支将是为尚未创建分支的发行版累积功能的位置。在这种情况下,对版本n-2的修复程序最终将被合并以开发,但至少遵循标准git flow,它会跳过版本n-1。这将导致n-1的回归,最终固定于版本n
Brendan

为什么不保留发行分支,而一旦创建了较新的发行分支,较旧的分支便演变为“支持”分支?
lkanab

1
为什么发行分支是从开发“分支”而不仅仅是从开发“分支”?
Sandra K

gitflow-avh看起来像是原始gitflow的维护(即未死)分支。git flow support未标记为实验性。
Timo Verhoeven

9

看起来主要是一种心理模型,对分支机构的重视程度过高。我同意,您可以标记发布的提交,而不是将它们重新合并到主提交中。

图片很漂亮。将所有内容合并回master可以按时间顺序清楚地指示发布,而不是在整个图上散布版本标签。

我认为该模型不适用于较早版本中的错误修复。它弄乱了整洁的顺序。

  1. 假设我们已经发布了1.0.1版,并在以后添加了功能并发布了1.1.0。
  2. 我们在1.0.1中发现了一个错误,并希望在两个版本中进行修复
  3. 我们必须在master的1.1.0之后添加1.0.2,然后直接推断(或之前)1.1.1。

回答您的问题:我认为在某些情况下,这是一组规则,可以简化心理模型。从纯粹的技术角度来看,并非所有规则都有意义,但这并不会使它们不好。心理模型对人类有益。


1
support分支专为旧版本中的错误修复而设计,尽管仍被标记为“实验性”。
mstrap

2

我个人认为上述git-flow过于复杂。

如果您使用的是GitHub,请尝试GitHub flow(如Scott Chacon所述)。

这对于在多个功能上进行协作,进行代码审阅特别有用,并且您可以使用将其与持续集成解决方案结合使用Commit Status API

更新GitHub Flow™有一个新的官方网站

更新2:针对GitHub Flow™有一个新的官方(简化版)GitHub指南:https : //guides.github.com/introduction/flow/


10
GitHub流仅适用于非发布中心上下文:git-flow流程主要围绕“发布”而设计。我们实际上没有“发行版”,因为我们每天都会部署到生产中-通常一天几次。
雷米·梅里森(RemiMélisson)2014年

10
我还要补充一点,具有维护版本的以发布为中心的上下文中,git-flow并不能真正发挥出色。例如,在1.3.0版本之后发生1.2.1版本时会发生什么?可能无法合并到master,这是工作时间顺序的异常。
肯·威廉姆斯

mstrap的答案中所述,@ KenWilliamssupport分支的目的。但是您是对的,这样的发行版没有合并到确实是一种反常现象,据master我所知,该版本应包含所有生产发行版。
beatngu13

2

就我而言,我有两个版本的同一软件,其基本知识是相同的,但是每个版本都有一些不同的功能。

因此,我创建了两个worktree,这意味着在主数据库旁边创建两个相关的长期运行分支。

$git worktree add -b version-silver ..\version-silver master
$git worktree add -b version-gold ..\version-gold master

然后我有:

$git branch
master  # base stuff here
version-silver # some normal features
version-gold # some better features

有一个存储库,但是对于上面的每个分支,我都有3个单独的文件夹。并进行主人的共同变更。然后将其与其他两个版本合并。

cd master
vim basic.cpp
git add .
git commit -m "my common edit on basic.cpp"
cd ..\version-silver
vim silver.cpp
git add .
git commit -m "my specific edit on silver.cpp"
git merge master # here i get the basic.cpp latest changes for silver project
cd ..\version-gold
git merge master # here i get the basic.cpp latest changes for gold project

每个版本的特定更改也将放在相应的文件夹中,每个项目的工作都被隔离,并且不会混淆IDE。

希望能有所帮助。


2

完全同意@Mot。

很高兴听到相同的问题。

我们的团队还被寻求比成功一号更通用的分支模型。例如,上面提到的@Mot-主要思想是避免引入额外的存储库来支持单独的* .git存储库中的release-分支,例如,它是由kernel.org完成的,用于稳定发行版。但是kernel.org这样做是为了使下载大小最小化。

对我来说,将主人作为开发的主线似乎更干净。

release- *合并模型中掌握和随后对其进行标记的想法也存在一些冲突

每当主服务器上有提交时,使用Git钩子脚本自动将我们的软件构建和推出到生产服务器

原因完成(合并和标记)不是原子事务:

$ git checkout master
Switched to branch 'master'
$ git merge --no-ff release-1.2
Merge made by recursive.
(Summary of changes)
$ git tag -a 1.2

如果git hook开始使用自动版本控制来构建:

$git describe --tags --long >.ver

那么可能会为以下内容构建错误的版本:

$ git merge --no-ff release-1.2

我知道,成功版中的版本控制引入了一些凹凸版本处理, 但这不是自动的。

因此,总而言之-我们引入的分支模型的主要区别在于-*合并和标记:-在创建其分支时标记发行版-保留发行版的分支以便将来维护它们


-2

master分支应始终代表您的生产代码库,因此,您始终在生产发布后立即将代码合并回master。

标记用于“记住”生产版本中的确切代码,因此您稍后可以返回并分析代码,以防出现问题。

从理论上讲,合并回master之后,在发布分支还是master分支上标记代码都没关系。我个人更喜欢在release分支上标记代码,因为这恰好是构建/发行版中使用的代码(假设合并可能会出错)。

开发分支概念的问题在于它是单线程的。Brendan在此主题中提到了可以用于开发分支概念的策略。


4
如果您同时维护多个发行版,例如v1.0,v1.1,v1.5,那么什么是“生产代码库”?
Thomas S.

生产代码库是目前正在生产中的版本,例如v1.0。分支机构对发行版本进行更改,以便将来将其部署到生产中,例如V1.0.1,v1.1和v2.0。一旦将“未来”发行版部署到生产中,它将被合并回母版,以便母版反映生产中的内容。它还会向前合并(例如,从v1.0.1到1.1和v2.0),因此当v1.1投入生产时,不会丢失v1.0.1的更改。
伯尼·伦兹

4
我说的是维护多个发行版本,而不是将来的版本。
Thomas S.

4
你好像不懂我 您无法想象在某些公司中会维护多个发行版本吗?例如,微软还维护Windows 7、8、8.1和10的更新,那么为什么不其他公司呢?
Thomas S.

1
没错,托马斯。该模型适用于在给定时间点具有单个生产版本的产品,例如网站。我还将这种模型用于移动版本,例如android和iPhone,其中将版本参数化以使用相同的版本号生成android或iPhone版本(或两者)。我很想知道您对如何构建产品的构建模型的意见,该产品在任何给定的时间点都有多个生产中的实时版本,可能共享某些组件而某些组件有所不同。请让我们知道...
Bernie Lenz
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.