@
Albertcord 最好的避免 merge 地狱的方式就是不 merge 。在 trunk - release branch 的模式里,所有的 cherry-pick 都是从 trunk -> release branch ,纯单向,不会搞错。
还是以你的项目为例,在 trunk ( develop ,其实应该用 master 更合适)上开发,当需要交付版本的时候,拉出一个 release branch ( master ,其实应该用 release-v1.0 类似的更合适),开始在这个分支上进行针对交付的修改(关闭某些未完成的功能,调整某些版本号标识,比如 VERSION="dev" -> VERSION="v1.0",etc )。这个分支就是「专属于该发布使用的」。
接下来看一些具体情况:
Q:发现 v1.0 有 bug 需要修复怎么办?( hotfix 场景)
A:如果是 release-branch 独有的问题,在 release-branch 上修复即可;如果是 master 上也存在的问题,先在 master 上修复,然后 cherry-pick 到 release-branch 上。
Q:需要在 v1.0 上发布新的功能怎么办?( release 场景)
A:首先已知所有新功能都应该在 master 上开发,而不是在 release-branch 上。接着需要根据增加新的功能涉及的 commit 范围做出选择,1. 从 trunk 上重新开一个 release branch 分支走完整的发布流程,或者 2. 从 trunk 上 cherry-pick 修改到 release branch 上。
可以看到不管什么场景下,都是 trunk -> release branch 单向的。
对于 git flow ,我其实是不太能理解为什么它是 work 的…… 比如当你需要同时维护多个版本线 (v1.x ,v2.x )时,git flow 的 main 分支是单线的,怎么办;比如当你在 main 上需要标记 VERSION="v1.0",从 main 派生出的 develop 分支上需要标记 VERSION="dev",然后 develop 分支又会在 release 时合入 main 分支( VERSION 打架),hotfix 分支又会从 main 分支派生出来同时合入 main 分支和 develop 分支( VERSION 又打架)……