Git协作管理方案

目录:

  1. 本文解决什么问题?
  2. 说明
    1. 仓库级管理和分支级管理
    2. 合并请求
  3. 基础协作管理方案
    1. 总线式协作管理
    2. 流水线式协作管理
    3. 扁平式协作管理
    4. 层级式协作管理
  4. 混合式协作管理方案
    1. 混合方式介绍
    2. 开测预发协作管理方案
    3. 稳妥型开测预发协作管理方案

本文解决什么问题?

你是否有过这样的经历:当思考如何使用 Git 对多人协作开发进行管理时,总感觉有些思路,但不够清晰,甚至实施起来不尽如意,尤其是当协作复杂度升高时,又需要绞尽脑汁地重新设计。

造成这种现象有以下几个原因:

  • Git 的分支机制是为版本管理而设计的,并不是为权限、协作管理而设计的,所以,当用于权限、协作管理时,显得不够直观。
  • 对协作管理没有清晰的认知,总是将协作管理 和 分支流转管理混为一谈,导致经常参合在分支流转规范(如:GitFlow)中一块思考协作管理的问题,大大增加了复杂度。
  • 没有系统、深入地总结、理解过各种协作管理方案。
  • 对 Git 的分布式、仓库、分支没有深入的理解和认识。

本文就系统地总结、抽象了各种协作管理方案而且还可灵活组合,并总结了各个方案的特性。对任意复杂度的协作项目,你都可以根据需要来快速地选择或组合出协作管理方案。

说明

仓库级管理和分支级管理

以下这些协作管理方案不但可以用于仓库级(多个仓库)的管理,也可用于分支级(同一仓库中的多个分支)的管理,所以,为了更加通用,下面的方案并没有具体表明是仓库 还是 分支:

  • 当将方案应用于仓库时:
    • 方案中的每个远程表示就是其对应的远程仓库;
    • 每个人员是在自己的本地仓库上进行操作;
    • 从其他人员的远程上拉取的操作便提 fork 操作。
  • 当将方案应用于分支时:
    • 方案中的每个远程表示就是其对应的远程分支;
    • 每个人员是在自己的本地分支上进行操作;
    • 从其他人员的远程上拉取的操作便提 合并 操作。

合并请求

  • 申请合并的请求,称为 合并请求;在有些环境(如:GitHub)也称为 拉取请求,但称为 合并请求 更为直观,所以下文统称为 合并请求
  • 如果处理 合并请求 是在云端(如:GitHub、GitLab、Gitee)操作的,那么对操作者来说从主观的感知上,以下操作就被隐式地合并成了一个操作:
    1. 拉取被请求合并的变更;
    2. 合并变更;
    3. 将合并后的变更推送到远程;
      这样的话,以下各个协作管理方案图中的那些角色和其对应的远程可以当作一个整体来对待,这样可以使图更易理解。

基础协作管理方案

我称下面这些协作管理方案为基础协作管理方案,之所以称为基础,并不是因为它们简单,相反它们并不简单,而是因为这些方案可以相互组合,形成更复杂的混合方案

总线式协作管理

总线式协作管理

这种协作管理方式中,只有开发者一个角色,没有明确的管理员,大家共享同一个远程。

协作流程:

  1. 开发者都从同一个远程上拉取代码;
  2. 开发者各自进行开发;
  3. 在需要推送到远程前,合并远程上的最新变更;
  4. 推送到远程;
总线式协作步骤

特点:

  • 没有管理角色,只有开发角色。
  • 协作方式简单,适合较简单的小项目。

流水线式协作管理

流水线式协作管理

这种协作管理方式中,有以下角色:

  • 开发者:可以有一个或多个,负责项目的具体开发。开发完成后,将项目交付给测试者进行检测。
  • 测试者:负责检测项目是否有问题。检测完成后,将项目交付给下一个测试者 或 发布者。
  • 发布者:负责项目最终的交付,比如:将项目发布上线等。

其中:

  • 项目的标准位置是在开发者的远程中。开发者拥有完整的项目代码。
  • 项目的交付顺序是流水线式的:开发者 -> 测试者 -> 测试者 -> 发布者
  • 每个人员都有自己的远程。
  • 每个人员的上游都是上一个交付者的远程,即:每个人员都管控着上一个交付者的下游(出口)。

协作流程:

  1. 开发者进行开发,并将产生的变更推送到自己的远程上;
  2. 当开发完毕后,从开发者的远程上向测试者发起 合并请求;
  3. 测试者接受请求并合并开发者的变更,并进行检测;
  4. 测试者测试完成后,将合并后的变更推送到测试者的远程;
  5. 从测试者的远程上向下一个交付者发起 合并请求;
  6. 如果下一个交付者仍是测试者,则跳到 步骤 3;否者继续;
  7. 发布者接受请求并合并测试者的变更;
  8. 发布者将合并后的变更推送到发布者的远程;


    流水线式协作步骤

