草庐IT

团队Git规范文档(操作规范及提交规范)

Sophie_U 2023-07-17 原文

文章目录

前言

在多人协作 的项目开发中,指定合理的或者部分强制的措施可以起到规范团队提升团队协作效率的作用。遵循良好的规范能让团队协作更加融洽,更能体现团队合作的巨 大优势,发挥出团队最强的能力。

一、操作规范

1.1 分支使用

当团队协同工作在同一个仓库里的人员较少,且并行开发的功能情况少时,可以只保留 master 和develop分支。当团队开发规模到5-10人或有大量并行的功能开发需求时,可新增feature分支开发的模式。

  • master:稳定版本,主分支,一般由develop及hotfix分支合并,用于部署生产环境的分支。
  • develop: 最新版本,开发分支,始终保持最新完成的代码,feature分支都是基于develop创建的
  • feature: 实现新特性,特性分支,以feature/xxx 命名
  • release: 发布新版本,发布分支
  • hotfix: 热修复分支,修复线上bug

操作规范

  1. 每开发一个新功能,创建一个feature分支,多人在此分支上开发;
  2. 提测时,将master分支和需要提油的分支汇总到一个release分支,发布测试环境
  3. 发现bug时,在feature分支上debug后,再次回到2
  4. 发布生产环境后,将release分支合并到master分支并删除release分支;

1.2 角色说明

  • owner: Git管理员(拥有者)
  • Master:开发主管(管理员)
  • Developer:开发人员(开发者)
  • Reporter:测试人员(报告者)
  • Guset:其他人员(观察者)

1.3 项目周期中的操作流程

1、创建新项目

开发主管提交代码初始版本到master,并推送至gitlab系统;开发主管在gitlab系统中设置master分支为保护分支。Protected分支不允许developer角色推送。

2、进行项目开发

开发主管在master上创建develop分支,并推送。 master分支与develop分支一样,有且仅有一个。对非并行项目可直接在develop上开发。对于多人并行开发项目,使用feature分支开发。但develop和feature开发方式不要同时使用。

3、开发新特性

每个新需求创建一个feature分支;命名: feature/XXX, 可以是需求对应版本号,也可以是特性关键字。

4、发布测试环境(release)

开发主管创建release分支,将所有要发布的分支逐个合并到release分支下(包括feature分支,多个release合并后的master分支)。 命名: release/XXX 。发布后,可删除本次已合并的所有feature分支,并通知测试。

5、修复待发布版本中的bug

开发者基于待发布的release分支,修复测试提出的bug并提交。当测试完成后,合并release分支到master和develop分支,此时master为最新代码,用作上线。

6、发布正式环境

  • 开发主管将修复后的release分支与master合并后(合到release),打包发布生产环境。
  • 确认发布成功后,并线上验收通过后,将release分支合并到master分支
  • 在master上创建标签,命名规则:tag-日期-新特性和版本号,如:tag-20221101-商城v1.0.0 版本根据需求添加,作为发版里程碑标记
  • 删除对应release分支

7、修复线上Bug(hotfix分支)

线上不同版本出现 bug时,开发主管需要完成以下任务:

  • 从master分支某个tag上创建一个hotfix分支。hotfix/xxx
  • 开发人员修复bug,提交到测试环境验收
  • 再次发布正式环境流程后,将hotfix分支合并到master,并创建标签。命名同上。
  • 删除hotfix分支

二、提交规范

提交规范这里主要指提交的commit message规范。以下是简要说明

2.1 Commit Message

基本语法: <type>[scope]:<subject> <body>

  • type: 提交的commit类型,如feat, fix, docs
  • scope: 本次commit的影响范围,可不写
  • subject: 简要描述
  • body: 详细描述

2.2 Type类型

  • feat: 添加新特性
  • fix: 修复bug
  • docs: 仅仅修改了文档
  • style: 仅仅修改了空格、格式缩进、都好等等,不改变代码逻辑
  • refactor: 代码重构,没有加新功能或者修复bug
  • perf:增加代码进行性能测试 或性能优化
  • test: 增加测试用例
  • chore: 改变构建流程、或者增加依赖库、工具等
  • merge: 代码合并
  • revert: 回滚

