常用工具-Git简介

流程介绍

基本原则

  • 简单。不增加过多学习成本,开发测试快速迭代。

  • 可追溯。每个现场环境运行的软件版本号都由主仓发布,主仓关键分支禁用代码强制提交。

简化流程

所有开发人员都从主仓的开发分支克隆(clone)代码。在本地修改代码,本地仓新增(add)提交。待所有代码调试完毕,准备推送(push)到主仓。在推送主仓前先获取(fetch)主仓最新提交记录。

完整流程

私有仓从主仓派生(fork),本地仓从私有仓克隆(clone)。

主仓所有开发人员只能发起合并请求(merge),禁止发起推送请求(push),经仓负责人检视后合入主仓。主仓只有开发(develop)分支接受私有仓代码合并请求,其他分支不接受私有仓代码合并请求。

版本管理

版本号规范

版本号基本结构:v主版本号.子版本号.修订版本号。版本号会以标签(TAG)的方式指向各分支的某次提交记录。

参考:产品中心发布的版本号命名规范

主版本号

  1. 大的代码重构导致此版本号变更;
  2. 主版本号变更可能导致向下兼容问题;

子版本号

  1. 有大的功能变动;
  2. 可能影响向下兼容,但是可以通过技术手段进行数据或者业务转换;

修订版本号

  1. 修改程序内部 bug,程序功能无变化;
  2. 绝对向下兼容;

分支策略

  • develop(开发分支):主仓默认分支,日常开发活跃分支,一般包含未经严格测试的提交记录。
  • v主版本号.子版本号.x(发布分支):是测试或现场环境运行的软件版本对应的代码。

以上两类分支会开启分支保护策略,禁止强制推送。

修订版本号为0的标签会指向开发分支和相应的发布分支,而修订版本号非0的标签只会指向相应的发布分支。

例如:版本号为v1.6.0的标签会同时指向开发分支和v1.6.x的发布分支。而版本号为v1.6.2的标签只会指向v1.6.x的发布分支。

提交记录

提交记录信息基本结构:提交类型[问题单号或任务编号]: 提交信息

提交类型

  • feat(功能特性):主要是核心代码新增或修改功能特性,包括性能优化和代码重构;
  • fix(修复问题):主要是修复核心代码中发现的问题;
  • other(其他事务):主要是新增或修改非核心代码,比如构建脚本、代码版本号、新增环境等等。

提交信息

  • 提交信息尽量简短(100字以内)介绍本次提交的目的

  • 提交信息尽量携带问题单号任务编号

  • 单次提交实现单个特性或修复单个问题

标准提交示例

1
2
3
4
5
6
7
8
9
# 功能特性提交记录
【推荐】feat1549: 增加登录功能,并对用户权限进行校验
【不推荐】feat: 修改登录功能,忽略对管理员权限进行校验
# 修复问题提交记录
【推荐】fix8317: 修复校验用户权限时,并发访问公共队列造成崩溃的问题
【不推荐】fix: 修复校验管理员权限时,跳过校验普通用户权限的问题
# 其他事务提交记录
【推荐】other1349: 部署脚本打包增加检索服务
【不推荐】other: 部署版本信息修改为v1.8.5

提交策略

  • 功能特性其他事务的提交都只需要合并到开发分支即可;

  • 修复问题的提交除了合并到对应的发布分支上,还需要调整后合并到开发分支中;

测试发布流程

对于分支的提测,若没有相应的发布分支,项目负责人需要在新建

对于发布分支的提测,项目负责人只需在发布分支上打v主版本号.子版本号.x的标签和记录Changelog。

常用命令

以下命令格式常用命令格式,详细可选参数可以查询Git手册获取。

约定

<XX>必填参数

[XX]可选参数

REPO_NAMEGit仓库名称,示例:origin

REPOGit仓库地址,示例:http://ubuntu.alfdxl.top/gitea-admin/git-template.git

BRANCH分支名称,示例:feat_adminuser

TAG标签名称,示例:v1.2.6

MESSAGE提交消息,示例:feat698: 新增创建管理员用户和查询用户信息功能

ID提交记录,示例:3110aa8502d24022cd08ba37d5dacd5160709214

PATH文件夹路径,示例:template

HEADGit保留字段,指向分支当前提交记录