特点:

  • 流水式的交付流:适合那种具有流水作业的协作管理机制,比如:开发->测试->发布

扁平式协作管理

扁平式协作管理

这种协作管理方式中,有以下角色:

  • 管理员:只有一个管理员,管理员有权决定是否采用开发者的变更。
  • 开发者:可以有一个或多个,负责项目的具体开发。

其中:

  • 项目的标准位置是在管理员的远程中。
  • 每个人员都有自己的远程。
  • 每个人员的上游都是管理员的远程,即:管理员管控着每个人员的上游(入口)。
  • 每个人员的下流都是管理员,即:管理员管控着每个人员的下游(出口)。

协作流程:

  1. 开发者从管理员的远程上拉取代码;
  2. 各个开发者各自开发,并将产生的变更推送到自己的远程上;
  3. 当开发完毕后,把管理员的远程上最新的变更合并进来,并推送到自己的远程上。
  4. 从开发者的远程上向管理员发起 合并请求。
  5. 管理员决定是否接受请求,如果拒绝,则终止流程。
  6. 如果管理员接受请求,则合并开发者请求的变更。
  7. 管理员将合并后的变更推送到管理员的远程。


    扁平式协作步骤

特点:

  • 有一个管理员,可实现项目管控;
    • 管理员管控着所有开发人员的上下游(入口和出口);
  • 适合一般的项目开发;

层级式协作管理

层级式协作管理

这种协作管理方式中,有以下角色:

  • 管理员:只有一个管理员,负责管理组长,管理员有权决定是否采用组长的变更。
  • 组长:根据需要可以有任意多个,负责管理开发者 或 组长(子级组长)。
  • 开发者:可以有一个或多个,负责项目的具体开发。

其中:

  • 项目的标准位置是在管理员的远程中。
  • 每个人员都有自己的远程。
  • 每个人员的上游都是管理员的远程,即:管理员管控着每个人员的上游(入口)。
  • 管理员管控着直接组长的下游(出口)。
  • 组长管控着开发者或子级组长的下游(出口)。

协作流程:

  1. 开发者和组长从管理员的远程上拉取代码;
  2. 各个开发者各自开发,并将产生的变更推送到自己的远程上;
  3. 当开发完毕后,把管理员的远程上最新的变更合并进来,并推送到自己的远程上。
  4. 从开发者的远程上向组长发起 合并请求。
  5. 组长决定是否接受请求,如果拒绝,则终止流程。
  6. 如果组长接受请求,从管理员的远程上拉取最新的变更,并合并开发者请求的变更。
  7. 组长将合并后的变更推送到组长的远程。
  8. 从组长的远程上向管理员发起 合并请求。
  9. 管理员决定是否接受请求,如果拒绝,则终止流程。
  10. 如果管理员接受请求,则合并组长请求的变更。
  11. 管理员将合并后的变更推送到管理员的远程。


    层级式协作步骤

特点:

  • 有一个管理员,可实现项目的最高级别的管控;
    • 管理员管控着组长的上下游(入口和出口);
    • 管理员管控着所有开发者的上游(入口);
  • 有多个组长,组长还可管理子级组长,可实现分而治之,比如:
    • 分担管理员的管理工作;
    • 将项目分成多个模块,每个组长负责一个模块;
    • 组长管理着其成员的下游(出口);
  • 适合大型的项目开发;

混合式协作管理方案

在一个协作管理方案中,可以组合使用以上基础协作管理方案,从而形成一个混合的协作管理方案。

特点:

  • 根据业务需要,随意组合。

混合方式介绍

因为可组合的情况较多,这里就以 组合 层级式协作管理方案扁平式协作管理方案 为例,来展示下如下组合:

混合式协作管理示例

它与 层级式协作管理方案 很像,唯一的变化就是:开发者1开发者2 原来是从 管理员的远程中拉取(或fork)变更,而现在是从 组长1 的远程中拉取(或fork)变更。

它是在 层级式协作管理方案 基础上,将 组长1 及以下所管理的成员使用 扁平式协作管理方案 进行管理。其中:

  • 组长1开发者1开发者2 的管理员;它管控着 开发者1开发者2 的上下游(入口和出口):
    • 开发者1开发者2 都从 组长1(也就是 扁平式协作管理方案 中的管理员) 的远程上拉取(或fork)变更,即:组长1 管控着下面成员的上游(入口)。
    • 开发者1开发者2 都会将合并请求发送给 组长1,即:组长1 管控着下面成员的下游(出口)。

开测预发协作管理方案

开测预发协作管理方案 就是应用于 开发+测试+预发布+发布 场景下的协作管理方案。

