如何使用git做版本管理

204 阅读3分钟

选择一个工作流

git flow

推荐使用 Git flow 来协调我们的提交工作,这个工作流比较普适,在我们没有特殊的需求之前,可以采用这个工作流,具体可百度查阅详情。

如需 code review,可在 gitlab 上将 develop 分支设置为受保护的,需要 merge request approved 之后才能合并到 develop 分支。

commit message

为提高代码审核者的可读性,提交代码的时候,commit message前缀建议:

  • feat:新功能(feature)
  • func:小粒度的功能点提交
  • fix:修补bug
  • docs:文档(documentation)
  • style: 格式(不影响代码运行的变动)
  • refactor:重构(即不是新增功能,也不是修改bug的代码变动)
  • test:增加测试
  • chore:构建过程或辅助工具的变动

commit message 示例:

| ``` git commit -m "fix: 修复某个bug"

| ------------------------------------ |

\


### git tag

`master` 分支为稳定的生产分支,测试分支的代码经过QA验证通过之后,需要合并到 master 分支;建议在代码测试好后,合并之前,为当前测试通过的 commit 打上tag,然后合并到 master。

git tag 示例:

| ```
git tag -a v2.3 -m "Release v2.3"  git push origin --tags
``` |
| ----------------------------------------------------------------- |

\


## 版本号

版本号是我们更新和发布一个版本的基础,如果发布出现问题,也便于回滚。

\


### 如何生成

根据Git的提交记录,我们使用如下命令就能生成版本号:

Shell

| ```
git describe --abbrev=4 --dirty --always --tag
``` |
| ------------------------------------------------------ |

使用Python

| ```
from subprocess import check_output  git_version = check_output("git describe --abbrev=4 --dirty --always --tags".split()).decode('utf-8').strip()
``` |
| ---------------------------------------------------------------------------------------------------------------------------------------------------------- |

\


### 生成规则

根据是否打过tag,是否有提交记录,生成的版本号各有差异,具体生成的版本号格式由如下元素组成:{最近一个tag}-{距离上个tag多少个提交}-{commit id的最开始4个字符} ,比如下例子:

| ```
v1.2.8-292-gfe6c
``` |
| ------------------------ |

\


\


如果提交历史上都没有打过 tag,那么生成的版本号只是最近 commit id 串的前4,,如:

| ```
fe6c
``` |
| ------------ |

\


\


如果打过tag,后面没有提交,那么生成的版本号如下:

| ```
v1.2.8
``` |
| -------------- |

\


\


### 容器镜像版本

完整镜像名的组成:`REGISTRY[:PORT]/USER/REPO[:TAG]` ,注意TAG部分,我们打成的容器TAG使用的是上文中的方式生成的版本号,并且在最前面还加上了jenkins 打包的 `${BUILD_ID}`。最终生成的完整镜像名如下:

| ```
registry.cn-shanghai.aliyuncs.com/gemii/liz-qywechat-open:11-v1.2.8-291-gfdd85
``` |
| -------------------------------------------------------------------------------------- |

\


这是使用阿里云的镜像仓库之后的完整的镜像名地址,使用阿里云仓库的好处是能完美地和阿里云的kubernetes服务集成。阿里云的镜像仓库的名字组成格式为:`{registry}/{namespace}/{仓库}:{标签}` 。

\


## 其他最佳实践

\


### 如何让git commit历史更清爽

使用rebase可以让develop分支的提交历史更干净(成线性),原理可参考 [这个文章](https://www.jianshu.com/p/6960811ac89c) ,参考操作步骤记录如下:

| ```
# 从 develop 新开分支开始开发 git checkout develop git pull git checkout -b feature/foo ​ # 多次提交完成开发任务 git add . git commit -m "feat: 完成需求foo" ​ # 合并本地的提交记录 --- 2表示合并两个 git rebase -i HEAD~2 ​ # rebase 之前将 develop 分支拉到最新 git checkout develop git pull git checkout feature/foo # 有冲突就解决冲突,解决后直接git add . 再git rebase --continue即可 git rebase develop ​ # merge 回 develop 分支 git checkout develop git merge feature/foo ​ # 推送到远程 git push origin develop
``` |
| ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

\