Git 敏捷开发的分支
Git branching for agile development
首先,我要
- 让我的
master
分支始终保持绿色。
- 能够为下一个版本挑选更改。
分支策略:
- 我有一个
master
分支和一个 integration
分支 运行ning 在旁边。
- 从
master
分支 tasks/issues。
- 当一个任务分支完成其工作时,将其合并到
integration
中以查看它是否破坏了其他任务分支的任何工作。如果是,请修复它们。
将请求从 任务分支 (不是 integration
分支)拉取到 master
分支。
这意味着 integration
分支仅用于 CI 目的,它永远不会合并到 master
- 决定下一个版本将包含哪些更改。将这些分支合并到
master
.
- 发布。
问题来了,假设我有以下情况:
master -*-----------------
|\
integration -+-\-------C---F---
| \ / /
ken/task#1 | A---B /
| /
bob/task#2 D---------E
在 F
中,发生了两件事:
- 发生合并冲突,因为
C
和 F
更改了 some-code.js
的相同行
F
打破了 C
的一些测试。
现在,Bob 必须解决这个问题,他有 2 个选择:
选项 1
- 合并
integration
到 bob/task#2
作为 G
- 修复
H
中的错误
- 作为
I
合并到integration
integration
绿色
拉取请求
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
- 切换回
bob/task#2
- 尝试修复
G
中的错误
- 合并到
integration
和 运行 测试中,看看测试是否是绿色的
- 如果没有,切换回
bob/task#2
- 尝试在
I
中修复它
合并成integration
和运行测试
...
直到 integration
变绿。
拉取请求
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
中,看看测试是否是绿色的,因为G
和I
现在没有在C
.[=60=中添加测试]
每次他将自己的工作合并到 integration
时,他还需要解决同样的 some-code.js
合并冲突,这既痛苦又多余。
Bob 有更好的选项 3 吗?
谢谢。
您应该考虑遵循 Git 流程:
https://www.atlassian.com/git/tutorials/comparing-workflows
以下是我对如何与 Git 流程开发模型保持一致的看法:
- 开发人员创建 feature/bug-fix 个分支并提交拉取请求以将他们的更改合并到集成分支中。
- 应在将更改集成到集成分支之前决定将哪些功能放入版本中 -不之后。一旦您将功能合并到集成分支中,它就注定要发布,并且顺序已经确定(您将功能应用到集成分支中的顺序)。
- 当您审查拉取请求并决定将其放入发布版时,您应该审查变更集以查看它是否可以作为快进合并进行合并,是否会产生干净的结果合并提交,或者是否有合并冲突。
- 如果存在合并冲突,您应该建议开发人员将他们的更改重新定位到集成分支的顶端。这会产生干净的提交历史和更稳定的集成分支,因为冲突解决发生在 development 分支上,并且由最熟悉代码库。
- 从开发分支到集成分支的合并应该是干净的:没有合并冲突,只是快进合并 and/or 干净的合并提交。 Integration 分支上不应发生冲突解决!
- 一旦您准备好发布,从集成分支创建一个预发布分支(此分支是发布分支,比开发分支存在时间更长,以稳定发布)。只有修复进入预发布分支。
当预发布分支准备好生产时,将预发布分支合并回主分支(这将是快进合并),同时合并同一个分支进入整合。借此机会将提交压缩为单个提交,以便您在 master 上拥有更清晰的提交历史。
合并到集成或主分支后,清理分支:合并到集成后删除开发分支;合并到master后删除预发布分支。
使用语义版本控制策略标记生产版本。创建官方发布分支以支持未来的修复。
当您在发布分支上发现问题时,按照与开发新功能(步骤 1-5)相同的过程来修复问题。优先修复 master 分支上的问题,而不是修复发布分支上的问题。修复后,将修复程序挑选到发布分支上。
热修复策略不同。对于热修复,从 master 的分支应用修复,然后选择修复到集成分支。
总而言之,我推荐的要点是:
- 在将开发人员拉入集成分支之前,让开发人员合并代码并处理开发分支上的合并冲突
- 挑选并选择哪些拉取请求(开发分支)将使其成为一个版本。一旦决定,这些特性就注定要发布。
- 不要从集成分支中挑选 commits/changes 进入 master!
- 合并到 master 应该总是是快进合并。由于您有一个额外的集成分支,因此您没有理由不想强制执行此操作。
Git Flow 非常适合大中型项目。但我实际上更喜欢 GitHub Flow 用于较小的项目,尤其是当我正在为 Web 开发组件库时。
在此处了解更多信息:
http://scottchacon.com/2011/08/31/github-flow.html
首先,我要
- 让我的
master
分支始终保持绿色。 - 能够为下一个版本挑选更改。
分支策略:
- 我有一个
master
分支和一个integration
分支 运行ning 在旁边。 - 从
master
分支 tasks/issues。 - 当一个任务分支完成其工作时,将其合并到
integration
中以查看它是否破坏了其他任务分支的任何工作。如果是,请修复它们。 将请求从 任务分支 (不是
integration
分支)拉取到master
分支。这意味着
integration
分支仅用于 CI 目的,它永远不会合并到master
- 决定下一个版本将包含哪些更改。将这些分支合并到
master
. - 发布。
问题来了,假设我有以下情况:
master -*-----------------
|\
integration -+-\-------C---F---
| \ / /
ken/task#1 | A---B /
| /
bob/task#2 D---------E
在 F
中,发生了两件事:
- 发生合并冲突,因为
C
和F
更改了some-code.js
的相同行
F
打破了C
的一些测试。
现在,Bob 必须解决这个问题,他有 2 个选择:
选项 1
- 合并
integration
到bob/task#2
作为G
- 修复
H
中的错误
- 作为
I
合并到 integration
绿色拉取请求
master -*-------------------------- |\ integration -+-\-------C---F-----------I | \ / / \ / ken/task#1 | A---B / \ / | / \ / bob/task#2 D---------E-------G---H
integration
但是,通过这种方法,我不能只选择 task#2
包含在我的下一个版本中。
因为 bob/task#2
(H
) 已经包含在 ken/task#1
中所做的更改,所以将 bob/task#2
合并到 master
意味着将 ken/task#1
合并到 master
在一起。
选项 2
- 切换回
bob/task#2
- 尝试修复
G
中的错误
- 合并到
integration
和 运行 测试中,看看测试是否是绿色的 - 如果没有,切换回
bob/task#2
- 尝试在
I
中修复它
合并成
integration
和运行测试...
直到
integration
变绿。拉取请求
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
中,看看测试是否是绿色的,因为G
和I
现在没有在C
.[=60=中添加测试]
每次他将自己的工作合并到 integration
时,他还需要解决同样的 some-code.js
合并冲突,这既痛苦又多余。
Bob 有更好的选项 3 吗?
谢谢。
您应该考虑遵循 Git 流程:
https://www.atlassian.com/git/tutorials/comparing-workflows
以下是我对如何与 Git 流程开发模型保持一致的看法:
- 开发人员创建 feature/bug-fix 个分支并提交拉取请求以将他们的更改合并到集成分支中。
- 应在将更改集成到集成分支之前决定将哪些功能放入版本中 -不之后。一旦您将功能合并到集成分支中,它就注定要发布,并且顺序已经确定(您将功能应用到集成分支中的顺序)。
- 当您审查拉取请求并决定将其放入发布版时,您应该审查变更集以查看它是否可以作为快进合并进行合并,是否会产生干净的结果合并提交,或者是否有合并冲突。
- 如果存在合并冲突,您应该建议开发人员将他们的更改重新定位到集成分支的顶端。这会产生干净的提交历史和更稳定的集成分支,因为冲突解决发生在 development 分支上,并且由最熟悉代码库。
- 从开发分支到集成分支的合并应该是干净的:没有合并冲突,只是快进合并 and/or 干净的合并提交。 Integration 分支上不应发生冲突解决!
- 一旦您准备好发布,从集成分支创建一个预发布分支(此分支是发布分支,比开发分支存在时间更长,以稳定发布)。只有修复进入预发布分支。
当预发布分支准备好生产时,将预发布分支合并回主分支(这将是快进合并),同时合并同一个分支进入整合。借此机会将提交压缩为单个提交,以便您在 master 上拥有更清晰的提交历史。
合并到集成或主分支后,清理分支:合并到集成后删除开发分支;合并到master后删除预发布分支。
使用语义版本控制策略标记生产版本。创建官方发布分支以支持未来的修复。
当您在发布分支上发现问题时,按照与开发新功能(步骤 1-5)相同的过程来修复问题。优先修复 master 分支上的问题,而不是修复发布分支上的问题。修复后,将修复程序挑选到发布分支上。
热修复策略不同。对于热修复,从 master 的分支应用修复,然后选择修复到集成分支。
总而言之,我推荐的要点是:
- 在将开发人员拉入集成分支之前,让开发人员合并代码并处理开发分支上的合并冲突
- 挑选并选择哪些拉取请求(开发分支)将使其成为一个版本。一旦决定,这些特性就注定要发布。
- 不要从集成分支中挑选 commits/changes 进入 master!
- 合并到 master 应该总是是快进合并。由于您有一个额外的集成分支,因此您没有理由不想强制执行此操作。
Git Flow 非常适合大中型项目。但我实际上更喜欢 GitHub Flow 用于较小的项目,尤其是当我正在为 Web 开发组件库时。
在此处了解更多信息: http://scottchacon.com/2011/08/31/github-flow.html