多版本项目中的版本控制问题

Version control problems in multi version project

背景

我们有一款游戏在三个不同的地区运营,所以它是从一个主分支签出的三个不同版本的发布分支,比方说 branch_jp、branch_us、branch_tw(称它们为发布分支)和 master.

通常新特性在master分支开发,并合并到release分支。但并非每个发布分支都需要所有功能 - 这是由某些操作需求等决定的 - 因此需要一些努力才能将 master 分支的更改合并到它们。

问题

我们使用 Subversion 进行版本控制,最近我们决定迁移到 Git。

问题是我们在合并代码时在 subversion 中所做的是从 master 中选择该分支需要的提交并合并到其中,如下所示:

如果branch_jp需要featureA,我们做的是挑出commitA&Bs合并到branch_jp,如果branch_us只需要featureB我们就挑出commitBs。

由于我们已经迁移到 Git,假设所有功能都是在 master 的功能分支上开发的,并合并到发布分支中。问题是我们不能这样走:

master → featurebranch → master → branch_jp/tw/us

master → featurebranch → branch_jp/tw/us

              ↓
            master

因为feature分支是从master签出的,所以以前没有合并到release分支的features会这样合并。

我知道有一个命令 'cherry-pick' 可以做同样的事情,但我想知道是否有更多 'Git-y' 方法来处理这种情况?

此外,是否有更多 common/nicer/elegant 工作流程来处理这种 'multi release version codes' 情况?

git cherry-pick(如您所知)是针对这种情况的正确且常用的方法。

由于您需要为不同的发布分支选择不同的功能,因此您不应使用 git merge 命令,因为 git merge 会将所有更改合并到发布分支中。

而cherry-pick commit到不同的release分支,你可以按照你需要的情况来做:

  • 仅对单个功能应用更改:

    您应该从功能分支中挑选提交。例如将 featureA 的更改应用到 branch_jp, you should cherry-pick the latest commit fromfeatureA` 分支。

  • 对所有已发布的功能应用更改:

    您只需要从上次合并的提交中挑选提交即可。例如将功能 A 和 B 的更改应用到 branch_us,那么您只需要在 `branch_us.

  • 上挑选最新的合并提交

我曾在有此问题的地方工作过。虽然这是一件很难处理的事情,但我不推荐@Marina 在她的回答中提出的精选工作流程。我不推荐它的原因是 git cherry-pick 打破了原始提交和精心挑选的提交之间的联系,因此 Git 的历史分析将无法正常工作。

恕我直言,您有两个更好的选择,它们都具有保留提交标识的优点,从而使源代码树更容易推理。

1(与现状相比变化较小,但可能有点乏味)。

更改您的分支模型。 Master(如果它存在的话)不应该包含 all 特性,而应该只包含所有三个版本中的 core 特性。如果一个功能只应该在一个版本中,那么只将它合并到那个分支中。换句话说,您的发布过程应该是 include 的选择功能之一,而不是 remove 的功能之一。

2(更大的变化,更多的前期努力,但会让未来的发展更容易)。

重新考虑您的架构。与其维护三个版本的代码,不如只发布一个版本的应用程序,并将差异分解到配置文件或插件中。如果你能做到这一点,你可能会看到代码质量的好处,而不仅仅是版本控制的便利性。

如果可能的话,我会强烈推荐选项 2。