处理由于在具有多个修补程序分支的 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)
我当前的工作流程是这样的:
售前合并:
- 在release-oldstable中合并hotfix- oldstable
- 使用 maven 发布插件更新release-oldstable中的版本。这有效地更改了 pom.xml 工件版本。
- 在release-newstable中合并hotfix- newstable
- 在release-newstable中合并release-oldstable(导致冲突 - 稍后描述)
- 使用 maven 发布插件更新release-newstable中的版本。
稳定发布分支:
在该步骤之后,两个发布分支都需要稳定。这是一个重要的步骤,因为强制将提交从 oldstable 合并到 newstable,因为 newstable 版本很可能也受到 oldstable 版本中检测到的问题的影响。从release-oldstable到release-newstable的合并会导致冲突,因为 pom.xml 在两个分支中都被修改了。
当然,这可以通过使用cherry-picks来规避,但我正在寻找一种替代解决方案。
执行发布:
- 在release-oldstable中执行 maven 发布。这也改变了 pom.xml。
- 在release-newstable中执行 maven 发布。这也改变了 pom.xml。
发布后合并:
- 将 release-oldstable 合并到 hotfix-oldstable
- 更新hotfix-oldstable中的版本并将“hotfix”分类器添加到版本中。
- 将 release-newstable合并到 dev、master 和hotfix-newstable 中
- 更新 dev 中的版本(添加“dev”分类器并提高版本)。
- 更新hotfix-newstable中的版本并将“hotfix”分类器添加到版本中。
现在为下一个版本重复该过程。
售前合并:
- 在release-oldstable中合并hotfix- oldstable (没有冲突,因为 release-oldstable 在发布后合并中合并到 hotfix-oldstable)
- 使用 maven 发布插件更新release-oldstable中的版本。这有效地更改了 pom.xml 工件版本。
- 在release-newstable中合并hotfix- newstable (没有冲突,因为 release-newstable 已合并到 hotfix-newstable)
- 在release-newstable中合并release-oldstable 这一步会导致冲突,因为 pom.xml 在 pre release 步骤中被更改并在“稳定发布分支”步骤中合并。
- 使用 maven 发布插件更新release-newstable中的版本。
目前我只能想到这些选项:
- 对于在hotfix-oldstable分支中进行的每个提交,在hotfix-newstable中使用 git cherry-pick -x
- 使用 git rere ( http://gitfu.wordpress.com/2008/04/20/git-rerere-rereremember-what-you-did-last-time/ ) (我没试过。我很想从某人那里听到到目前为止是如何解决的)
- 使用自定义脚本合并 pom.xml 中的冲突
- 改变如何处理不同分支之间的 maven 版本的方式。
更新:
我最终选择了最后一个选项。我添加了一个预构建脚本,它更新了修补程序分支构建的 pom.xml 版本。该脚本只是使用 maven 发布插件 update-versions 目标将分类器添加到 pom.xml 版本标签。这有效地防止了对修补程序分支中的 pom.xml 文件的更改,并使合并更加容易。