Git workflow

工作流的设计是日常开发工作中必须考虑的问题,关乎团队的协作模式,所谓「流」就是保证项目平稳、顺畅地向前迭代,本文介绍三种主要的 Git workflow

Git flow

出现最早,应用最广的一种工作流程,基于”版本发布”的工作流

  • 项目存在两个长期分支:主分支 master 、开发分支 develop;三种短期分支:功能分支 feature、补丁分支 hotfix、预发分支 release
  • master 用于存放对外发布的版本,任何时候在这个分支拿到的,都是稳定的分布版
  • develop 用于日常开发,存放最新的开发版
  • release 分支源于 develop 分支,用于发布之前(即合并到 master 之前)的预发布测试,结束以后必须合入 developmaster 分支
  • 一旦完成开发,三个短期分支就会被合并进 developmaster,然后被删除
  • 优点:清晰可控
  • 缺点:相对复杂,需要同时维护两个长期分支。对于有”持续发布”需求的项目,代码一有变动就需要部署一次,develop 需要频繁地合入 master,导致这两者的差别不大,没必要维护两个长期分支

Github flow

Github flowGit flow 的简化版,专门配合”持续发布”。它是 Github.com 使用的工作流程

  • 它只有一个长期分支,就是 master,使用流程如下:
  • 第一步:根据需求,从 master 拉出新分支,不区分功能分支或补丁分支
  • 第二步:新分支开发完成后,或者需要讨论的时候,就向 master 发起一个 pull request(简称PR
  • 第三步:Pull Request 既是一个通知,让别人注意到你的请求,又是一种对话机制,大家一起评审和讨论你的代码。对话过程中,你还可以不断提交代码
  • 第四步:你的 Pull Request 被接受,合并进 master,重新部署后,原来你拉出来的那个分支就被删除。(先部署再合并也可)
  • 优点:简单,对于”持续发布”的产品是最合适的流程
  • 缺点:假设了合入到 master 就能立刻发布,没有考虑发布窗口,往往需要另外新建一个 production 分支跟踪线上版本

Gitlab flow

Gitlab flowGit flowGithub flow 的综合。它吸取了两者的优点,既有适应不同开发环境的弹性,又有单一主分支的简单和便利

  • 最大原则叫做”上游优先”(upsteam first),即只存在一个主分支 master,它是所有其他分支的”上游”。只有上游分支采纳的代码变化,才能应用到其他分支
  • 对于”持续发布”的项目,它建议在 master 分支以外,再建立不同的环境分支。比如,”开发环境”的分支是 master,”预发环境”的分支是 pre-production,”生产环境”的分支是 production
  • 开发分支是预发分支的”上游”,预发分支又是生产分支的”上游”。代码的变化,必须由”上游”向”下游”发展
  • 对于”版本发布”的项目,建议的做法是每一个稳定版本,都要从 master 分支拉出一个分支,比如 2-3-stable2-4-stable 等等

关于 rebase 和 merge

rebase 的含义是改变当前分支 branch out 的位置,merge 负责功能分支合并到主分支

  • git rebase 其实可以把它理解成是「重新设置基线」,将当前分支重新设置开始点,这样才能知道当前分支和需要比较的分支之间的差异
  • rebase 并没有进行合并操作,只是提取了当前分支的修改,将其复制在了目标分支的最新提交后面
  • 只对尚未推送的本地修改执行 rebase 操作清理历史,从不对已推送至别处的提交执行 rebase 操作,即不要在公共分支使用 rebase