clone

克隆一个Git仓库到本地,可以查看或修改此项目。基本格式:git clone <REPO> [PATH]

Git仓库地址支持HTTPSSH协议。HTTP协议不会保存用户信息,在拷贝过程中也不会验证用户权限。但在推送本地信息时会要求用户进行验证,常常用于代码查看活动。SSH协议本身已经保存用户信息,推送本地信息时不会要求用户输入信息,常常用于代码开发活动。SSH协议需要提前配置,Gitlab的相关配置可以参考文章

使用示例:

1
2
3
4
5
6
7
8
9
# 克隆代码到本地
$ git clone http://ubuntu.alfdxl.top/gitea-admin/git-template.git template
Cloning into 'template'...
remote: Enumerating objects: 61, done.
remote: Counting objects: 100% (61/61), done.
remote: Compressing objects: 100% (40/40), done.
remote: Total 61 (delta 9), reused 0 (delta 0), pack-reused 0
Receiving objects: 100% (61/61), 5.07 KiB | 2.53 MiB/s, done.
Resolving deltas: 100% (9/9), done.

remote

管理远程Git仓库,每个仓库都有名称,默认克隆的仓库名称都为origin

查看远程仓详情:git remote -v

新增远程仓:git remote add <REPO_NAME> <REPO>

删除远程仓:git remote rm <REPO_NAME>

使用示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 查看远程仓
$ git remote -v
origin http://ubuntu.alfdxl.top/gitea-admin/git-template.git (fetch)
origin http://ubuntu.alfdxl.top/gitea-admin/git-template.git (push)

# 新增远程仓
$ git remote add ssh_remote ssh://git@ubuntu.alfdxl.top:222/gitea-admin/git-template.git
$ git remote -v
origin http://ubuntu.alfdxl.top/gitea-admin/git-template.git (fetch)
origin http://ubuntu.alfdxl.top/gitea-admin/git-template.git (push)
ssh_remote ssh://git@ubuntu.alfdxl.top:222/gitea-admin/git-template.git (fetch)
ssh_remote ssh://git@ubuntu.alfdxl.top:222/gitea-admin/git-template.git (push)

# 删除远程仓
$ git remote rm ssh_remote
$ git remote -v
origin http://ubuntu.alfdxl.top/gitea-admin/git-template.git (fetch)
origin http://ubuntu.alfdxl.top/gitea-admin/git-template.git (push)

checkout

分支切换和恢复工作区,基本格式:git checkout <BRANCH>

使用示例:

1
2
3
4
5
6
7
8
9
# 本地拉取远程指定分支代码
$ git checkout -b feat_adminuser origin/feat_adminuser
Branch 'feat_adminuser' set up to track remote branch 'feat_adminuser' from 'origin'.
Switched to a new branch 'feat_adminuser'

# 切换分支
$ git checkout master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.

branch

代码分支管理。

查看所有分支:git branch -a

删除分支:git branch -d <BRANCH>

使用示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 查看所有分支
$ git branch -a
* feat_adminuser
master
remotes/origin/HEAD -> origin/master
remotes/origin/feat_adminuser
remotes/origin/feat_build
remotes/origin/master

# 删除分支
$ git branch -d feat_adminuser
warning: deleting branch 'feat_adminuser' that has been merged to
'refs/remotes/origin/feat_adminuser', but not yet merged to HEAD.
Deleted branch feat_adminuser (was 3110aa8).

log

查看提交记录。基本格式:git log

使用示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# 查看提交记录
$ git log
commit 3110aa8502d24022cd08ba37d5dacd5160709214 (HEAD -> feat_adminuser, tag: v1.2.3, origin/feat_adminuser)
Author: 作者姓名 <作者邮箱>
Date: Tue May 10 11:41:36 2022 +0800

feat698: 新增创建管理员用户和查询用户信息功能;

commit 82f2ba7b82fa91335f3d226e3fee61cedea65945
Author: 作者姓名 <作者邮箱>
Date: Mon May 9 16:33:14 2022 +0800

fix696: 修复修改用户名都为常量的问题

commit bbb843b97d714df441275c488c8bd2f131efe42c (tag: v1.2.6, origin/master, origin/HEAD, master)
Author: zhangsan <zhangsan1598@gmail.com>
Date: Mon May 9 16:09:27 2022 +0800

