【问题标题】:Git merge strategy for maven project hotfix releases with multiple branches具有多个分支的 Maven 项目修补程序版本的 Git 合并策略
【发布时间】:2013-08-23 18:16:53
【问题描述】:

处理在具有多个修补程序分支的 git flow 环境中准备 maven 版本所导致的重复合并冲突的最佳实践是什么?

(见http://nvie.com/posts/a-successful-git-branching-model/

在这种情况下,需要多个修补程序分支来维护应用程序的至少两个修订版。 oldstable 的修补程序会定期合并到 newstable 修补程序分支中。这些发布分支之间的合并导致了反复出现的合并冲突,我将在下面尝试解释:

每个分支的 pom.xml 工件版本是唯一的。

例子:

master                  - <version>1.2.0</version> (Contains the latest release)
  \ 
  dev                   - <version>1.3.0-dev-SNAPSHOT</version> (Contains changes for the next release)
  |\
  | hotfix-oldstable    - <version>1.1.1-hotfix-SNAPSHOT</version> (Contains new hotfixes for the oldstable version)
  |   \ 
  |   release-oldstable - <version>1.1.1-SNAPSHOT</version> (Is used to prepare the release)
  \
   \
    hotfix-newstable    - <version>1.2.1-hotfix-SNAPSHOT</version> (Contains new hotfixes for the newstable version)
     \ 
      release-newstable - <version>1.2.1-SNAPSHOT</version> (Is used to prepare the release)

我目前的工作流程是这样的:

预发布合并:

  1. release-oldstable 中合并 hotfix-oldstable
  2. 使用 maven 发布插件更新 release-oldstable 中的版本。这有效地更改了 pom.xml 工件版本。
  3. release-newstable 中合并 hotfix-newstable
  4. release-newstable 中合并 release-oldstable(导致冲突 - 稍后描述)
  5. 使用 maven 发布插件更新 release-newstable 中的版本。

稳定发布分支:

在该步骤之后,两个发布分支都需要稳定。这是一个重要的步骤,因为强制将提交从 oldstable 合并到 newstable,因为 newstable 版本很可能也受到 oldstable 版本中检测到的问题的影响。从 release-oldstablerelease-newstable 的合并会导致 冲突,因为 pom.xml 在两个分支中都被修改了。

当然,这可以通过使用cherry-picks来规避,但我正在寻找替代解决方案。

执行发布:

  1. release-oldstable 中执行 maven 发布。这也会改变 pom.xml。
  2. release-newstable 中执行 maven 发布。这也会改变 pom.xml。

发布后合并:

  1. 将 release-oldstable 合并到 hotfix-oldstable 中
  2. 更新 hotfix-oldstable 中的版本并将“hotfix”分类器添加到版本中。
  3. release-newstable 合并到 dev、master 和 hotfix-newstable
  4. 更新 dev 中的版本(添加“dev”分类器并提高版本)。
  5. 更新 hotfix-newstable 中的版本并将“hotfix”分类器添加到版本中。

现在为下一个版本重复该过程。

预发布合并:

  1. release-oldstable 中合并 hotfix-oldstable(没有冲突,因为 release-oldstable 已在发布后合并中合并到 hotfix-oldstable)
  2. 使用 maven 发布插件更新 release-oldstable 中的版本。这有效地更改了 pom.xml 工件版本。
  3. release-newstable 中合并 hotfix-newstable(没有冲突,因为 release-newstable 已合并到 hotfix-newstable)
  4. release-newstable 中合并 release-oldstable 此步骤会导致冲突,因为 pom.xml 在预发布步骤中已更改并在“稳定发布分支”步骤中合并。
  5. 使用 maven 发布插件更新 release-newstable 中的版本。

目前我只能想到这些选项:


更新:

我最终选择了最后一个选项。我添加了一个预构建脚本,它更新了修补程序分支构建的 pom.xml 版本。该脚本只是使用 maven 发布插件 update-versions 目标将分类器添加到 pom.xml 版本标签。这有效地防止了对 hotfix 分支中 pom.xml 文件的更改,并使合并变得更加容易。

【问题讨论】:

    标签: git maven release conflict hotfix


    【解决方案1】:

    我发现了另一个工具,它允许以非常干净的方式处理 pom.xmls 中的版本合并冲突。

    https://github.com/ralfth/pom-merge-driver

    【讨论】:

      【解决方案2】:

      也许这也是您的解决方案?看看我的回答:https://stackoverflow.com/a/26866992/1313037

      【讨论】:

        【解决方案3】:

        您是否考虑过离开 Git Flow?我工作的项目在我们刚开始使用 Git 时就使用了它;然而,它达到了这样的地步,即它的阻碍多于它的帮助。使用它来做以前版本的修补程序的问题最终导致我们决定一劳永逸地放弃它。回想起来,这是一个很好的决定,我们应该早点做。

        今天,我们只是将简单的功能分支与标签合并到 master 中。我们没有遇到任何问题,以前版本的修补程序不再那么痛苦。

        【讨论】:

        • 您能否解释一下您是如何将您的更改推送到您的 master 分支中的,比如 develop 分支?你会在发布过程中自动执行此操作吗?
        • 当我们停止使用 GitFlow 时,我们停止使用 develop。我们只有 master、短期功能和发布分支以及标签。 master 始终是最新/最好的、可发布的代码。新功能在功能分支中开发。 GitHub Pull Requests 用于审查更改;当它们准备好时,它们会合并到 master 中。当需要发布时,我们创建一个发布分支; master 可以继续前进,同时也为发布提供稳定性。当它准备好发布时,我们标记它并删除分支。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-06-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-21
        • 2013-06-02
        • 2020-06-28
        • 1970-01-01
        相关资源
        最近更新 更多