GitFlow + Gitlab 工作流及规范

GitFlow + Gitlab 工作流及规范


一、 git 命令及配置

1.Git ssh 与 gitLab配置

cd ~/.ssh 检查有没有创建

进行创建ssh命令执行:ssh-keygen -t rsa -C 'xxx@qq.com'

查看你生成的密钥 cat ~/.ssh/id_rsa.pub

登录你的gitlab/github/码云等把公钥复制过去

验证下配置的Key 是不是可以正常工作;ssh -T gitee@gitee.com

2.Git 命令查询

2.1 创建版本库

git clone <url>        #创建远程版本

git init                        #初始化本地版本库

2.2 修改和提交

git status # 查看状态

git diff # 查看变更内容

git add . #跟踪所有改动过的文件

git add <file>   #跟踪指定的文件

git mv <old> <new> #文件改名

git rm <file>   #删除文件

git rm --cached <file> #停止跟踪文件但不删除

git comit -m 'commit message' #提交所有更新过的文件

git commit --amend   #修改最后一次提交

2.3 查看提交历史

git log #查看提交历史

git log -p <file> #查看指定文件的提交历史

git blame <file>       #以列表方式查看指定文件的提交历史

2.4 撤消

git reset --hard HEAD  #撤消工作目录中所有未提交文件的修改内容

git checkout HEAD <file> #撤消指定的未提交文件的修改内容

git revert <commit>   # 撤消指定的提交

2.5 分支与标签

git branch #显示所有本地分支

git checkout <branch/tag> # 切换到指定分支或标签

git branch <new-branch>  #创建新分支

git branch -d     #删除本地分支

git tag       #列出本地所有标签

git tag <tag-name>   #基于最新提交创建标签

git tag -d <tag-name>     #删除标签

2.6 合并与衍合

git merge <branch>          #合并指定分支到当前分支

git rebase <branch>        #衍合指定分支到当前分支

2.7 远程操作

git remote -v #查看远程版本库信息

git remote show <remote> #查看指定远程版本库信息

git remote add <remote> <url> #添加远程版本库

git fetch <remote> #从远程库获取代码

git pull <remote> <branch> #下载代码及快速合并

git push <remote> <branch> #上传代码及快速合并

git push <remote> :<branch/tag-name>  # 删除远程分支或标签

git push --tags #上传所有标签

2.8 实现创建分支过程操作

git checkout master #切换到master分支

git checkout -b dev #从当前分支copy dev开发分支

git push origin dev   #把新建的分支push到远端

git pull       #拉取远端分支

git branch --set-upstream-to=origin/dev  #关联

git pull     #拉取 验证

二、 gitlab 规范

2.1 基本要求

所有commit必须有注释,内容必须按照注释格式严格执行

合理控制提交内容的颗粒度完成一个功能进行一次commit提交,严禁一次提交涵盖多个功能

正确为每个项目设置Git提交用到的user.name和user.email信息,以公司邮箱为准,不可随意设置以影响无法正确识别。 查看当前项目配置信息的命令:git config -l

2.2 版本号

版本号(tag)命名规则:主版本号.次版本号.修订号,如1.1.10 (参考GitHub 语义化命名规范)

版本号仅标记于master分支,用于标识某个可发布/回滚的版本代码

对master标记tag意味着该tag能发布到生产环境

对master分支代码的每一次更新(合并)必须标记版本号

仅项目管理员有权限对master进行合并和标记版本号

2.3 gitlab 项目权限介绍

浏览者(Guest)只能浏览代码,无push、pull request等所有写权限

开发者(Developer)拥有浏览、push非主分支、提交pull request工单权限

管理员(Master)拥有建立和管理Git项目、合并分支和代码、给master打tag版本号等权限######2.3.1 分支使用

每个Git项目固定含有上述所有分支类型。主分支master和develop是保护分支,只能进行合并请求,均不可直接提交代码。

功能需求或常规Bug修复,请从develop拉取feature分支;线上紧急问题修复,请从master拉取hotfix分支。

2.3.2 代码提交

一个提交就代表解决一个问题

大问题适当地分解为多个小问题,以便每次小型提交都更易于理解