这个场景下有以下几个角色:

  • 开发人员:普通开发人员,往往会有多个;开发完毕后交给 开发组长 审查。
  • 开发组长:项目开发的负责人;审查完毕后交给 测试人员 测试。
  • 测试人员:测试人员;测试完毕后;发布到预发布环境;如果没有预发布环境,直接发到发布环境。
  • 预发布人员:预发布环境的负责人;预发布环境运行测试没问题后,转到发布环境;如果没有预发布环境,也可省略此角色。
  • 发布人员:发布(正式)环境的负责人。

这几个角色的交接顺序是:所有开发人员 -> 开发组长 -> 测试人员 -> 预发布人员 -> 发布人员

根据这些角色关系,它们的协作管理方案可以如下设计:

开测预发协作管理

协作流程:

  1. 开发者从开发组长的远程上拉取代码;
  2. 各个开发者各自开发,并将产生的变更推送到自己的远程上;
  3. 当开发完毕后,把开发组长的远程上最新的变更合并进来,并推送到自己的远程上。
  4. 从开发者的远程上向开发组长发起 合并请求。
  5. 开发组长决定是否接受请求,如果拒绝,则终止流程。
  6. 如果组长接受请求,则合并开发者请求的变更。
  7. 组长将合并后的变更推送到组长的远程。
  8. 从组长的远程上向测试者发起 合并请求。
  9. 测试者接受请求并合并开发者的变更,并进行检测;
  10. 测试者测试完成后,将合并后的变更推送到测试者的远程;
  11. 从测试者的远程上向 预发布者 发起 合并请求;
  12. 预发布者接受请求并合并测试者的变更,然后在预发布环境下试运行;
  13. 预发布者将合并后的变更推送到发布者的远程;
  14. 发布者接受请求并合并预发布者的变更;
  15. 发布者将合并后的变更推送到发布者的远程;


    开测预发协作步骤

特点:

  • 有 开发者、开发组长、测试者、预发布者、发布者,符合大多数项目的角色安排。

稳妥型开测预发协作管理方案

开测预发协作管理方案 中,开发组长管理着完全的项目代码,所以它没有上游。但在一些使用 GitFlow规范 的项目中,修复分支需要分支合并到母分支 和 开发分支 中,在实际操作中可能会常常忘记合并到开发分支 或者 有些变体规范中 不要求合并到 开发分支,这就会导致 发布分支 上存在一些没包含在 开发分支 中的代码。

所以,为了保证开发分支中包含 发布分支 上所有的代码,可以在 开测预发协作管理方案 的基础上,让开发组长每次推送到远程前,先合并一下发布者远程上的代码,即:把发布者的远程作为开发组长的上游。如下图:

稳妥型开测预发协作管理

这个场景下的角色和 开测预发协作管理方案 的完全一样,如下:

  • 开发人员:普通开发人员,往往会有多个;开发完毕后交给 开发组长 审查。
  • 开发组长:项目开发的负责人;审查完毕后交给 测试人员 测试。
  • 测试人员:测试人员;测试完毕后;发布到预发布环境;如果没有预发布环境,直接发到发布环境。
  • 预发布人员:预发布环境的负责人;预发布环境运行测试没问题后,转到发布环境;如果没有预发布环境,也可省略此角色。
  • 发布人员:发布(正式)环境的负责人。

这几个角色的交接顺序是:所有开发人员 -> 开发组长 -> 测试人员 -> 预发布人员 -> 发布人员

根据这些角色关系,它们的协作管理方案可以如下设计:

协作流程: 只是在 开测预发协作管理方案 的协作流程 上平加了 第5、第6 这两条

  1. 开发者从开发组长的远程上拉取代码;
  2. 各个开发者各自开发,并将产生的变更推送到自己的远程上;
  3. 当开发完毕后,把开发组长的远程上最新的变更合并进来,并推送到自己的远程上。
  4. 从开发者的远程上向开发组长发起 合并请求。
  5. 👉开发组长合并发布者的远程的新变更。
  6. 👉开发组长将合并后的变更推送到开发组长的远程。
  7. 开发组长决定是否接受请求,如果拒绝,则终止流程。
  8. 如果组长接受请求,则合并开发者请求的变更。
  9. 组长将合并后的变更推送到组长的远程。
  10. 从组长的远程上向测试者发起 合并请求。
  11. 测试者接受请求并合并开发者的变更,并进行检测;
  12. 测试者测试完成后,将合并后的变更推送到测试者的远程;
  13. 从测试者的远程上向 预发布者 发起 合并请求;
  14. 预发布者接受请求并合并测试者的变更,然后在预发布环境下试运行;
  15. 预发布者将合并后的变更推送到发布者的远程;
  16. 发布者接受请求并合并预发布者的变更;
  17. 发布者将合并后的变更推送到发布者的远程;


    稳妥型开测预发协作步骤

特点:

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

推荐阅读更多精彩内容