Git分支管理及常用操作

分支管理

基本原则

【dev,feature】【release】【master,hotfix】

AoneFlow 只使用三种分支类型:master分支、feature分支、release分支,以及三条基本规则。

规则一,开始工作前,从master创建feature分支。

从代表最新已发布版本的master分支上创建一个通常以feature前缀命名的特性分支,然后在这个分支上提交代码修改。也就是说,每个工作项(可以是一个人完成,或是多个人协作完成)对应一个特性分支,所有的修改都不允许直接提交到master分支。

规则二,通过合并feature分支,形成release分支。

从master分支上拉出一条新分支,将所有本次要集成或发布的feature分支依次合并过去,从而得到release分支。release分支通常以release前缀命名。

规则三,发布到线上正式环境后,合并相应的release分支到master分支,在master分支上添加tag,同时删除该release分支关联的feature分支。

为了避免在代码仓库里堆积大量历史上的feature分支,还应该清理掉已经上线部分feature分支。如果要回溯历史版本,只需在master分支上找到相应的版本的tag即可。

Hotfix处理

除了基本规则,还有一些实际操作中不成文的技巧。比如上线后的Hotfix,正常的处理方法应该是,创建一条新的release分支,对应线上环境(相当于Hotfix分支),同时为这个分支创建临时流水线,以保障必要的发布前检查和冒烟测试能够自动执行。

其实还有一种简便方法是,将线上正式环境对应的release分支上关联的feature分支全部清退掉,在这个release分支上直接进行修改,改完利用现成的流水线(Pipeline)自动发布。如果非得修一个历史版本的Bug怎么办呢?那就老老实实地在master分支找到版本tag位置,然后从那个位置创建 Hotfix分支。

基础操作

拉取项目

fetch

将远程仓库所包含的分支的最新commit – id 记录到本地文件

pull

将远程仓库所包含的分支拉到本地,并进行合并。

相当于git fetch + git merge

check-out

选择当前工作分支

合并与回滚

merge

把分叉的提交历史放回到一起的方式

git merge 操作是区分上下文的。

当前分支始终是目标分支,其他一个或多个分支始终合并到当前分支。

所以,当需要将某个分支合并到目标分支时,需要先切到目标分支上。

git merge --abort

当合并的过程中,由于冲突难解决,你想放弃合并,回到未合并之前的状态;

reset commit

每次提交的代码都有一个唯一的commit id(版本号),当然,也可以通过 git log 查到。

回滚到指定版本:

git reset --hard  b498237e6dc1fc4861c79d3314d07285995b

cherry-pick

把指定的commit,拉到一个新的分支上

提交代码

add

添加到版本管理

commitFile

提交文件

commitDirectory

提交目录

push

将本地当前分支的代码推送到远程指定的分支上

提交记录查看

annotate

注释,显示当前代码所有行,是哪一天,谁提交的。

show History

显示提交记录

show History For Selection

显示代码块的提交记录

统计

查看所有人的提交行数

git log --format='%aN' 
| sort -u | while read name; 
do 
echo -en "$name\t"; 
git log --author="$name" --pretty=tformat: --numstat 
| grep "\(.java\)$" 
| awk '{ add += $1; subs += $2; loc += $1 - $2 } 
END 
{ printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' -; 
done

某个时间段的提交行数

git log --author=Username --since=2023-01-08 --until=2023-01-10 --format='%aN' 
| sort -u 
| while read name; do echo -en "$name\t"; 
git log --author="$name" --pretty=tformat: --numstat 
| grep "\(.html\|.java\|.xml\|.properties\)$" 
| awk '{ add += $1; subs += $2; loc += $1 - $2 } 
END 
{ printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' -; 
done