2.3 相关工具

对于提交规范,有辅助性工具 Commitizen,也有强制检查工具Husky。这里主要介绍Commitzen(因为简单)
在使用commitzen进行代码提交时(git cz命令替代git commit ),它会提示你填写必需的提交字段

# 1、全局安全commitzen
npm i -g commitzen

# 2、项目中安装插件
npm i cz-customizable -D

# 3、package.json中添加配置
"config" :{
	"commitizen": {
     "path": "node_modules/cz-customizable"
   }
}

# 4、根目录添加配置文件.cz-config.js

  • .cz.config.js
module.exports = {
  // 可选类型
  types: [
    { value: 'feat', name: 'feat:     新功能' },
    { value: 'fix', name: 'fix:      修复' },
    { value: 'docs', name: 'docs:     文档变更' },
    { value: 'style', name: 'style:    代码格式(不影响代码运行的变动)' },
    {
      value: 'refactor',
      name: 'refactor: 重构(既不是增加feature,也不是修复bug)'
    },
    { value: 'perf', name: 'perf:     性能优化' },
    { value: 'test', name: 'test:     增加测试' },
    { value: 'chore', name: 'chore:    构建过程或辅助工具的变动' },
    { value: 'revert', name: 'revert:   回退' },
    { value: 'build', name: 'build:    打包' }
  ],
  // 消息步骤
  messages: {
    type: '请选择提交类型:',
    customScope: '请输入修改范围(可选):',
    subject: '请简要描述提交(必填):',
    body: '请输入详细描述(可选):',
    footer: '请输入要关闭的issue(可选):',
    confirmCommit: '确认使用以上信息提交?(y/n/e/h)'
  },
  // 跳过问题
  skipQuestions: ['body', 'footer']
  subjectLimit: 72  // subject文字长度默认是72
}

最后,在提交时,使用git cz代替git commit -m

