Git 分支策略以适应不断变化的功能优先级

Git branching strategy to accommodate changing feature prioritisation

项目 X 如何在项目 Y 没有更改的情况下发布(合并到 Master)?

展望未来,解决方案 A、B 和 C 是否都应该是独立的存储库(尽管它们在业务级别相关)?

场景

我们有一个存储库,其中包含:

解决方案 A 和 B 都 'plug-in' 到我们的整个系统,该系统通过通用组件将它们连接在一起。解决方案 A 和 B 依赖于解决方案 C 中的共享组件。

项目 X 需要更改解决方案 A 和 C。这些更改在功能分支中完成,合并回开发并持续部署到我们的暂存环境中。

项目 Y 只需要更改解决方案 B。再次在功能分支中,合并回 dev 并持续部署到 Staging。

Git历史

此时,我们的 Git 历史看起来像这样(从早到晚):

--> 项目 X --> 项目 Y

业务需求

企业不再希望项目 X 投入生产,因为项目 Y 现在 'priority 1'。 项目 X 的​​更改可以发布。

分支策略

我们遵循以下策略:

发布攻略

我们部署完整的产品包,而不是差异化的。

合并到 Dev 时,Team Foundation Server 部署到 Staging。

在合并到 Master 时,Team Foundation Server 为每个构建定义提供一个格式化的部署包。

在我看来,您应该将 a、b 和 c 分成三个独立的存储库/项目。 a 和 b 应该引用 c 作为依赖项。

项目 x 将直接依赖 a 和 c "via" a。 项目 y 将 b 作为直接依赖,c "via" b.

您可以在不影响项目 x 的情况下继续为项目 y 和解决方案 b 开发新功能。除非你对解决方案 c 进行更改,这可能会改变解决方案 a and/or 解决方案 b.

ps:我知道这个答案不是真实的"solution"。但也许是一种 "confirmation" 你已经知道的东西。或 "encouragement" 来做您想改变的事情。 :-)

我看到您在引用标准 'git flow' 分支策略,该策略在 http://nvie.com/posts/a-successful-git-branching-model/ 中引入并且以某种形式存在于许多大型项目中。

值得注意的是关于 'develop' 分支的段落:

[The develop branch] always reflects a state with the latest delivered development changes for the next release

以及关于特征分支的段落:

The essence of a feature branch is that it exists as long as the feature is in development, but will eventually be merged back into develop (to definitely add the new feature to the upcoming release) or discarded (in case of a disappointing experiment).

更改在确认发布之前不应出现在 'develop' 分支中。如果您的项目 X 没有获得发布许可,它不应该出现在开发分支中,因此您只发布项目 Y 不会有问题。

因此,在回答您的问题时,

1) 您可以 cherry pick your Project Y commits to apply to master. I don't recommend this as master is supposed to be a known stable state, and you won't have been testing an environment with Project Y but not Project X in it to confirm this. Instead, I would revert 项目 X 从开发更改(将它们留在功能分支中),重新测试,然后将开发合并到主服务器中。

将来自 Project X 功能分支的更改重新应用到开发中时要小心,因为它们仍将具有合并历史并且重新应用它们变得非常重要 - 请参阅 here 了解旧的讨论。

2) 如果项目仍然跨越多个存储库,我相信单独的存储库对您没有帮助。在一般实践中,您应该对已有的结构感到满意。如果所描述的场景(已在开发中的功能的最后一分钟发布块)频繁发生,那么您的问题在于更改开发的批准流程。未来不确定的特性应该在它们的特性分支中上演,直到发布被确认。在确认更改后撤回更改的成本(包括时间和风险)必须向业务部门说明。