我们几乎已经确定了一个分支模型,其中我们有一个代表生产代码的master
分支和一个代表未来版本的release-x.x
分支。
但是,有几种情况我们不确定如何有效解决:
实时错误修复与当前版本无关
-
新
feature
是release-2.0
的分支,并完全重写模块 A。 -
新
feature
于release-2.0
完成并合并。
在 master
上发现并修复了当前实时模块 A 中的错误。
在这一点上,我们认为有两种可能的情况:
-
我们将
release-2.0
基于master
来修复错误并修复冲突(丢弃现在无关紧要的错误修复代码(。最终,当版本准备就绪时,我们将release-2.0
合并master
。 -
我们只挑选与发布相关的错误修复到
release-2.0
,当版本准备就绪时,我们会用release-2.0
历史记录覆盖整个master
历史记录。
解决方案 #1 迫使我们通过我们知道不需要的提交来解决合并冲突,但解决方案 #2 迫使我们擦除整个master
分支,并将其替换为每个版本中release-2.0
分支的历史记录。这带来了丢失我们忘记挑选release-2.0
的错误修复的轻微机会,并且还可能破坏在发布之前master
分支的正在进行的错误修复。
功能毕竟不会进入发布
- 我们创建一个新的
feature
,以release-2.0
为基数并将其合并到release-2.0
与--no-ff
。 - 发现了一些错误,因此我们在
feature
上修复它们并重做上述合并过程。 - 客户再次审查该功能,决定他们想要更改许多内容 - 没有这些内容,该功能就没有价值,但我们不能为
release-2.0
进行这些更改,并且必须等到release-3.0
。
处理这种情况的正确方法是什么?我们是否应该恢复与该功能相关的所有提交,这些提交是在release-2.0
中完成的,并带有诸如"恢复功能 X - 推送回 3.0"之类的消息,然后将feature
合并到release-3.0
?
首先,如果您在release-2.0
和master
分支中都更改了模块 A,并且您希望将模块 A 在master
上的更改应用于release-2.0
分支。
除了您列出的解决方案1和解决方案2之外,还有另一种方法只能将模块A的更改从master
应用于release-2.0
。即直接将相关文件从master
签出到release-2.0
,然后提交更改。详细步骤如下:
git checkout release-2.0
git checkout master /path/to/moduleA
# Such as git checkout master moduleA/*
# Now module A is what you changed in master
git commit
其次,在大多数情况下,如果您使用版本格式作为x.y
(major.minor(,x
(主要(代表客户要求的主要/重大更改,y
(次要(表示我们修复错误或客户在审查您所做的工作时需要很少的更改。
因此,如果您的客户在查看 2.0 版本时提出重大更改请求,您可以将项目开发为 3.0 版。完成工作后,您的客户将查看 3.0 版本。如果他们报告 3.0 版本的错误或微小更改,您可以将版本更改为 3.1(将release-3.0
分支重命名为release-3.1
或在完成更改后添加标记 3.1(。
此外,您还可以参考另一个不同的分支模块:在develop
分支上工作 -完成工作时> ->develop
合并到release
分支中 -> 在release
分支获得批准/审查后 ->release
合并到master
分支中 ->在标签中记录发布版本。
我建议使用标签而不是分支来表示生产中的内容。这样,您只需签出一个新的修补程序分支并修复错误,然后直接部署此提交并将其标记为当前生产代码,如果您知道一切都会更改下一个版本,则无需将其合并回来。
* 54c82e0 - (HEAD -> master) Commit6
* bb6db8e - Commit5
* 5156c9f - Commit4
| * 630a150 - (tag: v1.1) Hotfix commit
|/
* db5c984 - (tag: v1.0) Commit3
* 00c6c5c - Commit2
* 715412a - Commit1
您将使用已计划的分支模型,但 master 将改为您的"主干",您的所有工作都合并到其中,而当前生产代码将始终有一个标记,如果您需要修补程序,您可以从中签出。
我会谨慎地盲目选择像 GitFlow 这样的"经过验证"的分支模型,所以我认为你走在正确的轨道上,试图找出适合你需求的东西。有关更多阅读,请参阅:
- Git 合作 - 从花哨到实用
- GitFlow 被认为是有害的
- trunkbaseddevelopment.com