开发和发布分支(git-flow)上的版本控制



>在 http://nvie.com/posts/a-successful-git-branching-model/上它说:

发布分支是从开发分支创建的。例如,假设版本 1.1.5 是当前的生产版本,我们即将发布一个大版本。开发状态已为"下一个版本"做好准备,我们已决定将其转换为版本 1.2(而不是 1.1.6 或 2.0)。因此,我们分支并给发布分支一个反映新版本号的名称:

$ git checkout -b release-1.2 develop
Switched to a new branch "release-1.2"
$ ./bump-version.sh 1.2
Files modified successfully, version bumped to 1.2.
$ git commit -a -m "Bumped version number to 1.2"
[release-1.2 74d9424] Bumped version number to 1.2
1 files changed, 1 insertions(+), 1 deletions(-)

现在我对此有很多问题:

  • 开发分支仍处于 1.1.5;何时更新?开发分支在某个时刻就版本号而言"落后于"发布分支是否有意义?
  • 假设我在创建发布分支之前增加了版本号。如果我这样做,我在开发和发布分支上具有相同的版本号,直到下一个版本,我认为这更有意义。创建分支出现版本号的原因是什么?

即便如此,实际上我希望我的开发分支有一个版本号,清楚地表明这是一个开发版本(因为在某处找到生成的"myproject-1.2.jar"文件的人不应该考虑在生产环境中运行这个 jar 文件)。因此,从我创建发布分支的那一刻起,我希望版本号反映"这是版本 1.2.0"和"这是基于 1.2 的开发版本"。

不幸的是,在创建发布分支时,将版本号提高到"1.2",在开发分支

上将版本号提高到"1.2+dev"之类的内容会导致每次我尝试将更改从发布分支合并回开发时都会导致冲突。你有什么建议如何使用 git 实现这种版本控制吗?

似乎以下工作流程实际上能够在 git 中实现所需的版本控制:

  • 开发分支上的版本是 <last-release>+dev .
  • 从开发分支发布新版本时:
    • 将文件中的版本号更改为 <next-release>并提交。
    • 创建分支 releases/v<next-release>从发展。
    • 在开发时,将文件中的版本号更改为 <next-release>+dev并提交。
    • 发布完成后,合并 releases/v<next-release>分支到主节点并标记它。

这边

  • 很容易知道当前开发代码是哪个发布版本基于
  • 在基于开发的分支上创建的 JAR 文件很容易检测到作为开发版本,
  • 虽然发布分支上的提交仍然可以合并回开发分支。

所以我们遇到了同样的问题,并提出了三种可能的解决方案:

1.) 当我们创建发布分支并在发布的初始提交中增加版本时,我们将开发分支中的版本更改为下一个可能的版本,并将alpha附加到版本,例如 2.0.0-alpha,以便我们知道这是未来可能版本的预发布版本(alpha 表示新功能可能会被合并)。如果下一个版本号最终与我们输入的版本号不同,那么我们只需将其更改为正确的版本即可。

2.) 开发分支+development附加到最后一个版本,因此很明显它是从分支分支和/或从主版本部署的最后一个版本的开发版本。但是我们发现这并不清楚,因为它可能会给人一种印象,这意味着该版本的开发版本......这不是真的...因为它领先于该版本!

3.)我们结合了这两个想法...我们在开发分支上修改版本,但我们根据分支名称动态执行此操作...我们使用更有意义的东西来表明它确实是一个开发版本,而不是现阶段的任何类型的版本......例如在 Rails 中:

major = 1
minor = 0
patch = 0
version = [major, minor, patch].compact.join('.')
# only release and master branch have a version
# bugfix/hotfix/feature branches are NOT releases and therefore don't have a version!
branch = `git rev-parse --abbrev-ref HEAD`
release = branch.match? /release|master/
VERSION = if release
            version
          else
            "X.X.x-#{branch} (based on: #{version})"
          end

例如,我们部署了一个用于测试的功能分支,VERSION是:

X.X.X-feature/rest-api (based on: 1.0.0)

或者,如果您不想使用分支名称...

你可以做:

VERSION = if release
            version
          else
            commits = `git rev-list --all --count`
            "rev #{commits} (based on: #{version})"
          end

因此,您可以获得基于最新发布版本的内部版本号。