避免将 master 合并到 development 分支
Avoid merging master into development branch
我一直在监控从每个冲刺开始的两个 b运行ches - Release
和 Master
。
Master
b运行ch 来自开发人员创建新的 b运行ch(特定于任务),实施他们的更改,并创建合并到 Master
。
Release
b运行ch 是 sprint 特定的,始终可以提交给生产。我们只将提交给 Master
并由 QA 验证的 b运行ches 合并到 Release
b运行ch 中。
这种方法最适合我们,因为我们定期提交 Release
特定功能的实现和验证,因此我们确切地知道下一个版本中会发生什么。
一切顺利,直到我 运行 进入以下问题;
- DeveloperA 已创建任务特定 b运行ch say
taskA
from Master
.
- 他多次提交
taskA
b运行ch.
- 同时其他开发人员 B 从
Master
创建了他的 b运行ch taskB
并对 taskB
进行了多项更改并将 taskB
合并到 Master
.
- DeveloperA 将合并
Master
到 taskA
b运行ch 并进一步执行他的任务,并将更多更改提交到 taskA
b运行ch !
- 最终他会把
taskA
b运行ch合并成Master
.
现在我只想合并 taskA
b运行ch 到 Release
b运行ch 但因为 taskB
也被合并到 taskA
b运行ch 因为 DeveloperA 在步骤#4 中将 Master
合并到他的 b运行ch 中,我得到 taskB
b运行ch 自动更改为 Release
b运行ch!我不想要那个。
避免将 Master
合并到 Developer
b运行ch 的最佳方法是什么?在我的案例中,应该遵循的正确方法是什么?
我觉得你的策略太复杂了,容易出问题。并发症是试图将功能 b运行ches 分别集成到 Release 和 Master 中。因为功能是在 Master 上开发的,所以每个功能 b运行ch 都将利用早期的功能和错误修复。当您尝试将功能 b运行ch 单独合并到 Release 中时,Release 可能没有集成它所依赖的早期功能和错误修复。问题、冲突、并发症。
如果从 Master 中提取特性 b运行ches,将它们合并到 Master 中,并定期将 Master 合并到 Release 中,就简单多了。合并流程是 Features -> Master -> Release。从不功能 - >发布。实际上,应该有中间测试和暂存 b运行ches 来保持当前处于最终用户测试中的版本(这是在功能 b运行ch 单元测试之上),以及为下一个准备好的东西发布。功能 -> 大师 -> 测试 -> 登台 -> 发布。
也就是说,让我们把你的问题画出来。
DeveloperA has created task specific branch say taskA from Master. He has committed multiple times to taskA branch.
A - B [master]
\
C - D [taskA]
Mean while other developerB created his branch taskB from Master and committed multiple changes to the taskB and got taskB merged into Master.
F - G
/ \
A - B - E ----- H [master]
\
C - D [taskA]
DeveloperA will merge Master into taskA branch and further carry on his task, and commits more changes into taskA branch!
F - G
/ \
A - B - E ----- H [master]
\ \
C - D ----- I - J - K [taskA]
Eventually he will get taskA branch merged into Master.
F - G
/ \
A - B - E ----- H --------- L [master]
\ \ /
C - D ----- I - J - K
Now I just want to merge taskA branch to Release branch but as taskB was also merged into taskA branch as DeveloperA merged Master into his branch in step#4, I get taskB branch changes automatically into Release branch! I don't want that.
你有几个选择。您可以 git cherry-pick
仅将 taskA 中的提交提交到 Release 中,避免合并提交。那是 C、D、J 和 K。如果 J 或 K 依赖于 taskB 中的任何内容(或 Master 中不在 Release 中的任何其他内容),您将遇到冲突或(希望如此)测试失败。这是一个混乱的手动过程。
第二选择,而不是功能 b运行ches 使用合并从 Master 获取更新,在 master 之上变基。当 taskA 的开发者决定从 master 更新时,如果他们有 运行 git rebase master
而不是 git merge master
,他们就会有这个。
F - G
/ \
A - B - E ----- H [master]
\ \
C - D C1 - D1 [taskA]
C 和 D 将在 master 的新位置之上重新修补。开发人员将不得不处理任何冲突和测试问题。然后他们可以继续工作并在完成后合并到 master 中。
F - G
/ \
A - B - E ----- H ----------------- L [master]
\ \ /
C - D C1 - D1 - J1 - K1 [taskA]
这种方法使 b运行ches 保持漂亮和干净,没有中间合并。您可以挑选整个 b运行ch 来发布,而不必挑选中间合并。如果 taskA 依赖任何尚未合并到 Release 中的东西,您仍然会遇到冲突和测试失败,但至少隔离功能的过程更简单。
因为您的工作流程需要您将功能块运行集成两次,而且顺序可能不同,所以您肯定会遇到冲突运行。如果必须将功能重新无序地合并到 Release 中,那么将功能合并到 Master 中真的没有意义。
我强烈建议您改变流程,这样您只需将功能 b运行ches 集成到 Master 中一次。 Release 只是 Master 的早期版本。如果功能 b运行ch 尚未准备好发布,不要合并它。这通常是一个很好的开发实践,它提高了开发人员正在使用的代码的质量(即 Master),并且避免了开发人员不得不处理一堆不稳定的半成品功能。
有时您会希望对 Release 应用修补程序,这很好。有时您会想要从 Master 中删除一个功能,这也很好。这些应该是特殊任务,而不是正常工作流程。
我一直在监控从每个冲刺开始的两个 b运行ches - Release
和 Master
。
Master
b运行ch 来自开发人员创建新的 b运行ch(特定于任务),实施他们的更改,并创建合并到 Master
。
Release
b运行ch 是 sprint 特定的,始终可以提交给生产。我们只将提交给 Master
并由 QA 验证的 b运行ches 合并到 Release
b运行ch 中。
这种方法最适合我们,因为我们定期提交 Release
特定功能的实现和验证,因此我们确切地知道下一个版本中会发生什么。
一切顺利,直到我 运行 进入以下问题;
- DeveloperA 已创建任务特定 b运行ch say
taskA
fromMaster
. - 他多次提交
taskA
b运行ch. - 同时其他开发人员 B 从
Master
创建了他的 b运行chtaskB
并对taskB
进行了多项更改并将taskB
合并到Master
. - DeveloperA 将合并
Master
到taskA
b运行ch 并进一步执行他的任务,并将更多更改提交到taskA
b运行ch ! - 最终他会把
taskA
b运行ch合并成Master
.
现在我只想合并 taskA
b运行ch 到 Release
b运行ch 但因为 taskB
也被合并到 taskA
b运行ch 因为 DeveloperA 在步骤#4 中将 Master
合并到他的 b运行ch 中,我得到 taskB
b运行ch 自动更改为 Release
b运行ch!我不想要那个。
避免将 Master
合并到 Developer
b运行ch 的最佳方法是什么?在我的案例中,应该遵循的正确方法是什么?
我觉得你的策略太复杂了,容易出问题。并发症是试图将功能 b运行ches 分别集成到 Release 和 Master 中。因为功能是在 Master 上开发的,所以每个功能 b运行ch 都将利用早期的功能和错误修复。当您尝试将功能 b运行ch 单独合并到 Release 中时,Release 可能没有集成它所依赖的早期功能和错误修复。问题、冲突、并发症。
如果从 Master 中提取特性 b运行ches,将它们合并到 Master 中,并定期将 Master 合并到 Release 中,就简单多了。合并流程是 Features -> Master -> Release。从不功能 - >发布。实际上,应该有中间测试和暂存 b运行ches 来保持当前处于最终用户测试中的版本(这是在功能 b运行ch 单元测试之上),以及为下一个准备好的东西发布。功能 -> 大师 -> 测试 -> 登台 -> 发布。
也就是说,让我们把你的问题画出来。
DeveloperA has created task specific branch say taskA from Master. He has committed multiple times to taskA branch.
A - B [master]
\
C - D [taskA]
Mean while other developerB created his branch taskB from Master and committed multiple changes to the taskB and got taskB merged into Master.
F - G
/ \
A - B - E ----- H [master]
\
C - D [taskA]
DeveloperA will merge Master into taskA branch and further carry on his task, and commits more changes into taskA branch!
F - G
/ \
A - B - E ----- H [master]
\ \
C - D ----- I - J - K [taskA]
Eventually he will get taskA branch merged into Master.
F - G
/ \
A - B - E ----- H --------- L [master]
\ \ /
C - D ----- I - J - K
Now I just want to merge taskA branch to Release branch but as taskB was also merged into taskA branch as DeveloperA merged Master into his branch in step#4, I get taskB branch changes automatically into Release branch! I don't want that.
你有几个选择。您可以 git cherry-pick
仅将 taskA 中的提交提交到 Release 中,避免合并提交。那是 C、D、J 和 K。如果 J 或 K 依赖于 taskB 中的任何内容(或 Master 中不在 Release 中的任何其他内容),您将遇到冲突或(希望如此)测试失败。这是一个混乱的手动过程。
第二选择,而不是功能 b运行ches 使用合并从 Master 获取更新,在 master 之上变基。当 taskA 的开发者决定从 master 更新时,如果他们有 运行 git rebase master
而不是 git merge master
,他们就会有这个。
F - G
/ \
A - B - E ----- H [master]
\ \
C - D C1 - D1 [taskA]
C 和 D 将在 master 的新位置之上重新修补。开发人员将不得不处理任何冲突和测试问题。然后他们可以继续工作并在完成后合并到 master 中。
F - G
/ \
A - B - E ----- H ----------------- L [master]
\ \ /
C - D C1 - D1 - J1 - K1 [taskA]
这种方法使 b运行ches 保持漂亮和干净,没有中间合并。您可以挑选整个 b运行ch 来发布,而不必挑选中间合并。如果 taskA 依赖任何尚未合并到 Release 中的东西,您仍然会遇到冲突和测试失败,但至少隔离功能的过程更简单。
因为您的工作流程需要您将功能块运行集成两次,而且顺序可能不同,所以您肯定会遇到冲突运行。如果必须将功能重新无序地合并到 Release 中,那么将功能合并到 Master 中真的没有意义。
我强烈建议您改变流程,这样您只需将功能 b运行ches 集成到 Master 中一次。 Release 只是 Master 的早期版本。如果功能 b运行ch 尚未准备好发布,不要合并它。这通常是一个很好的开发实践,它提高了开发人员正在使用的代码的质量(即 Master),并且避免了开发人员不得不处理一堆不稳定的半成品功能。
有时您会希望对 Release 应用修补程序,这很好。有时您会想要从 Master 中删除一个功能,这也很好。这些应该是特殊任务,而不是正常工作流程。