我们正在尝试采用git-flow实现的successful Git branching model。现在,我们正在开发至少两个发布分支,一个用于最新的稳定版本,另一个用于下一个(“预览”)版本。我不明白为什么所有版本似乎都“线性化”到 master 并在那里标记。为什么不在发布分支中标记发行版?为什么主人呢?或者为什么开发分支而不是使用 master ?
答案 0 :(得分:64)
在git-flow模型中,“最新发布”版本实际上映射到master
,而“预览版本”映射到git-flow release
分支。它从develop
分叉,最后在实际发布时合并到master
。然后这将成为您的“最新版本”,您通常会使用git-flow hotfix
分支修复该版本的错误。这样,您的master
始终代表最新发布版本的最稳定状态。
如果你想修复旧版本的bug或者在那里开发任何其他版本,你将在support
的适当提交中分叉master
分支(你将全部那里创造的版本)。 support
个分支仍然是实验性的(according to the docs)并且没有详细记录。但正如您可以从命令行帮助中看到的那样:
usage: git flow support [list] [-v]
git flow support start [-F] <version> <base>
这些分支刚刚启动,不打算合并回master
或develop
。这通常很好,因为修复“古代”版本或客户要求在“古代”版本中实现的功能不能或不应该回到master
。如果您仍然认为,您希望将修补程序移植到主开发线(由master
和develop
表示),只需启动hotfix
,选择您的更改并完成{ {1}}。
答案 1 :(得分:8)
看起来像一个心理模型,过于强调分支。我同意,你可以只标记你发布的提交,而不是将它们合并回主人。
但是,这幅画很漂亮。将所有内容合并回主服务器可以按时间顺序清楚地显示发布,而不是在整个图表中散布版本标记。我认为这个模型不适用于旧版本中的错误修正。它弄乱了整齐的顺序。
回答你的问题:我认为这是一套规则,在某些情况下会产生一个简单的心理模型。从纯粹的技术角度来看,并非所有规则都有意义,但这并不会使它们变坏。心理模型对人类有益。
答案 2 :(得分:3)
我个人认为提到的git-flow过于复杂。
如果您正在使用GitHub,请尝试GitHub flow
(如Scott Chacon所述)。
对于多个功能的协作,代码审查尤其有用,您可以使用Commit Status API
将其与持续集成解决方案相结合。
更新:有一个新的official website of The GitHub Flow™
更新2 :GitHub Flow™有一个新的官方(简化)GitHub指南:https://guides.github.com/introduction/flow/
答案 3 :(得分:1)
完全同意@Mot。
很高兴听到同样的问题。
我们的团队还被迫寻找比Successfull多的通用分支模型。 即正如上面提到的@Mot一样-主要思想是避免引入额外的存储库来支持单独的* .git存储库中的release- *分支,例如,它由kernel.org完成,以实现稳定的发行版。但是kernel.org这样做是为了使下载的大小最小化。
对我来说,将 master 用作 develop 的主线似乎更干净。
在release-* merging model中,与 master 存在一些冲突,并在以后将其标记为
每当主服务器上有一次提交时,使用Git钩子脚本自动将我们的软件构建和推出到生产服务器中
因为finishing (merging and tagging)不是原子交易:
$ 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
我知道Successfull中的版本引入了一些bump-version process 但这不是自动的。
因此,总而言之,我们引入到分支模型以进行发布-*合并和标记的主要区别是: -在创建分支时标记发布 -保留release的分支,以便将来对其进行维护
答案 4 :(得分:0)
在我的情况下,我有两个版本的相同软件,基本相同,但每个版本都有一些不同的功能。
所以我创建了两个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个单独的文件夹。并在master中做出共同的改变。然后将其与其他两个版本合并。
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不会混淆。
希望有所帮助。
答案 5 :(得分:-2)
主分支应始终代表您的生产代码库,因此您始终在生产发布后将代码合并回主数据库。
标记用于“记忆”生产版本中的确切代码,以便您可以稍后返回并在出现问题时分析代码。
理论上,在合并回master之后,如果在发布分支或主分支上标记代码,则无关紧要。我个人更喜欢在发布分支上标记代码,因为这正是构建/发布的代码(假设合并可能出错)。
开发分支概念的问题在于它是单线程的。 Brendan在这个帖子中提到了一个可以用于开发分支概念的策略。