我们在团队中的工作如下:
- 我们的 GitHub 存储库中只有一个
master
分支,它不稳定 - 认为每天都会被推送到那里;对于稳定版本,我们使用标签(对于开发,我们使用 GitHub 上的私有分支) - 我们每 3 周发布一个新的次要版本,其中包含错误修复和新功能(比如 1.2.4、1.2.5、1.2.6...)
- 我们还必须在有限的时间内(几个月)维护每个小旧版本,所以当有人使用 1.2.4 而最新版本是 1.2.7 时,他们发现了一个错误,他们可以要求我们修复这个错误在他们使用的分支上。然后我们发布一个补丁版本,1.2.4A。
- 补丁是相当特殊的。我们通常为次要版本做不超过 1-2 个补丁。对于大多数版本,我们不做补丁。
问题是,同时修复 master 和旧分支上的 bug 的最佳策略是什么?
我可以想到两个主要策略:
修复 bug
master
,然后 checkoutv1.2.4
,然后选择适当的提交(假设 bugfix 是一个始终存在的提交)并将生成的提交标记为v1.2.4A
.签
v1.2.4
出,修复错误并提交,将提交标记为v1.2.4A
,并将其合并到master
,进行合并。
我更赞成第一个版本(樱桃采摘),但我想听听其他人关于利弊的评论。
当然,当中间的提交引入一些重大更改时,事情可能会变得复杂,这可能会导致无法创建在 1.2.4 和 master 中都可以使用的提交(例如,当某些函数名称更改时)或更复杂的事情)。但更常见的情况是可以毫无问题地移植修复程序。
师傅摘樱桃的好处:
我认为采樱桃的历史更“可食用”。考虑一下:
| <- bugfix done on master | | | <- v1.2.7 ... | | | | | | | | | | - <- v.1.2.4A (cherry-picked from master) | / | <- v1.2.4
与这个:
| <- bugfix merged to master |\ | \ | | | | <- v1.2.7 ... | | | | | | | | | | | | | | | | | | | - <- v.1.2.4A (direct bugfix) | / | <- v1.2.4
想想在这之间有几十个提交。考虑像这样并行应用多个补丁。一半的屏幕会被污染。
假设我修复了一个问题
v1.2.4
,但几天后有人问我要一个补丁v1.2.3
。樱桃采摘是最明智的做法。
在我忽略的情况下,合并有什么好处吗?我可以理解它比樱桃采摘更好地保留了两个提交之间的联系,但是我们保留了发布文档,并且所有这些都在那里进行了跟踪。