2.3.2 代码合并

将开发完毕的分支,拉取develop最新代码,merge并解决冲突后,之后在对应的feature分支创建并提交到develop分支,并自动触发merge request请求,然后进行code review,确认无误后再合并。注意:1.每个merge request不要包含不相关的功能 2.merge request提交后需要及时跟踪动态,包括通过、打回等 3.该功能进入提测流程后,需删除之前的功能分支

三、 gitflow工作流

工作流中涉及到的角色介绍:

功能开发者:模块中功能的开发人员;

开发管理员:由项目模块开发的小组长(team leader)担当;

测试管理员:由测试团队指定人员担当;

发布管理员:由生产环境发布团队指定人员担当;

分支说明

名称说明命名规范命名示例合并目标合并操作

master(主分支)线上稳定版本mastermaster----

release待发布分支,下个版本需上线的版本release/xxxrelease/v1.0.0mastermerge request

develop(开发主分支)当前正在开发的分支developdevelopmastermerge request

feature功能分支,每个功能需分别建立自己的子分支feature/版本号-功能名feature/v1.0.0-Logindevelopmerge request

hotfix紧急修复分支hotfix/xxxhotfix/v1.0.1master/developmerge request

分支约定

Git Flow有主分支和辅助分支两类分支。其中主分支用于组织与软件开发、部署相关的活动;辅助分支组织为了解决特定的问题而进行的各种开发活动。

master 分支

master分支存放的是随时可供在生产环境中部署的稳定版本代码

master分支保存官方发布版本历史,release tag标识不同的发布版本

一个项目只能有一个master分支

仅在发布新的可供部署的代码时才更新master分支上的代码

每次更新master,都需对master添加指定格式的tag,用于发布或回滚

master分支是保护分支,不可直接push到远程仓master分支

master分支代码只能被release分支或hotfix分支合并

develop 分支

develop分支是保存当前最新开发成果的分支

一个项目只能有一个develop分支

develop分支衍生出各个feature分支

develop分支是保护分支,不可直接push到远程仓库develop分支

develop分支不能与master分支直接交互

每次将develop分支上的代码合并回master分支时,我们都可以认为一个新的可供在生产环境中部署的版本就产生了。基于此,理论上说,每当有代码提交到master分支时,我们可以使用Git Hook触发软件自动测试以及生产环境代码的自动更新工作。这些自动化操作将有利于减少新代码发布之后的一些事务性工作。

辅助分支

git_assist.png

辅助分支是用于组织解决特定问题的各种软件开发活动的分支。辅助分支主要用于组织软件新功能的并行开发、简化新功能开发代码的跟踪、辅助完成版本发布工作以及对生产代码的缺陷进行紧急修复工作。这些分支与主分支不同,通常只会在有限的时间范围内存在。跟“历史性”分支相反,这三类分支都是短期分支,针对他们的工作内容完成后,一般都要进行删除。

工作内容完成的标识有两个:开发完成、合并完成,缺一不可。

辅助分支包括:

用于开发新功能时所使用的feature分支

用于辅助版本发布的release分支

用于修正生产代码中的缺陷的hotfix分支

以上这些分支都有固定的使用目的和分支操作限制。从单纯技术的角度说,这些分支与Git其他分支并没有什么区别,但通过命名,我们定义了使用这些分支的方法。

feature 分支

使用规范:

分支的命名格式必须是版本号-功能名,例如v1.0.0-login

develop分支的功能分支

feature分支使用develop分支作为它们的父类分支

以功能为单位从develop拉一个feature分支

每个feature分支颗粒要尽量小,以利于快速迭代和避免冲突

当其中一个feature分支完成后,它会合并回develop分支

当一个功能因为各种原因不开发了或者放弃了,这个分支直接废弃,不影响develop分支

feature分支代码可以保存在开发者自己的代码库中而不强制提交到主代码库里

由每组开发管理员负责把所有feature分支开发完成的代码合并到develop分支

feature分支只与develop分支交互,不能与master分支直接交互

