Git简略介绍

本篇不会介绍根本的git原理之类的,只记载在作业中的git运用经验。假如要学习git的根底与进阶,能够参阅这个网站git-tower

本篇会简略介绍我在作业中都运用git做了哪些作业:

  • 根底运用。运用gitlab办理咱们的源代码

  • 主动化。咱们运用gitlab的CI进行主动代码查看、单元测验、代码打包

  • 多体系协作。咱们运用gitlab的issue+webhook+钉钉作为简略的工单体系,支撑咱们进行日常支撑作业

1. 办理源码进行开发

以下都以gitlab为例,一切开发人员运用同一个仓库,根据不同的特性分支进行开发

咱们的分支:

  • master分支: 正式分支,也是打包分支

  • develop分支: 开发分支,保持和master分支保持一致

  • feature分支: 功用特性分支,不同的功用别离在对应的特性分支上进行开发测验。

咱们的开发流程:

  • 建分支。树立特性/bug对应的issue,根据issue创立对应的分支(在web页面直接操作), 或许直接从develop分支迁出一个新的特性分支

  • 开发。在特性分支上进行开发/测验,直到测验验收结束,每次提交都会触发局部静态代码查看

  • 兼并前rebase并整理提交记载。分两步,先rebase develop保持特性分支为最新的develop代码,再rebase -i 变基commitid 整理特性分支的commit记载

  • 兼并前code-review。在gitlab网页界面创立merge-request,并指使其他开发进行review,直到一切人都无异议,此刻会触发全局静态代码查看。

  • 兼并更新版别信息。研制主管将代码兼并到develop分支后,在develop分支修正代码内的版别信息,再兼并到master分支

  • 打包发布。研制主管根据master分支进行打tag,此刻会触发CI主动根据tag打包。

这样,咱们的一次功用需求的开发就算完成了。目前整个流程还存在一些问题:

  • 无法主动创立及更新CHANGELOG.md,即版别记载无法主动生成,跟咱们的提交不规范有联系

  • 无法主动触发CD,跟咱们的服务架构有联系。

2.根据gitlab的CI进行主动化代码查看、打包

gitlab如何树立CI,此处不做赘述,查看官方文档即可。Runner部分教你如何树立CI环境,CICD部分教你如何让CI运行起来

咱们一共有4个任务: test,code_check_push,code_check_merge,feat_build,tag_build

  • test。履行单元测验代码,每次push时触发

  • code_check_push。履行局部静态代码查看,每次提交代码时触发,查看范围为提交的Py文件代码,且只查看Error等级的

  • code_check_merge。履行全局静态代码查看,创立merge-request后触发,查看范围为工程内的主要python包,只查看error等级的

  • feat_build。履行打包,每次push时触发,用于特性分支提测时装备

  • tag_build。履行打包,只有提交创立tag时触发,用于正式环境的打包。

3.根据webhook和issue+钉钉的简易工单体系

本体系涉及三个部分gitlab服务钉钉服务简略的中转服务

中转服务

为一个简略的http服务,用于接纳gitlab内的issue相关改变的告诉,并转发给钉钉机器人

  • 创立一个转发接口api,将该api设置到gitlab的webhook部分即可接纳gitlab的告诉

  • 保护一个支撑人员列表(转发钉钉时以对应手机号为准),收到gitlab告诉时转发到钉钉时艾特对应的支撑人员进行处理

gitlab服务

  • 树立一个公开的项目,用于接纳issue,外部人员根据该项意图issue部分提交工单

  • 根据不同的业务类型,树立不同的工单模板,模板为markdown文件,需求放置于.gitlab/issue_templates/目录下,需求手动创立

  • 在该项意图webhook部分增加上述中转服务的接纳告诉的api,后续一切issue的改变(树立、更新、封闭)都会告诉到该api

钉钉服务

  • 树立支撑钉钉群,并增加webhook机器人,此机器人用于接纳中转服务的告诉

这样,一个简易的工单体系就树立起来了。外部人员树立issue反应的时分,钉钉群内机器人就能够立马艾特对应支撑人员进行处理,
处理结束后在issue内同步结果信息,issue创立者会收到gitlab告诉邮件

git常用场景

记载我了解的以及我运用的业务中场景的处理办法,假如有错误的或许有差异的还请指正

1、拉取长途项意图方针(如develop)分支

git clone 项目地址 项目下来一般只包含master分支,这个时分又不想运用git fetch all拉取一切分支下来,而只想拉取指定的分支。 能够运用

git checkout -b develop origin/develop

这样就切换到想要的分支了,而且已经拉取到了对应分支的代码

2、我需求为我的功用新建一个分支,而且同步到长途

办法1:创立分支并直接相关长途分支 git checkout -b new_branch origin/new_branch

办法2:先创立分支,先迁出新分支git checkout -b new_branch 再手动设置相关长途分支,手动设置长途分支也有两种办法

  • 第一种 git branch --set-upstream-to=origin/new_branch new_branch
  • 第二种 git push --set-upstream origin new_branch(长途分支名)

3、我在自己的feature分支进行开发,可是develop分支产生了改动,我需求更新下来

先在本地的develop拉取最新的长途develop代码 git pull origin develop

然后切回feature分支,直接针对develop分支进行rebase。git rebase develop

4、master版别为10,可是我想回退到版别9

履行git reset --hard 版别9的commit_id

前提是要提交未push到长途,不然本地再稍微修正生成一次新的提交git push --force

可是假如方针是受保护的分支,那么–force不生效

5、特性分支开发结束后,删去去该分支

先删去本地的分支 git branch -D feat/xxxx

再删去长途的分支 git push origin --delete feat/xxxx

6、根据commit log生成changelog

conventional-changelog,需求运用npm装置

7、git rebase之后,兼并的提交其message不规范,需求从头修正message

履行git commit --amend

8、本地代码以及改的改头换面,拉取长途最新代码掩盖本地,且不兼并抵触

先拉取长途一切代码 git fetch --all

再重置版别 git reset --hard origin/feature/当时分支

9、从某个tag分支上迁出新的分支进行开发

部分项目组或许未运用最新的tag进行研制,而是根据之前某个稳定版,此刻增加紧迫 特性时,需求从项目组运用的tag上迁出分支

git branch 新分支名 迁出tag版别

例如:git branch feature/add-new-feat v1.3.4 则会从1.3.4版别迁出分支

10、在本地暂时切换到某个提交

履行git checkout $commit_id 。此刻就能够切换到这次提交上,然后能够checkout回原分支,这么做能够定位某次提交是否出问题

11、CICD脚本里的一些操作

  • 获取当时分支名。git rev-parse --abbrev-ref HEAD

  • 获取当时分支最新的提交。git rev-parse HEAD

  • 获取最新版别的tag VERSION=git describe --abbrev=0 --tags

  • git 获得两个 tag 之间的 commit,用于生成版别更新的changelog。git log --pretty=oneline tagA...tagB > change.log

  • 获取倒数第二新的tag

    • 先获取一切tag git tag > tags.log

    • 获取一切tag数量 tags_num=awk 'END {print NR}' tags.log

    • 计算倒数第二个tag的行数 num=((((tags_num-1))

    • 取倒数第二行tag内容 latest_tag=sed -n $num'p' tags.log

参阅

Commit message 和 Change log 编写攻略-阮一峰
git-flow 的作业流程
git clone –mirror和git clone –bare之间的差异是什么
gogs搬迁gitlab
手写git-hooks钩子
Git – 根据GitLab服务端、客户端钩子介绍
GitHub Actions 入门教程
hugo运用github action主动布置到github pages