feat1599: 新增修改用户名称的功能

commit 1ad9bce14ad8548c5b28bdd91398a3e4664909c5
Author: 作者姓名 <作者邮箱>
Date: Mon May 9 14:59:13 2022 +0800

feat1598: 新增创建用户的功能

commit 89b4f2cf3cd950686708d390126dec20da330257
Author: 作者姓名 <作者邮箱>
Date: Mon May 9 14:50:36 2022 +0800

other1598: 建立代码仓库

tag

标签管理。基本格式:git tag <TAG>

查看本地标签:git tag -l

新增本地标签:git tag <TAG>

删除本地标签:git tag -d <TAG>

使用示例:

1
2
3
4
5
6
7
8
9
10
11
# 查看本地标签
$ git tag -l
v1.2.3
v1.2.6

# 新增本地标签
$ git tag v1.2.3

# 删除本地标签
$ git tag -d v1.2.3
Deleted tag 'v1.2.3' (was 3110aa8)

add/rm

暂存区文件管理。暂存区的代码不会生成提交记录。

暂存区新增文件:git add <FILE>

暂存区删除文件:git rm <FILE>

使用示例:

1
2
3
4
5
6
7
8
# 暂存区新增文件
$ git add .
$ git add gw/*
$ git add gw/cmd/main.go

# 暂存区删除文件
$ git rm gw/internal/info/version.go
rm 'gw/internal/info/version.go'

commit

将暂存区的文件提交到本地仓。基本格式:git commit -m <MESSAGE>

使用示例:

1
2
3
4
5
# 提交到本地仓
$ git commit -m "fix866: 修复版本不匹配引起服务崩溃问题"
[master 3d4bf3c] fix866: 修复版本不匹配引起服务崩溃问题
3 files changed, 1 insertion(+), 6 deletions(-)
delete mode 100644 gw/internal/info/version.go

status

工作区状态查询。基本格式:git status

使用示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 无任何修改或提交的工作区状态查询
$ git status
On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean

# 有修改为提交的工作区状态查询
$ git status
On branch master
Your branch is ahead of 'origin/master' by 2 commits.
(use "git push" to publish your local commits)

Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: gw/cmd/main.go
deleted: gw/internal/info/version.go

Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: go.mod

Untracked files:
(use "git add <file>..." to include in what will be committed)
ReadMe.md

# 有提交未推送的工作区状态查询
$ git status
On branch master
Your branch is ahead of 'origin/master' by 3 commits.
(use "git push" to publish your local commits)

nothing to commit, working tree clean

reset

重置工作区指向的提交,即可以回退版本也可以撤销回退。

强制重置工作区:git reset --hard <ID>

工作区回退N次提交:git reset --hard HEAD~<N>

撤销工作区提交:git reset --soft <ID>

工作区撤销N次提交:git reset --soft HEAD~<N>

使用示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 强制重置工作区
$ git reset --hard 82f2ba7b82fa91335f3d226e3fee61cedea65945
HEAD is now at 82f2ba7 fix696: 修复修改用户名都为常量的问题
$ git reset --hard v1.2.3
HEAD is now at 3110aa8 feat698: 新增创建管理员用户和查询用户信息功能;
$ git reset --hard origin/master
HEAD is now at bbb843b feat1599: 新增修改用户名称的功能

# 工作区回退2次提交
$ git reset --hard HEAD~2
HEAD is now at 82f2ba7 fix696: 修复修改用户名都为常量的问题

# 撤销工作区提交
$ git reset --soft 82f2ba7b82fa91335f3d226e3fee61cedea65945

# 工作区撤销2次提交
$ git reset --soft HEAD~2

pull

获取远程仓最新提交记录并与本地记录进行合并。基本格式:git pull [REPO_NAME]

使用示例:

1
2
3
4
5
6
7
8
9
10
# 拉取代码
$ git pull
remote: Enumerating objects: 9, done.
remote: Counting objects: 100% (9/9), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 5 (delta 1), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (5/5), 435 bytes | 435.00 KiB/s, done.
From http://ubuntu.alfdxl.top/gitea-admin/git-template
fbd7e0a..01df67e feat_adminuser -> origin/feat_adminuser
Already up to date.

fetch

获取远程仓提交记录。基本格式:git fetch [REPO_NAME]

使用示例:

1
2
3
4
5
6
7
8
9
10
11
12
# 远程仓无变更
$ git fetch

# 远程仓有变更
$ git fetch
remote: Enumerating objects: 9, done.
remote: Counting objects: 100% (9/9), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 5 (delta 1), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (5/5), 433 bytes | 433.00 KiB/s, done.
From http://ubuntu.alfdxl.top/gitea-admin/git-template
3110aa8..fbd7e0a feat_adminuser -> origin/feat_adminuser

rebase

对本地分支进行变基操作。即缓存所有本地提交,将本地的基底与远程仓合并,再依次提交缓存的本地提交。与pull操作最大的不同是rebase操作可以保持提交记录的清晰度,参考文章。基本格式:git rebase [REPO_NAME]

使用示例:

1
2
3
4
5
6
7
8
9
10
11
12
# 变基操作
$ git pull
remote: Enumerating objects: 9, done.
remote: Counting objects: 100% (9/9), done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 5 (delta 1), reused 0 (delta 0), pack-reused 0
Unpacking objects: 100% (5/5), 435 bytes | 435.00 KiB/s, done.
From http://ubuntu.alfdxl.top/gitea-admin/git-template
fbd7e0a..01df67e feat_adminuser -> origin/feat_adminuser
Already up to date.
$ git rebase
Successfully rebased and updated refs/heads/feat_adminuser.

push

推送本地记录到远程仓。

推送提交记录:git push [REPO] [BRANCH]

推送标签记录:git push --tags [REPO] [BRANCH]

使用示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 推送本地提交记录
$ git push
Enumerating objects: 9, done.
Counting objects: 100% (9/9), done.
Delta compression using up to 8 threads
Compressing objects: 100% (4/4), done.
Writing objects: 100% (5/5), 453 bytes | 453.00 KiB/s, done.
Total 5 (delta 1), reused 0 (delta 0), pack-reused 0
remote:
remote: Create a new pull request for 'feat_adminuser':
remote: http://ubuntu.alfdxl.top/gitea-admin/git-template/compare/master...feat_adminuser
remote:
remote: . Processing 1 references
remote: Processed 1 references in total
To ssh://ubuntu.alfdxl.top:222/gitea-admin/git-template.git
3110aa8..fbd7e0a feat_adminuser -> feat_adminuser

# 推送标签记录
$ git push --tags
Total 0 (delta 0), reused 0 (delta 0), pack-reused 0
remote: .. Processing 2 references
remote: Processed 2 references in total
To http://ubuntu.alfdxl.top/gitea-admin/git-template.git
* [new tag] v1.2.3 -> v1.2.3
* [new tag] v1.2.6 -> v1.2.6

配置

参考文章

配置用户名、邮箱

1
2
git config --global user.name "名字"
git config --global user.email "邮箱"

配置编辑器

1
git config --global core.editor vim

配置日志显示格式

1
2
3
4
5
6
7
8
9
10
11
12
13
# 隐藏Merge --no-merges
# 过滤作者 --author='你的名字!自己修改!'

git config --global alias.lm "log --no-merges --color --date=format:'%Y-%m-%d %H:%M:%S' --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Cblue %s %Cgreen(%cd) %C(bold blue)<%an>%Creset' --abbrev-commit"
# 显示效果

git config --global alias.lms "log --no-merges --color --stat --date=format:'%Y-%m-%d %H:%M:%S' --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Cblue %s %Cgreen(%cd) %C(bold blue)<%an>%Creset' --abbrev-commit"

git config --global alias.ls "log --no-merges --color --graph --date=format:'%Y-%m-%d %H:%M:%S' --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Cblue %s %Cgreen(%cd) %C(bold blue)<%an>%Creset' --abbrev-commit"

git config --global alias.lss "log --no-merges --color --stat --graph --date=format:'%Y-%m-%d %H:%M:%S' --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Cblue %s %Cgreen(%cd) %C(bold blue)<%an>%Creset' --abbrev-commit"

git lm -n 5 | cat

git lm显示效果:

image-20230323104635608

git lms显示效果:

image-20230323104836558

git ls显示效果:

image-20230323104951086

git lss显示效果:

image-20230323105025239