Git规范总览:协作管理、分支流转、提交

目录:

  1. 规范的种类
  2. 仓库层级结构规范
    1. 访问权限
  3. 协作管理规范
  4. 分支流转规范
  5. 分支命名规范
  6. 合并规范
  7. 合并请求规范
  8. 标签命名规范
  9. 提交规范

规范的种类

在大多数人的脑海中 Git规范 = Git Flow 或者 Git规范 = Git Flow + 提交规范
这大概是因为从来没有人系统、深入地理解和总结过 Git 规范相关的所有东西。

为了以后在 Git规范 方面有更清晰的表达,我这里对 Git规范 相关的概念进行重新定义下。

我把 Git 相关的规范分为了以下几类(可能还不全,日后会慢慢完善):

  • 仓库层级结构规范:定义了仓库的分组(层级)结构及访问权限。
  • 协作管理规范:定义了多人协作时的管理策略。
  • 分支流转规范:定义了分支的来源、去向、合并、删除等相关的规则。
  • 合并规范:定义了合并操作的具体规则。
  • 合并请求规范:定义了合并请求的步骤、信息等相关规则。
  • 提交信息内容规范(简称提交规范):定义了提交文件的结构、格式、信息类型等规则。
  • 分支命名规范:定义了分支名字结构、格式等相关规则。
  • 标签命名规范:定义了标签名字和信息结构、格式、信息类型等相关规则。

仓库层级结构规范

详情请看仓库层级结构规范

仓库层级结构图
  • 产品(组):因为产品之间的关联性较强,所以后端仓库不一定是按产品来划分的,但前端大多数是按产品来划分的,所以,针对产品,需要将 前端仓库 和 后端仓库分开;
    • 后端(组)
      • 服务1(仓库)
      • 服务2(仓库)
    • 前端(组)
      • 产品1(仓库)
      • 产品2(仓库)
  • 项目(组):因为项目之间的关联性较弱,往往有各个的前端仓库和后端仓库,所以默认情况可以将前端仓库 和 后端仓库 放在一起;如果某个项目只有前端仓库,没有对应的后端仓库,那就不必为项目创建组。
    • 项目1(组)
      • 前端(仓库)
      • 后端(仓库)
    • 项目2(仓库):由于没有后端,所以 项目2 直接作为前端仓库来创建,不必再创建成组
  • 前端工具库(组):用于存放封装的库、工具等;因为这些工具大部分是通用的,服务于开发人员的,所以本组的默认访问权限可设为 内部 internal,特殊的组或仓库除外;
    • 工具库1(仓库)
    • 工具库2(仓库)
  • 后端工具库(组):用于存放封装的库、工具等;因为这些工具大部分是通用的,服务于开发人员的,所以本组的默认访问权限可设为 内部 internal,特殊的组或仓库除外;
    • 工具库1(仓库)
    • 工具库2(仓库)
  • 运维(组):存放一些基础设施的项目,比如:监控系统、日志系统、脚本架工具、运维脚本等。
    • 工具1(组)
      • 前端(仓库)
      • 后端(仓库)
    • 工具2(仓库):单独的工具,不分前后端,如:脚本等;
仓库目录结构图

访问权限

一般情况,仓库或组的公开性有以下几种

  • 私有 private:只有仓库或组的成员才可以访问;
  • 内部 internal:只有内部用户(登录的用户)才能访问;
  • 公共 public:公开的,所以有人员(登录的 和 未登录的)都可以访问;
  • 所有的顶层组:均为内部可见,这样可以让大家知道都有哪些分类,以至于在创建项目或组时在地方可以创建;
  • 对于顶层组内部的组或仓库:
    • 工具库内部的组或仓库(内部 internal):包括前端工具库 和 后端工具库
      • 因为这些工具大部分是通用的,服务于开发人员的,所以本组内部的组或仓库的默认访问权限可设为 内部 internal,特殊的组或仓库除外;
      • 如果因些工具库的源码不方便暴露,但文档需要大家都能访问,可将其文档单独存放在一个仓库中,分别为源码 和 文档设置不同的访问权限;
    • 产品、项目内部的组或仓库 (私有 private):由于 产品 和 项目 是公司重要资产,并且只需要相关人员对于源码了解,所以这些组内部的组或仓库的默认访问权限应设置为 私有 private
    • 运维内部的组或仓库(私有 private):运维相关的工具通常只有运维人员来维护,所以此组内部的组或仓库的默认访问权限应设为 私有 private

一般情况下,仓库或组的成员角色有以下几种:

  • 管理员:拥有仓库完整的权限
  • 开发者:拥有提前、推送、拉取代码的权限
  • 浏览者:只能查看仓库,不能提交、推送仓库;
  • 对于公司的职员:
    • 前端负责人拥有所有前端仓库的访问权限;
    • 后端负责人拥有所有后端仓库的访问权限;
    • 开发人员只有其所负责项目的开发者角色;
    • 项目负责人拥有其所负责项目的管理员角色;

协作管理规范

我在 Git协作管理方案 中介绍多种 Git协作管理方案,不同方案有不同的适用场景,具体使用哪种方案,因项目和团队结构而定,但对于大多数小中型项目和团队而言,都比较适用下面2种方案:

如果这两种方案不太理想,您可以在 Git协作管理方案 这篇文章中找到你想要的答案。

