避免将 master 合并到 development 分支

Avoid merging master into development branch

我一直在监控从每个冲刺开始的两个 b运行ches - ReleaseMaster

Master b运行ch 来自开发人员创建新的 b运行ch(特定于任务),实施他们的更改,并创建合并到 Master

Release b运行ch 是 sprint 特定的,始终可以提交给生产。我们只将提交给 Master 并由 QA 验证的 b运行ches 合并到 Release b运行ch 中。

这种方法最适合我们,因为我们定期提交 Release 特定功能的实现和验证,因此我们确切地知道下一个版本中会发生什么。

一切顺利,直到我 运行 进入以下问题;

  1. DeveloperA 已创建任务特定 b运行ch say taskA from Master.
  2. 他多次提交 taskA b运行ch.
  3. 同时其他开发人员 B 从 Master 创建了他的 b运行ch taskB 并对 taskB 进行了多项更改并将 taskB 合并到 Master.
  4. DeveloperA 将合并 MastertaskA b运行ch 并进一步执行他的任务,并将更多更改提交到 taskA b运行ch !
  5. 最终他会把taskA b运行ch合并成Master.

现在我只想合并 taskA b运行ch 到 Release b运行ch 但因为 taskB 也被合并到 taskA b运行ch 因为 DeveloperA 在步骤#4 中将 Master 合并到他的 b运行ch 中,我得到 taskB b运行ch 自动更改为 Releaseb运行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 中删除一个功能,这也很好。这些应该是特殊任务,而不是正常工作流程。