在Git中分支和合并最佳实践

时间:2014-07-05 01:54:45

标签: git git-flow

我们有一个4人的开发团队,最近搬到了Git。我们希望通过分支和合并来学习有关工作流程的最佳实践。

我们正在使用Git Flow的轻量级版本。我们有一个dev,staging和一个master分支,它们彼此都是线性的。

  • staging从master
  • 分支
  • dev从分段分支

最重要的是,我们使用功能和修补程序分支来处理新功能并修复错误。

我有以下问题:

  1. 我们应该从dev或master分支功能分支吗?
  2. 当功能分支准备就绪时,我们是应该将功能分支合并到dev中,然后将dev合并到staging中,还是将功能分支合并到staging中,然后将功能分支合并到master中?
  3. 我认为我们应该从master分支并合并功能分支,因为dev中可能存在一些我们可能不希望合并到staging和master的东西。

    你有什么看法?什么是最佳做法?

3 个答案:

答案 0 :(得分:24)

这总取决于您希望如何工作以及团队协议。那就是说。

  1. 功能从dev分支开始进入自己的分支。在主分支中,您应该只分支修补程序,因为主分支应始终是您软件的稳定版本。
  2. 功能分支完成后,它应该合并到dev ,然后在某些时候你应该将你的下一个版本从dev(包括一些功能)分支到一个 new' release / *'分支,一旦稳定并经过充分测试,将合并为主。
  3. Atlassian page you have a very nice explanation of this workflow

    使用这种工作流程的整个想法是拥有一个稳定的版本分支,如果你需要足够的信心它仍然可以稳定并且没有任何新的功能或重构会滑入,你可以立即工作并修复任何错误没有注意到。

    还要为每个新功能提供隔离和自由,这些新功能将在其自己的分支中开发,而不会产生其他功能的噪音。 最后,您将把您的功能合并到您的dev分支中,然后从那里合并到下一个版本的主分支中。

    我唯一要为你推荐的是学习如何在每次将另一个功能合并到dev中时在dev分支之上重新设置功能分支,以避免在合并时解决冲突,但是在功能分支上单独进行你知道你的变化是什么。

    It also looks like this question was asked before

答案 1 :(得分:21)

虽然Git Flow是一个出色的分支模型,但您提出的问题是一个更大问题的症状:对于在消费者网络产品上工作的小团队来说,Git Flow太重了(我假设您正在工作在消费者网络产品上,如果您正在编写核电站控制室,请随意忽略)。

我想鼓励您考虑使用极其简单的分支模型进行持续部署(CD):

Master -> Branch

现在很容易设置CD:

  1. 使用TravisCodeShip,Jenkins或类似系统在代码库的每个分支上推送的每个提交上运行完整的构建和测试套件
  2. 将Travis / Codeship / Jenkins设置为生产每个提交通过测试的提交。
  3. 为每个新功能从master创建一个新分支。
  4. 编写新功能并在分支上进行测试。
  5. 将功能分支合并到master,并观看它是否正常运行。
  6. 对它有很多共同的反对意见,所有这些都可归纳为"但如果我介绍一个错误怎么办?!"。答案是"你将解决它!"。如果您编写测试,如果您监视生产站点,如果您进行代码审查,如果您进行结对编程,如果您使用功能标记,并且如果您保持小功能,那么您从CD获得的好处将超过偶尔的问题任何一天。

    我鼓励你试试。它会释放你的思想专注于真正重要的事情:建立一个伟大的产品!如果你不相信我,请看看excellent presentation from Github

答案 2 :(得分:8)

我们确定了一个名为Git Flow的工作流程,但我们不是从dev分支功能,而是从当前版本中分支它们。这使我们能够以不同的速度处理单独的问题。如果他们在质量保证方面取得成功,他们会进入发布阶段。

关于分支和部署:

  • dev 分支会自动部署到测试服务器。
  • 当前版本分支自动部署到登台服务器。
  • master 分支由release-master手动部署到实时服务器。

工作流程如下:

  1. 在每个版本/ sprint的开头,从 master 创建一个发布分支,例如: 发布/ 2015年 - 可能
  2. release / 2015-may
  3. 创建 dev 分支
  4. 使用新功能,从发布分支并将其命名为/ ISSUE_NUMBER
  5. 处理您的功能。
  6. 当它准备好进行测试时,将其合并到开发中。
  7. 如果已被接受,请将其合并到当前版本分支中。
  8. 如果不接受,请转到步骤4.
  9. 发布准备就绪后,将其合并到 master
  10. 在部署发布版本并发现严重错误之后,我们从主服务器分支修补程序分支(例如,修补程序/ ISSUE_NUMBER),将其合并回主服务器并再次部署。