从两个不同的代码行(常规发布分支和修补程序分支)合并到Prod分支的Git策略

时间:2013-03-02 17:05:15

标签: git

我们长期运行的git分支机构是 Master UAT Prod ,以便新功能最初可用于Master并提升到UAT(准备好UAT时)然后升级到Prod(准备好生产时)。我们现在需要能够在生产中创建修补程序。我们计划创建一个修补程序分支,该分支与 Prod 分支相关联。除了长时间运行之外,这些分支是彼此分离的,因为合并是使用“非快进”合并来保持分支分开(这样我们可以很容易地看到每个分支上发生了什么活动,例如代码升级从Master到UAT等)。

以下显示了一个常规开发版本的提交流程,最终需要一个修补程序。随着开发的不断发展,Master拥有大多数提交。 UAT和Prod只有代表代码促销的提交。当需要修补程序时,我们从prod合并到修补程序,在修补程序分支上进行更改,在修补程序环境中测试它,然后将其合并到prod中。

hotfix ----------------------o-o----------   [1 commit for the merge prod->hotfix to get the latest state of prod into the hotfix environment, 1 commit of a bugfix to the hotfix environment]
prod   --------------------o-----o--------   [1 commit for the promotion uat-> prod to get the latest uat-tested code into prod, 1 commit for the promotion of the bugfix hotfix->prod]
uat    -----------------o-----------------   [1 commit for the promotion of master->uat of 4 master commits]
master --o---o---o---o----o-o--o---o-o--o-   [10 commits of new functionality]

在修补程序后注意,修补程序更改手动合并到主分支。这是因为取决于修补程序发出的时间和当前开发行的状态(可能是几个月后),主代码和修补程序之间的代码可能过于分歧,并且从Hotfix到Master的自动合并可能没有意义。因此,对于从UAT到PROD,从PROD到HOTFIX,从HOTFIX到PROD的合并,我们将不会进行常规git合并,而是使用 git merge -s theirs strategy 如此处所述:git command for making one branch like another(我们将专门做模拟#3)。

这个策略的作用是说“请合并从上游到下游的所有变化,并消除下游的状态,并将其替换为来自上游的确切内容”。因此,当我们使用这种策略从UAT转到PROD时,我们基本上会说“让PROD看起来像UAT一样”。这确保了生产中的内容正是UAT中代码的状态。

当你有两个分支将生产中的变更(一个用于常规版本,一个用于修补程序)这样的时候,git合并 - 他们的策略是执行此类合并策略的正确方法吗?

如果我们没有修补程序分支,我们只需要执行从master到uat到prod的常规(非快进)合并,而不是使用git merge -s theirs策略,因为它不需要。

2 个答案:

答案 0 :(得分:1)

您有三种选择:

  • 您只需将分支重置为新版本即可。 (在你的情况下似乎没有选择。)
  • 你使用你的“他们的策略”来告诉git“扔掉旧版本并用新版本替换”(但git不支持这个)
  • 或者通过使用--ours选项将PROD合并到master来“使”master的修补程序更改“无效”。

如果可以从PROD到master进行定期合并,请执行此操作。否则与--ours合并并在master上手动执行相应的更改。

答案 1 :(得分:0)

请考虑一下您的分支策略。对于某种项目而言,完美的策略可能是另一个项目的真正负担。

在你的情况下,我会建议一个开发分支(例如master)与正常的开发,并为每个版本建议一个单独的分支(基于发布的名称)。

发布分支从master开始并进入UAT。可以对此阶段发现的问题应用小修复。然后它进入生产,可以直接应用任何修补程序。

在您的案例中,没有充分理由将两个不同版本的提交链接起来。