Git协作管理方案 这篇文章中讲的比较抽象和通用,下面就针对 使用分支管理环境 且 支持合并请求 的项目仓库 来具化地描述下 开测预发协作管理方案稳妥型开测预发协作管理方案 的协作流程:

约定下各角色所管理的分支:

  • 开发组长:开发分支
  • 测试者:测试分支
  • 预发布者:预发布分支
  • 发布者:发布分支

当需要往这些分支上合并代码时,都需要通过 合并请求 向对应的分支负责人申请。

因为 稳妥型开测预发协作管理方案 只是在 开测预发协作管理方案 的协作流程 上平加了 第6条,这是为了确保 开发分支 上包含了 发布分支 的全部代码,所以可以将 开测预发协作管理方案稳妥型开测预发协作管理方案 的协作流程统一描述,如下:

协作流程:

  1. 开发者基于 开发分支 创建 功能分支
  2. 向开发组长发起 合并请求,并在标题上添加前缀 WIP 标识;
  3. 开发者在 功能分支 上做开发;
  4. 开发组长审查代码,对有问题的地方进行批注,并要求开发者改正;
  5. 当开发完毕后,相关人员在 功能分支 上进行验收;
  6. 验收通过后,把 开发分支 上最新的变更合并进来;
  7. 开发者自测;
  8. 自测试没问题后,去除合并请求的WIP前缀,并通知开发组长处理请求;
  9. 👉(稳妥型方案特有的步骤)开发组长将 发布分支 上的新变更 合并到 开发分支上
  10. 开发组长确定没问题后,同意 合并请求,并执行合并操作;
  11. 开发组长向测试者发起 合并请求;
  12. 测试者同意请求并执行合并操作;
  13. 测试者进行测试;
  14. 测试者测试通过后,向 预发布者 发起 合并请求;
  15. 预发布者接受请求并执行合并操作;
  16. 预发布者在预发布环境测试;
  17. 预发布环境测试通过后,预发布者向 发布者 发起 合并请求;
  18. 发布者接受请求并执行合并操作;
开测预发协作步骤-简化版

分支流转规范

目前有以下几种分支流转规范(关于前三者之间的区别,可看 Git 工作流程 这篇文章):

  • Git Flow:适合基于 版本发布 的项目,即:需要一段时间以后才会产出一个新版本的项目。
  • GitHub Flow:适合 持续发布 的项目。
  • GitLab Flow:持续发布 和 版本发布 的项目都适合,且支持多种环境。
  • Git并行工作流程规范: 适合经常有很多并行功能开发的项目。

个人比较推荐 GitLab FlowGit并行工作流程规范

分支命名规范

  • 使用 / 作为分隔符来表达层次关系;如 模块/功能
    • 相比 中划线 -、下划线 _ 等其它的分隔符来说,/ 具有如下优势:
      • 与路径分隔符一致,从形式上更能表达出层级结构。
      • 很多 git 工具会将 / 解析分隔符并将分支名作为路径来解析,然后以文件树的形式展示分支,这样可以更好的组织分支。
  • 名称中应避免冗余信息;如 模块A/模块A_功能A 中的 模块A_功能A 中的 模块A 就是冗余信息。

合并规范

  • 开发分支只能合并当前迭代版本的功能;

合并请求规范

  • 对于需要代码审查的分支,如果其直接下游分支是明确的,则该分支到直接下游分支的合并请求可以提前创建(比如在创建该分支时就创建到直接下游分支的合并请求),但此时合并请求的标题上应加上前缀 WIP (Work in progress 之意)标识,来表示该分支仍在开发中,当前状态不可合并;在真正开完成时,再移除前缀 WIP 标识,以表示当前分支处于可合并的状态;这样设计的目的是:
    • 可让合并请求的处理人员提前知道将来都有哪些分支需要合并;
    • 合并请求的相关处理人员也可以提前做一些工作,比如:代码审查 等,而不用等到开完成时统一检查;在开发完成时再审查,往往审查的代码量太多,导致审查不完成 或 不仔细;
    • 分支开发人员 和 合并请求处理人员可以在分支的开发期间连续互动(通过评审、审查等),以便及时发现问题、改正问题;
  • 测试分支预发布分支发布分支 发起的合并请求中一定要指定 里程碑标签
  • 对于修复分支,一定要等到修复分支到母分支的合并请求合并完成之后,再继续执行合并到开发分支的后续操作,否则容易造成将开发分支上的代码合并到修复分支的母分支上;
  • 合并请求合并完成后,要及时删除源分支;

标签命名规范

采用 语义化版本 规范来命名标签。标签的格式为:

<主版本号>.<次版本号>.<修订号>[.<测试版本号>]
  • 主版本号:当你做了不兼容的 API 修改,
  • 次版本号:当你做了向下兼容的功能性新增,
  • 修订号:当你做了向下兼容的问题修正。
  • 测试版本号: 当需要标明测试版本时可以在后面追加测试版本号,测试版本号可以使用测试轮数来指代。
  • 先行版本号及版本编译信息可以加到 <主版本号>.<次版本号>.<修订号> 的后面,作为延伸。

提交规范

详见 提交规范

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,884评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,347评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,435评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,509评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,611评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,837评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,987评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,730评论 0 267
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,194评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,525评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,664评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,334评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,944评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,764评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,997评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,389评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,554评论 2 349

推荐阅读更多精彩内容