git 分支模型

152 阅读4分钟

master 分支

master 分支为最稳定的分支,随时都是一个预备生产状态,因此不允许(可配置)直接向 master 分支 push 代码。理论上只能在 hotfix 分支release 分支达到稳定待发布的状态后才能将其 merge 进 master,然后标记一个版本号。查看 master 的提交历史,应该看到的是一个个版本 tag。 向 master merge 的方式只能通过 Pull Request

dev 分支

与 master 分支并行的另一个分支,称为开发分支。我们的 task 分支基本都会合并到 dev 分支。同 master 一样,不能直接 push 代码到 dev 分支,需要通过 PR 的方式请求合并。

master 分支和 dev 分支都是关键分支,长期存在,而 release 分支、hotfix 分支、task 分支等辅助性分支只有有限的生命周期。

release 分支

命名规则为 release/版本号,当 dev 分支开发到一定程度后,需要进行发版测试,就从 dev 分支创建一个 release 分支并更新版本号。 这个 release 分支可能会存在一段时间,直到该发行版到达它的预定目标(测试通过)。在此期间,bug 的修复提交到该分支上(而不是提交到 dev 分支上)。在这里严格禁止增加大的新 features,他们必须合并到 dev 分支上,然后等待下一次大的发行版。

当 release 分支准备好成为一个真正的发行版的时候,需要将其 merge 到 master 并打上 tag同样需要 merge 到 dev 以同步在 release 上修复的 bug。此外,如果不 merge 回 dev,下一次 release 版本合并到 master 时有可能冲突,如下: dev 分支在 B2 节点时创建了 release-v0.0.2 分支,将 package.json 的版本号由 0.0.1 修改为了 0.0.2(C 节点),完结后将 release-v0.0.2 merge 回了 master(D 节点),而没有 merge 回 dev。当 dev 分支前进到 B3 节点时创建了 release-v0.0.3 分支并将 package.json 的版本号 0.0.1 修改为了 0.0.3(E 节点),release-v0.0.3 完结后将其合并到 master。可以预想到由于 release-v0.0.3 并不包含 master 的所有 commit(D),而它们又修改了相同的内容,因此会出现冲突,此时只能 merge release-v0.0.2 到 dev,然后 release-v0.0.3 rebase dev(解冲突),再重新合并到 master。

                 E    release-v0.0.3
                /
      B1==>B2==>B3    dev
      /     \
     /       C        release-v0.0.2
    /         \
A==>B=========>D      master

hotfix 分支

即热修复分支,当线上出现 bug 时,需要创建 hotfix 分支,命名规则为hotfix/task号,hotfix 分支可以基于 master 分支上对应线上版本的 tag 创建,也可以基于对应的 release 分支创建,创建后更新版本,待 bug 修复后 merge 回 master(需打 tag)和 dev

task 分支

task 分支可以认为是为了开发某个功能而创建的分支,命名规则为task/task号,task 分支基于 dev 分支创建,task 分支最终都应合并到 dev 分支上。如下: task 分支基于 dev 分支的 B commit 节点创建,又依次提交了 commit B1、B2、B3 后功能完成了,可以将 task 分支合并到 dev 了,但此时由于其他开发人员的提交 dev 分支已经到了 D 节点:

      B1==>B2==>B3  task
      /
  A==>B==>C==>D     dev

这时应该先进行rebase操作,再进行合并。

//在task分支上
$ git rebase dev
                B1'==>B2'==>B3'  task
                /
  A==>B==>C==>D                  dev

rebase 后就可以进行合并了,合并时应该使用--no-f的参数,该参数会将 task 分支所有提交合并到一起,与 dev 分支合并时产生一个新的提交,这能够保留 task 分支的提交信息,当出问题时更容易追溯是在做哪一个功能时导致的错误:

//git merge  --no-f        |   //git merge
      B1==>B2==>B3    task |
      /          \         |
  A==>B==>C==>D==>B'  dev  | A==>B==>C==>D==>B1==>B2==>B3   dev/task

Pull Requset 示例

步骤如下:

  • 基于 dev 分支创建 task 分支

  • 推送 task 分支到远程仓库

  • 到仓库管理界面点击创建合并请求

    无需 fork 仓库(团队内部成员而言),直接在当前仓库提交即可。

  • 选择要 PR 的分支并点击创建

    需要注意的是”合并到“是选择 dev 分支,”拉取从“选择当前要请求合并的 task 分支。

  • 撰写 PR 标题和内容并点击创建合并请求

    PR 的标题和内容需要遵循一定的格式

  • 等待仓库 owner 通过 PR

    owner 选择变基合并,拷贝 commit 信息。

PR 内容格式要求

标题

格式如下: 需要注意的是 task 与 subject 间的空格是必须要有的(否则自动生成 changelog 的工具无法识别)。

<type><task>: <subject>
例:
docs(T23321): add docs
  • type

    其中 type 为以下固定的几种类型,用于说明 commit 的类别。

    //type
    feat:新功能(feature)
    fix:修补 bug
    docs:文档(documentation)
    style: 格式(不影响代码运行的变动)
    refactor:重构(即不是新增功能,也不是修改 bug 的代码变动)
    test:增加测试
    chore:构建过程或辅助工具的变动
    
  • subject

    subject 是 commit 目的的简短描述。

  • task

    task 部分是本次提交对应的 task 号。

内容

内容部分是对本次 commit 的详细描述,分条叙述。

1. 添加git-flow.md
2. 添加case-schema.md