常用工具-Git简介
流程介绍
基本原则
简单。不增加过多学习成本,开发测试快速迭代。
可追溯。每个现场环境运行的软件版本号都由主仓发布,主仓关键分支禁用代码强制提交。
简化流程
所有开发人员都从主仓的开发分支克隆(clone)代码。在本地修改代码,本地仓新增(add)提交。待所有代码调试完毕,准备推送(push)到主仓。在推送主仓前先获取(fetch)主仓最新提交记录。
完整流程
私有仓从主仓派生(fork),本地仓从私有仓克隆(clone)。
主仓所有开发人员只能发起合并请求(merge),禁止发起推送请求(push),经仓负责人检视后合入主仓。主仓只有开发(develop)分支接受私有仓代码合并请求,其他分支不接受私有仓代码合并请求。
版本管理
版本号规范
版本号基本结构:v主版本号.子版本号.修订版本号。版本号会以标签(TAG)的方式指向各分支的某次提交记录。
参考:产品中心发布的版本号命名规范
主版本号
- 大的代码重构导致此版本号变更;
- 主版本号变更可能导致向下兼容问题;
子版本号
- 有大的功能变动;
- 可能影响向下兼容,但是可以通过技术手段进行数据或者业务转换;
修订版本号
- 修改程序内部 bug,程序功能无变化;
- 绝对向下兼容;
分支策略
- 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仓库地址支持HTTP和SSH协议。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
2git 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显示效果:
git lms显示效果:
git ls显示效果:
git lss显示效果: