【问题标题】:What's the ideal git branching strategy for this product development?该产品开发的理想 git 分支策略是什么?
【发布时间】:2012-07-27 02:01:42
【问题描述】:

假设我想为 Twitter(神奇的开源)iPhone 应用程序添加一组相关但独立的功能。在应用程序中,您可以点击“家庭自动化”并看到一屏用于控制家中功能的按钮:灯光;电视;温度;色调;和音乐。

在 Git 中开发这套功能的理想分支模型是什么?

以下是一些假设:

  • 一个人(同一个人)将开发所有功能。
  • Twitter 鼓励将变基作为其集成模型。
  • 所有功能共享一些基本代码。

这里是我对模型的不错,尽管我很想听听所有模型选项:

  • 代码审查员应该很容易在最后独立审查每个功能。换句话说,审查 Lights 代码的人不必处理在实现 TV 时所做的任何更改。

  • 每个功能在开发过程中都应该有良好、干净的历史记录。在处理 Lights 时查看 foo.m 时,我应该只看到为实现 Lights 所做的更改,而不是为实现 TV 所做的更改。

  • 即使我的电视处于混乱/损坏状态,我仍然可以编译和测试 Lights。

该模型的一个要求是我需要能够定期生成集成了所有功能的测试版本,就像它们将呈现给用户一样。换句话说,当我运行我的测试构建时,我会看到一个包含所有功能的家庭自动化屏幕。

我最初的直觉是这样设置分支:

Twitter
    \
     Automation
        \
         Lights
        \
         Television
        \
         Temperature
        \
         ...

换句话说,我将从 Twitter 分支创建“自动化”分支,其中包含所有家庭自动化功能使用的共享代码,包括用于访问功能的概览 UI 的存根代码(即上面提到的“全屏按钮”)。然后我会从自动化创建一系列分支,每个功能一个。

但是,在这个模型中,我无法理解如何在这个世界上生成完全集成的测试版本。我想我需要创建一些其他分支,定期将 Lights/Television/etc 分支合并在一起。但是这次合并会有明显的冲突。

例如,假设自动化分支中的共享 UI 代码有一个函数 num_buttons_to_render,它返回要在家庭自动化 UI 中呈现的按钮数量。自动化分支将在此处返回 0,因为它本身不实现任何功能。每个子分支(灯光、电视等)都将返回 1,因为它们只实现各自的工作流程,而不关心其他功能。但是测试分支想要在这里返回 5,因为它想要渲染所有 5 个自动化功能(灯光、电视、温度、阴影和音乐)。所以我想在测试分支中解决一次冲突,然后随着时间的推移继续整合所有功能分支的后续更改。但我什至不清楚我能否做到这一点,因为所有功能分支都使用 Twitter 开发标准规定的变基模型。

我是 git 新手,所以我希望我在这里能说得通。如果没有,我会在这里主动回答任何后续问题。非常感谢您的帮助!

【问题讨论】:

    标签: git version-control merge branch branching-and-merging


    【解决方案1】:

    我想我需要创建一些其他分支,定期将 Lights/Television/etc 分支合并在一起。

    这听起来很合理。

    但是这次合并会有明显的冲突。

    所以对付他们。最好早点做。

    但是测试分支想要在这里返回 5,因为它想要渲染所有 5 个自动化功能(灯光、电视、温度、阴影和音乐)。所以我想在测试分支中解决一次冲突,然后随着时间的推移继续整合所有功能分支的后续更改。

    为什么会有冲突?

    为什么不让每个功能都调用一个函数来注册自己,这会增加功能的计数。如果没有特征调用该函数,则计数为零。如果有人调用它,则计数为一。如果五个调用它,计数是五个。这似乎比在某个地方有一个硬编码的计数器更好,它在不同的分支中具有不同的值。

    我认为您建议的分支模型没有任何问题,您描述的唯一问题与 git 无关,可以通过改进代码设计来解决。

    但我什至不清楚我能做到这一点,因为所有功能分支都使用 Twitter 开发标准规定的变基模型。

    也许我遗漏了一些东西,但我不明白为什么这是个问题。如果您定期从上游代码中重新设置自动化基础,然后从自动化(而不是上游)重新设置每个功能分支,那么从功能分支合并回自动化分支就没有问题。

    【讨论】:

    • 谢谢乔纳森。关于代码设计问题:我可以做你描述的注册模型,但是为了适应我的开发工作流程而改变我的架构似乎很奇怪。如果我正在构建一个其他人可以插入的可扩展/动态系统,这样的注册系统对我来说似乎更有意义,但我不是。最终有固定数量的功能。换一种说法:如果我在一个分支上设计这一切,我会用这个注册系统使架构复杂化吗?应该不会吧?
    • 回复:“不清楚我是否可以这样做,因为他们使用的是变基模型”——我没有听从你的回答。您说您认为从功能分支合并回自动化没有问题,但这不是我所指的。相反,我指的是拥有一些将所有功能分支合并在一起的发布/测试分支。如果我的功能分支从自动化(它从上游变基)变基,每次我想生成发布版本时,我是否必须继续将所有功能分支变基到我的发布分支中,这意味着不断地重新解决相同的冲突?
    • (需要明确的是,我同意从功能分支合并回自动化没有问题。但我只想在完成给定功能后才这样做。在此期间,我希望能够生成集成所有功能的发布/测试版本,我假设这将发生在不同的分支上。)
    • 好的,我明白你的观点了。首先是注册位:无论如何,我不认为硬编码int num_features=5 是一个很棒的设计。注册系统没有必要变得复杂,它可能只是一个包含指向功能代码的指针/引用的容器,每个功能都将自己添加到容器中。
    • 对于变基:我的部分观点是,我不明白为什么一开始就应该有很多冲突,需要的不仅仅是琐碎的解决方案。解决它们后,您可以在自动化分支或功能分支中进行常见更改,以便下次合并到测试分支时不会发生冲突。即不允许冲突的代码保留在每个分支中。如果这样做会使开发过程变得困难,那么它不会人为地损害您的设计以适应您的工作流程:开发模型是对设计的约束,它应该反映
    猜你喜欢
    • 2017-10-17
    • 1970-01-01
    • 1970-01-01
    • 2016-12-06
    • 2021-09-21
    • 2012-09-30
    • 2015-11-20
    • 1970-01-01
    • 2016-10-29
    相关资源
    最近更新 更多