Git 敏捷开发的分支

Git branching for agile development

首先,我要

  1. 让我的 master 分支始终保持绿色。
  2. 能够为下一个版本挑选更改。

分支策略:

  1. 我有一个 master 分支和一个 integration 分支 运行ning 在旁边。
  2. master 分支 tasks/issues。
  3. 当一个任务分支完成其工作时,将其合并到 integration 中以查看它是否破坏了其他任务分支的任何工作。如果是,请修复它们。
  4. 将请求从 任务分支 (不是 integration 分支)拉取到 master 分支。

    这意味着 integration 分支仅用于 CI 目的,它永远不会合并到 master

  5. 决定下一个版本将包含哪些更改。将这些分支合并到 master.
  6. 发布。

问题来了,假设我有以下情况:

master       -*-----------------
              |\
integration  -+-\-------C---F---
              |  \     /   /
ken/task#1    |   A---B   /
              |          /
bob/task#2    D---------E

F 中,发生了两件事:

  1. 发生合并冲突,因为 CF 更改了 some-code.js
  2. 的相同行
  3. F 打破了 C 的一些测试。

现在,Bob 必须解决这个问题,他有 2 个选择:

选项 1

  1. 合并 integrationbob/task#2 作为 G
  2. 修复H
  3. 中的错误
  4. 作为I
  5. 合并到integration
  6. integration绿色
  7. 拉取请求

    master       -*--------------------------
                  |\
    integration  -+-\-------C---F-----------I
                  |  \     /   / \         /
    ken/task#1    |   A---B   /   \       /
                  |          /     \     /
    bob/task#2    D---------E-------G---H
    

但是,通过这种方法,我不能只选择 task#2 包含在我的下一个版本中。 因为 bob/task#2(H) 已经包含在 ken/task#1 中所做的更改,所以将 bob/task#2 合并到 master 意味着将 ken/task#1 合并到 master在一起。

选项 2

  1. 切换回 bob/task#2
  2. 尝试修复 G
  3. 中的错误
  4. 合并到 integration 和 运行 测试中,看看测试是否是绿色的
  5. 如果没有,切换回 bob/task#2
  6. 尝试在I
  7. 中修复它
  8. 合并成integration和运行测试

    ...

    直到 integration 变绿。

  9. 拉取请求

    master       -*-----------------
                  |\
    integration  -+-\-------C---F---H---J--- ..........
                  |  \     /   /   /   /
    ken/task#1    |   A---B   /   /   /
                  |          /   /   /
    bob/task#2    D---------E---G---I--- ..............
    

此方法可防止将 ken/test#1 的更改捆绑到 bob/task#2

但是,Bob 现在需要 "guess" 修复错误。然后一遍又一遍地合并到integration中,看看测试是否是绿色的,因为GI现在没有在C.[=60=中添加测试]

每次他将自己的工作合并到 integration 时,他还需要解决同样的 some-code.js 合并冲突,这既痛苦又多余。

Bob 有更好的选项 3 吗?

谢谢。

您应该考虑遵循 Git 流程:

https://www.atlassian.com/git/tutorials/comparing-workflows

以下是我对如何与 Git 流程开发模型保持一致的看法:

  1. 开发人员创建 feature/bug-fix 个分支并提交拉取请求以将他们的更改合并到集成分支中。
  2. 应在将更改集成到集成分支之前决定将哪些功能放入版本中 -不之后。一旦您将功能合并到集成分支中,它就注定要发布,并且顺序已经确定(您将功能应用到集成分支中的顺序)。
  3. 当您审查拉取请求并决定将其放入发布版时,您应该审查变更集以查看它是否可以作为快进合并进行合并,是否会产生干净的结果合并提交,或者是否有合并冲突。
  4. 如果存在合并冲突,您应该建议开发人员将他们的更改重新定位到集成分支的顶端。这会产生干净的提交历史和更稳定的集成分支,因为冲突解决发生在 development 分支上,并且由最熟悉代码库。
  5. 从开发分支到集成分支的合并应该是干净的:没有合并冲突,只是快进合并 and/or 干净的合并提交。 Integration 分支上不应发生冲突解决!
  6. 一旦您准备好发布,从集成分支创建一个预发布分支(此分支是发布分支,比开发分支存在时间更长,以稳定发布)。只有修复进入预发布分支。
  7. 当预发布分支准备好生产时,将预发布分支合并回主分支(这将是快进合并),同时合并同一个分支进入整合。借此机会将提交压缩为单个提交,以便您在 master 上拥有更清晰的提交历史。

  8. 合并到集成或主分支后,清理分支:合并到集成后删除开发分支;合并到master后删除预发布分支。

  9. 使用语义版本控制策略标记生产版本。创建官方发布分支以支持未来的修复。

  10. 当您在发布分支上发现问题时,按照与开发新功能(步骤 1-5)相同的过程来修复问题。优先修复 master 分支上的问题,而不是修复发布分支上的问题。修复后,将修复程序挑选到发布分支上。

  11. 热修复策略不同。对于热修复,从 master 的分支应用修复,然后选择修复到集成分支。

总而言之,我推荐的要点是:

  1. 在将开发人员拉入集成分支之前,让开发人员合并代码并处理开发分支上的合并冲突
  2. 挑选并选择哪些拉取请求(开发分支)将使其成为一个版本。一旦决定,这些特性就注定要发布。
  3. 不要从集成分支中挑选 commits/changes 进入 master!
  4. 合并到 master 应该总是是快进合并。由于您有一个额外的集成分支,因此您没有理由不想强制执行此操作。

Git Flow 非常适合大中型项目。但我实际上更喜欢 GitHub Flow 用于较小的项目,尤其是当我正在为 Web 开发组件库时。

在此处了解更多信息: http://scottchacon.com/2011/08/31/github-flow.html