6

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

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

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

每个分支的 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 在 pre release 步骤中被更改并在“稳定发布分支”步骤中合并。
  5. 使用 maven 发布插件更新release-newstable中的版本。

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


更新:

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

4

3 回答 3

2

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

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

于 2013-09-27T01:43:28.763 回答
1

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

于 2014-11-11T14:23:53.287 回答
0

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

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

于 2015-03-06T13:39:11.630 回答