- [GitLab工作流](#GitLab工作流)
  - [前言](#前言)
  - [环境部署](#环境部署)
    - [部署GitLab社区版](#部署GitLab社区版)
    - [安装Visual Studio Code(可选)](#安装Visual-Studio-Code可选)
    - [安装Git](#安装Git)
    - [GitLab用户设置](#GitLab用户设置)
  - [项目经理](#项目经理)
    - [创建群组](#创建群组)
    - [添加成员](#添加成员)
    - [创建项目](#创建项目)
    - [配置项目](#配置项目)
    - [创建里程碑(需求)](#创建里程碑需求)
    - [创建议题(任务)](#创建议题任务)
    - [处理合并请求](#处理合并请求)
    - [发布至集成环境/验证环境/生产环境](#发布至集成环境验证环境生产环境)
    - [关闭里程碑(需求)](#关闭里程碑需求)
  - [程序员](#程序员)
    - [处理议题(任务)](#处理议题任务)
    - [拉取项目并创建分支](#拉取项目并创建分支)
    - [推送分支](#推送分支)
    - [提交合并请求](#提交合并请求)
    - [删除分支](#删除分支)
    - [关闭议题(任务)](#关闭议题任务)

# GitLab工作流

`v1.0.2`

## 前言

Git与其它版本控制系统的差异:

+ 直接记录快照,而非差异比较
+ 近乎所有操作都是本地执行
+ 保证完整性
+ 一般只添加数据

Git有三种状态,你的文件可能处于其中之一:`已提交(committed)`、`已修改(modified)`和`已暂存(staged)`。  
`已提交`表示数据已经安全的保存在本地数据库中。  
`已修改`表示修改了文件,但还没保存到数据库中。  
`已暂存`表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。

三个工作区域的概念:`Git仓库`、`工作目录`以及`暂存区域`。  
`Git仓库`是Git用来保存项目的元数据和对象数据库的地方。 这是Git中最重要的部分,从其它计算机克隆仓库时,拷贝的就是这里的数据。  
`工作目录`是对项目的某个版本独立提取出来的内容。 这些从`Git仓库`的压缩数据库中提取出来的文件,放在磁盘上供你使用或修改。  
`暂存区域`是一个文件,保存了下次将提交的文件列表信息,一般在`Git仓库`中。  
![image](image/93C7EEC346188BBABDF255087762327E.png)  


>如果本文读者还没使用过git,对git的基本概念和命令不是很熟悉,可以参考官方中文教程:[Pro Git](https://git-scm.com/book/zh/v2)

`GitLab工作流`提供了一种简单、透明和有效的git工作方式,并与问题跟踪系统相结合。  
其最大原则叫做`上游优先(upsteam first)`,即只存在一个主分支`master`,它是所有其他分支的上游。只有上游分支采纳的代码变化,才能应用到其他分支。

![image](image/1F07B2EED7292E788127FF4FD460B0D6.png)  

>官方文档:[Introduction to GitLab Flow](https://docs.gitlab.com/ee/topics/gitlab_flow.html)

## 环境部署

### 部署GitLab社区版

准备一台服务器,部署GitLab社区版

>参考手册:[GitLab Community Edition](GitLabCE.md)

### 安装Visual Studio Code(可选)

>参考手册:[Visual Studio Code](VSCode.md)

### 安装Git

>参考手册:[Git](Git.md)

### GitLab用户设置

输入初始密码

![image](image/3859ACA0DDD55EFD0C91FA7D5C775C92.png)  

首次登录需更新密码

![image](image/A92E4AFE9721547D0181AA285F172EDA.png)  

使用更新后的密码登录

![image](image/3859ACA0DDD55EFD0C91FA7D5C775C92.png)  

设置中文界面

![image](image/7D34C3385C0DF0ED03878E764B8136FF.png)  
![image](image/44C7213D550D75614C2E942DAC877E66.png)  

刷新界面

![image](image/DD1859FB912220E84F7552F5850C7F97.png)  

运行开始菜单中的`Git Bash`,打开Git命令行窗口

```bash
# 创建SSH密钥id_rsa,无密码
ssh-keygen -q -b 2048 -t rsa -C "lijin@nantian.com.cn" -f ~/.ssh/id_rsa -N ""
# 复制SSH密钥至剪贴板
cat ~/.ssh/id_rsa.pub | clip
```

设置SSH密钥,使用`Ctrl + v`粘贴

![image](image/2752CC4DE5EB055A5B4348B6C2241E27.png)  
![image](image/BFBDD9545D8D87A0D74FCF9051DB4309.png)  

## 项目经理

### 创建群组

![image](image/75AEDDF2378CA6FD88DB7FB3E42DB4A6.png)  
![image](image/F41C065A7C34459AEE1B49F4A3EC4FD7.png)  
![image](image/31D025331CDABA94C99D005C99C0D2DA.png)  
![image](image/66E5C5C135929CAA5C7330FEDEE72885.png)  

### 添加成员

![image](image/8BD7FC3118CE9FB6965062AD4078B2D6.png)  
![image](image/95853DED835BBEB47180E6BAEB814121.png)  

### 创建项目

在工作区目录上右键选择`Git Bash Here`,打开Git命令行窗口

```bash
# 初始化本地仓库
git init smart-bank
# 切换至本地仓库目录,当前分支为master(用于开发环境)
cd smart-bank
# 定义LFS文件类型
git lfs track "*.7z" "*.bin" "*.class" "*.db" "*.dll" "*.doc" "*.exe" \
"*.fdp" "*.gif" "*.ico" "*.iso" "*.jar" "*.jpg" "*.lib" "*.msi" \
"*.ocx" "*.png" "*.pdf" "*.rar" "*.rpm" "*.sfx" "*.swf" "*.sys" \
"*.vsix" "*.wav" "*.zip"
# 创建忽略文件列表
echo ".vscode" > .gitignore
echo "Desktop.ini" >> .gitignore
echo "ehthumbs.db" >> .gitignore
echo "Thumbs.db" >> .gitignore
echo "*.bak" >> .gitignore
echo "*.log" >> .gitignore
echo "*.tmp" >> .gitignore
# 创建自述文件
touch README.md
# 暂存全部变更
git add -A
# 提交至本地仓库
git commit -m "init"
# 创建并切换分支SIT(用于集成环境)
git checkout -b SIT
# 创建并切换分支(用于验证环境)
git checkout -b UAT
# 创建并切换分支(用于生产环境)
git checkout -b PRD
# 切换回开发分支(用于开发环境)
git checkout master
# 添加远程仓库
git remote add origin git@192.168.252.129:wuhan/smart-bank.git
# 开启LFS锁验证
git config lfs.https://192.168.252.129/wuhan/smart-bank.git/info/lfs.locksverify true
# 推送所有分支至远程仓库,首次连接需要输入'yes'确认
git push -u --all origin
```

```
The authenticity of host '192.168.252.129 (192.168.252.129)' can't be established.
ECDSA key fingerprint is SHA256:+1txcYH71lDd2/I3gtNN7dHWFOPWHBOcC58RYz82EkY.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.252.129' (ECDSA) to the list of known hosts.
Enumerating objects: 5, done.
Counting objects: 100% (5/5), done.
Delta compression using up to 4 threads
Compressing objects: 100% (4/4), done.
Writing objects: 100% (5/5), 491 bytes | 491.00 KiB/s, done.
Total 5 (delta 0), reused 0 (delta 0)
remote:
remote: The private project wuhan/smart-bank was successfully created.
remote:
remote: To configure the remote, run:
remote:   git remote add origin git@192.168.252.129:wuhan/smart-bank.git
remote:
remote: To view the project, visit:
remote:   http://192.168.252.129/wuhan/smart-bank
remote:
To 192.168.252.129:wuhan/smart-bank.git
 * [new branch]      PRD -> PRD
 * [new branch]      SIT -> SIT
 * [new branch]      UAT -> UAT
 * [new branch]      master -> master
Branch 'PRD' set up to track remote branch 'PRD' from 'origin'.
Branch 'SIT' set up to track remote branch 'SIT' from 'origin'.
Branch 'UAT' set up to track remote branch 'UAT' from 'origin'.
Branch 'master' set up to track remote branch 'master' from 'origin'.
```

```bash
# 设置远程仓库默认分支
git remote set-head origin master
# 显示分支(包括远程分支)
git branch -a
```

```
  PRD
  SIT
  UAT
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/PRD
  remotes/origin/SIT
  remotes/origin/UAT
  remotes/origin/master
```

`* master`为当前本地分支  
`remotes/origin/HEAD`为远程默认分支


### 配置项目

访问远程仓库`https://192.168.252.129/wuhan/smart-bank`

![image](image/5A692CA975420BBEE6DC1BEDBA04108A.png)  

设置项目名称、描述及头像

![image](image/D20FC451DAFB09310E3593E261CFA193.png)  

设置保护分支`SIT`、`UAT`、`PRD`

![image](image/36F74761CD8CF0CEA589B9EF9FB194C2.png)  
![image](image/92290254C8325FCE8B1B85749D87CA40.png)  

### 创建里程碑(需求)

根据需求,创建里程碑

![image](image/3C7D43DA198DEDE5F64884A4C73E0FCE.png)  
![image](image/34B02594E0474B8B074ADBAC5B36A378.png)  
![image](image/3A569DF573E40B51650A7DAF066355BF.png)  

### 创建议题(任务)

分派任务,创建议题

![image](image/E3569AB105D164C93E76F03CA5DAD1DB.png)  
![image](image/9E8E7E2EF7FFC8FA1D5C3EF12DA04E4E.png)  
![image](image/657730284001CD7DE7AE63B6C7E79990.png)  
![image](image/0454CA1A7C5534ACBDA81F9BCD4E8BCB.png)  

### 处理合并请求

选择要处理的合并请求

![image](image/904514952855DF447A0A0389772B80B2.png)  

在`Web IDE`中审阅

![image](image/0455CB552284B4C82547412A823F6E23.png)  
![image](image/7772398B248E1A29B411C76157C9767F.png)  

审核通过后合并

![image](image/D53526D481B17972B0F4CC4B12BAE54C.png)  

合并后的分支图

![image](image/018CC6F09574B8A674772A61ACCB0D69.png)  

### 发布至集成环境/验证环境/生产环境

单元测试通过后,将版本发布至`SIT`集成环境

```bash
# 拉取远程分支
git pull --all
# 切换至集成环境
git checkout SIT
# 合并
git merge master
# 推送至远程仓库
git push
```

集成测试通过后,将版本发布至`UAT`验证环境(无验证环境可略过)

```bash
# 拉取远程分支
git pull --all
# 切换至验证环境
git checkout UAT
# 合并
git merge SIT
# 推送至远程仓库
git push
```

所有测试通过后,将版本发布至`PRD`生产环境,并创建标签

```bash
# 拉取远程分支
git pull --all
# 切换至生产环境
git checkout PRD
# 合并
git merge UAT
# 推送至远程仓库
git push
# 创建标签
git tag v1.0.0
# 推送标签至远程仓库
git push --tags
```

### 关闭里程碑(需求)

需求完成后,关闭里程碑

![image](image/33A2AFC4BEA3658B4237F471DE18826D.png)  


## 程序员

### 处理议题(任务)

收到议题后,将议题标记为`处理中`

![image](image/1F6F3EB47D9877963CD8504D68478149.png)  
![image](image/18A2BA99D8B8E95560CF5F4B3E229BB9.png)  

### 拉取项目并创建分支

在工作区目录上右键选择`Git Bash Here`,打开Git命令行窗口

```bash
# 克隆远程仓库将拉取全部分支,首次连接需要输入yes确认
git clone git@192.168.252.129:wuhan/smart-bank.git
# 切换至本地仓库目录
cd smart-bank
# 当前分支默认为master,创建并切换分支
git checkout -b Interface-Design
```

也可只拉取项目指定分支

```bash
# 初始化本地仓库
git init smart-bank
# 切换至本地仓库目录
cd smart-bank
# 添加远程仓库
git remote add origin git@192.168.252.129:wuhan/smart-bank.git
# 拉取分支
git fetch origin master
# 创建并切换分支
git checkout -b Interface-Design origin/master
```

### 推送分支

开发完毕后,推送分支

```bash
# 推送前合并远程分支
git pull --rebase origin master
# 推送
git push -u origin Interface-Design
```

### 提交合并请求

![image](image/AE9093110A55076E4BF01CB80C024184.png)  
![image](image/63F352ACD2E71ADCAFB74E6A27C5CE4B.png)  
![image](image/C69450734400DD2BF2E59D8C142C35B7.png)  
![image](image/06168322A4D41398571C3C5B5BA5BD34.png)  

### 删除分支

合并通过后,任务完成。删除分支

```bash
# 删除远程分支
git push origin --delete Interface-Design
# 删除本地分支
git branch -D Interface-Design
```

### 关闭议题(任务)

![image](image/1AC3115D1E36DA12D3106848ACE7B731.png)