我们正试图采用git-flow实现的Git分支模型。现在,我们正在至少两个发布分支上工作,一个是最新稳定版的发布分支,另一个是下一个(“预览”)版本的发布分支。我不明白的是为什么所有版本似乎都要“线性化”到master,并在那里标记。为什么不在它们的发布分支中标记版本?为什么要使用master?或者为什么要有一个develop分支而不使用master?
master
,而你的“预览发布”则映射到git-flow的release
分支。它是从develop
分支派生出来的,并在实际发布时合并到master
分支中。然后这将成为您的“最新发布”,通常只会使用git-flow的hotfix
分支修复该发布版的错误。通过这种方式,你的master
分支始终表示你的最新发布版本的最稳定状态。master
中的适当提交派生一个support
分支(在那里你将拥有所有已创建的版本)。根据文档(见链接),support
分支仍处于实验阶段,文档也不够完善。但是,正如你可以从命令行帮助中看到的那样:usage: git flow support [list] [-v]
git flow support start [-F] <version> <base>
这些分支只是刚开始,并且不打算合并回master
或develop
。这通常没有问题,因为修复“古老”的版本或实现客户要求在“古老”的版本中的功能时,不能或不应该返回到master
。如果你仍然想将一个修复移植到你的主开发分支(由master
和develop
表示),只需要开始一个hotfix
,挑选你的更改并完成hotfix
。
看起来这主要是一个心智模型,但分支有些强调过多。我同意,你可以只标记发布的提交而不将它们合并回主分支。
不过图片还是很漂亮的。将所有内容合并回主分支,清晰地显示了按时间顺序发布的版本,而不是在图形中散布版本标签。
我认为这个模型对于旧版本的错误修复不适用,它会破坏整齐的排序。
回答你的问题:我认为这是一组规则,在某些情况下可以构建出简单的心智模型。虽然并非所有规则从纯技术角度来看都有意义,但那并不代表它们不好。心智模型对人类有益。
由于完成(合并和标记)不是原子事务:使用Git hook脚本,每次在主分支上提交时自动构建和部署我们的软件到生产服务器
$ 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 describe --tags --long >.ver
$ git merge --no-ff release-1.2
$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不会混淆。
希望这可以帮助到您。
GitHub flow
(由Scott Chacon描述)。Commit Status API
将其与您的持续集成解决方案相结合。
更新:有一个新的The GitHub Flow™ 官方网站。
更新2:The GitHub Flow™ 有一个新的官方(简化版)GitHub指南:https://guides.github.com/introduction/flow/。主分支应始终代表您的生产代码库,因此在生产发布后,您应该立即将代码合并回主分支。
标记用于“记住”进入生产发布的确切代码,以便稍后可以分析代码(如果出现问题)。
理论上,如果您在发布分支或合并回主分支后在主分支上标记代码,这都不重要。我个人更喜欢在发布分支上标记代码,因为这正是进入构建/发布的代码(假设合并可能出现问题)。
开发分支概念的问题在于它是单线程的。Brendan在这个帖子中提到了一种涉及开发分支概念的策略。
git flow support
没有标记为实验性。 - Timo Verhoeven