如有几个同事同时开发,需要分割成几个小功能,每个人都需要从develop中拉出一个feature分支,但是每个feature颗粒要尽量小,因为它需要我们能尽早merge回develop分支,否则冲突解决起来就没完没了。同时,当一个功能因为各种原因不开发了或者放弃了,这个分支直接废弃,不影响develop分支。

release 分支

使用规范:

命名规则:release/*,“*”以本次发布的版本号为标识

release分支主要用来为发布新版的测试、修复做准备

当需要为发布新版做准备时,从develop衍生出一个release分支

release分支可以从develop分支上指定commit派生出

release分支测试通过后,合并到master分支并且给master标记一个版本号

release分支一旦建立就将独立,不可再从其他分支pull代码

必须合并回develop分支和master分支

release分支是为发布新的产品版本而设计的。在这个分支上的代码允许做小的缺陷修正、准备发布版本所需的各项说明信息(版本号、发布时间、编译时间等)。通过在release分支上进行这些工作可以让develop分支空闲出来以接受新的feature分支上的代码提交,进入新的软件开发迭代周期。

当develop分支上的代码已经包含了所有即将发布的版本中所计划包含的软件功能,并且已通过所有测试时,我们就可以考虑准备创建release分支了。而所有在当前即将发布的版本之外的业务需求一定要确保不能混到release分支之内(避免由此引入一些不可控的系统缺陷)。

成功的派生了release分支,并被赋予版本号之后,develop分支就可以为“下一个版本”服务了。所谓的“下一个版本”是在当前即将发布的版本之后发布的版本。版本号的命名可以依据项目定义的版本号命名规则进行。

hotfix 分支

使用规范:

命名规则:hotfix/*,“*”以本次发布的版本号为标识

hotfix分支用来快速给已发布产品修复bug或微调功能

只能从master分支指定tag版本衍生出来

一旦完成修复bug,必须合并回master分支和develop分支

master被合并后,应该被标记一个新的版本号

hotfix分支一旦建立就将独立,不可再从其他分支pull代码

除了是计划外创建的以外,hotfix分支与release分支十分相似:都可以产生一个新的可供在生产环境部署的软件版本。

当生产环境中的软件遇到了异常情况或者发现了严重到必须立即修复的软件缺陷的时候,就需要从master分支上指定的TAG版本派生hotfix分支来组织代码的紧急修复工作。

这样做的显而易见的好处是不会打断正在进行的develop分支的开发工作,能够让团队中负责新功能开发的人与负责代码紧急修复的人并行的开展工作。

新功能开发流程

从 develop 分支创建 feature 分支;

开发调试完将 feature 分支提交到远程版本库;

提交 pull request 请求合并到 develop 分支;

相关负责人 code review 后如果同意合并后,删除远程 feature 分支,如果不同意,重新修改后再上传 feature 分支请求 pull request。

Pull Request

Pull Request是当功能开发者完成一个新功能后向项目维护者发送合并请求通知的机制。它的使用过程如下:

功能开发者可以通过Gitlab页面发送pull request

开发管理员自己或组织其他的团队成员审查、讨论和修改代码

开发管理员合并新增功能分支到develop分支,然后关闭pull request,并且可以选择删除新增分支

工作流程

1.由开发管理员负责在Gitlab上创建空白的仓库,并clone到本地,在sourcetree的git flow菜单中选择初始化仓库,并push到远端。

2.在Gitlab上设置保护分支,把master、develop分支保护起来,只有指定人可push。

3.功能开发者clone代码到本地,先在sourcetree的git flow菜单中选择初始化仓库。

4.然后再开始新建功能分支,进行开发工作。

5.新功能开发全部完成或部分完成后,功能开发者把最新代码push到远端同样的新功能分支里,并在Gitflow发起pull request给开发管理员

6.开发管理员review代码,选择合并代码到develop,并可选择删除已经合并的新功能分支

7.当开发管理员处理完合并请求后,开发者,切换到develop分支,直接删除自己的本地分支及远程分支,不要点击完成(Finish Feature),此时开发者pull远端develop分支最新代码即可,可忽视本地的push提醒。

8.release、hotfix分支和feature分支操作类似。

9.不可点击完成新功能、完成发布版本、完成修复补丁,因为这样会导致自动合并代码到master或develop分支

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