有关团队Git规范文档(操作规范及提交规范)的更多相关文章

  1. Matlab imread()读到了什么 (浅显 当复习文档了) - 2

    matlab打开matlab,用最简单的imread方法读取一个图像clcclearimg_h=imread('hua.jpg');返回一个数组(矩阵),往往是a*b*cunit8类型解释一下这个三维数组的意思,行数、数和层数,unit8:指数据类型,无符号八位整形,可理解为0~2^8的数三个层数分别代表RGB三个通道图像rgb最常用的是24-位实现方法,即RGB每个通道有256色阶(2^8)。基于这样的24-位RGB模型的色彩空间可以表现256×256×256≈1670万色当imshow传入了一个二维数组,它将以灰度方式绘制;可以把图像拆分为rgb三层,可以以灰度的方式观察它figure(1

  2. git使用常见问题(提交代码,合并冲突) - 2

    文章目录git常用命令(简介,详细参数往下看)Git提交代码步骤gitpullgitstatusgitaddgitcommitgitpushgit代码冲突合并问题方法一:放弃本地代码方法二:合并代码常用命令以及详细参数gitadd将文件添加到仓库:gitdiff比较文件异同gitlog查看历史记录gitreset代码回滚版本库相关操作远程仓库相关操作分支相关操作创建分支查看分支:gitbranch合并分支:gitmerge删除分支:gitbranch-ddev查看分支合并图:gitlog–graph–pretty=oneline–abbrev-commit撤消某次提交git用户名密码相关配置g

  3. ruby - 如何使用 Selenium Webdriver 根据 div 的内容执行操作? - 2

    我有一个使用SeleniumWebdriver和Nokogiri的Ruby应用程序。我想选择一个类,然后对于那个类对应的每个div,我想根据div的内容执行一个Action。例如,我正在解析以下页面:https://www.google.com/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=puppies这是一个搜索结果页面,我正在寻找描述中包含“Adoption”一词的第一个结果。因此机器人应该寻找带有className:"result"的div,对于每个检查它的.descriptiondiv是否包含单词“adoption

  4. ruby-on-rails - 如何处理 Grape 中特定操作的过滤器之前? - 2

    我正在我的Rails项目中安装Grape以构建RESTfulAPI。现在一些端点的操作需要身份验证,而另一些则不需要身份验证。例如,我有users端点,看起来像这样:moduleBackendmoduleV1classUsers现在如您所见,除了password/forget之外的所有操作都需要用户登录/验证。创建一个新的端点也没有意义,比如passwords并且只是删除password/forget从逻辑上讲,这个端点应该与用户资源。问题是Grapebefore过滤器没有像except,only这样的选项,我可以在其中说对某些操作应用过滤器。您通常如何干净利落地处理这种情况?

  5. ruby-on-rails - 在 Ruby on Rails 中发送响应之前如何等待多个异步操作完成? - 2

    在我做的一些网络开发中,我有多个操作开始,比如对外部API的GET请求,我希望它们同时开始,因为一个不依赖另一个的结果。我希望事情能够在后台运行。我找到了concurrent-rubylibrary这似乎运作良好。通过将其混合到您创建的类中,该类的方法具有在后台线程上运行的异步版本。这导致我编写如下代码,其中FirstAsyncWorker和SecondAsyncWorker是我编写的类,我在其中混合了Concurrent::Async模块,并编写了一个名为“work”的方法来发送HTTP请求:defindexop1_result=FirstAsyncWorker.new.async.

  6. ruby - 在 Ruby 中是否有一种惯用的方法来操作 2 个数组? - 2

    a=[3,4,7,8,3]b=[5,3,6,8,3]假设数组长度相同,是否有办法使用each或其他一些惯用方法从两个数组的每个元素中获取结果?不使用计数器?例如获取每个元素的乘积:[15,12,42,64,9](0..a.count-1).eachdo|i|太丑了...ruby1.9.3 最佳答案 使用Array.zip怎么样?:>>a=[3,4,7,8,3]=>[3,4,7,8,3]>>b=[5,3,6,8,3]=>[5,3,6,8,3]>>c=[]=>[]>>a.zip(b)do|i,j|c[[3,5],[4,3],[7,6],

  7. ruby - gem 规范失败 - 2

    我正在为毕业设计开发GEM,TravisCI构建不断失败。这是我在Travis上的链接:https://travis-ci.org/ricardobond/perpetuus/builds/8709218构建错误是:$bundleexecrakerakeaborted!Don'tknowhowtobuildtask'default'/home/travis/.rvm/gems/ruby-1.9.3-p448/bin/ruby_noexec_wrapper:14:in`eval'/home/travis/.rvm/gems/ruby-1.9.3-p448/bin/ruby_noexec_

  8. ruby-on-rails - 如何让 Rails View 返回其关联的操作名称? - 2

    我有一个非常简单的Controller来管理我的Rails应用程序中的静态页面:classPagesController我怎样才能让View模板返回它自己的名字,这样我就可以做这样的事情:#pricing.html.erb#-->"Pricing"感谢您的帮助。 最佳答案 4.3RoutingParametersTheparamshashwillalwayscontainthe:controllerand:actionkeys,butyoushouldusethemethodscontroller_nameandaction_nam

  9. ruby - Dropbox 类似 git 的服务——没有 rsync 和 inotify - 2

    关于如何使用git设置类似Dropbox的服务,您有什么建议吗?您认为git是解决此问题的合适工具吗?我在考虑使用git+rush解决方案,你觉得怎么样? 最佳答案 检查这个开源项目:https://github.com/hbons/SparkleShare来自项目的自述文件:Howdoesitwork?SparkleSharecreatesaspecialfolderonyourcomputer.Youcanaddremotelyhostedfolders(or"projects")tothisfolder.Theseprojec

  10. ruby - 混帐 & ruby : How can I unset the GIT_DIR variable from inside a ruby script? - 2

    我编写了一个非常简单的“部署”脚本,作为我的裸git存储库中的post-updateHook运行。变量如下livedomain=~/mydomain.comstagingdomain=~/stage.mydomain.comgitrepolocation=~/git.mydomain.com/thisrepo.git(bare)core=~/git.mydomain.com/thisrepo.gitcore==addedremoteintoeachlive&stagegitslive和stage都初始化了gitrepos(非裸),我已经将我的裸仓库作为远程添加到它们中的每一个(名为co

随机推荐