概述
Git是一个免费的开源分布式版本控制系统,旨在快速高效地处理从小型到大型项目的所有内容。下面这篇文章结合网上 [1] 和现实项目中对Git的分支模型使用做个总结
项目约定
分支描述
通常我们服务器上常驻的分支会有三个:develop、test、master
develop代表的是测试环境test代表的是测试环境master代表的是生产环境
可以认为:
master分支上的任何一个点都属于release代码,可以部署到生产环境服务器develop分支上每个点都能启动运行,但是最新代码未经测试,可能还存在bugtest分支上每个点代表开发完成正在进行测试,测试系统部署服务就是该分支
注意事项:切记不要在master分支上面直接提交代码,不要直接使用git push origin master
分支命名
命名(xxx可代表gitlab或github创建issues id的编号),hotfix、fix、custom、feature、improvement可分别代表需求类型,具体如下:
- xxx-hotfix:线上bug需求
- xxx-fix:未部署代码中的bug需求
- custom-{项目名}:定制项目需求
- xxx-feature:新特性功能需求
- xxx-improvement:改进重构等都可算改进需求
常用命令
git clone https://github.com/3tu/spring-cloud-demo.git # 从线上克隆代码,
git branch # 查看代码本地分支,首次克隆下的代码默认在master
git checkout develop # 切换到develop开发分支
git checkout -b xxx-xxx # 从develop分支切出本地开发子分支
git fetch && git rebase # 注:不是首次克隆,可以运行该命令,进行代码更新
git status # 查看本地修改的文件状态,也可以安装客户端软件查看分支状态,eg:SourceTree
git add . # 添加修改文件到本地暂存区,“.”代表所有修改,也可以指定文件路径添加单个文件
git commit -m “修改注解” # 提交暂存区代码到本地子分支
git push origin xxx-xxx # 提交本地分支带远程仓库中
主要流程
生产环境主要流程大致可分为以下五种
- 已发布版本(生产环境)
bug处理 - 未发布版本(测试环境)
bug处理 - 新特性开发
- 改进或者重构开发
- 项目定制开发
已发布版本bug处理
从test分支检出,处理完成后双向合并到test和develop,检出的分支不提交到服务器
# 从test分支检出
git checkout test # 切换到 test 分支
git fetch && git rebase # 进行代码更新,用 git pull --rebase 也可以,注意别用 git pull,会导致git网络图混乱
git checkout -b xxx-hotfix # 从test分支切出BUG子分支,“xxx”代表issues的ID值
# 在${xxx-hotfix}分支上完成Bug处理,一次或多次 git commit
# 双向合并到test和develop
git checkout develop
git fetch && git rebase
git merge --no-ff ${xxx-hotfix} # 在develop分支拉取BUG子分支代码进行合并
git push origin develop
git checkout test
git fetch && git rebase
git merge --no-ff ${xxx-hotfix} # 在test分支拉取BUG子分支代码就行合并
git push origin test # 把合并完的master分支推到服务器上
git branch -d ${xxx-hotfix} # 删除本地开发分支
未发布版本bug处理
# 从develop分支检出
git checkout develop # 切换到develop分支
git fetch && git rebase # 从服务器下载最新代码,并与本地修改合并(如果有)
git checkout -b xxx-fix # 从develop分支切出BUG子分支
# 在${xxx-hotfix}分支上完成Bug处理,一次或多次 git commit
# 合并到develop分支
git checkout develop
git fetch && git rebase
git merge --no-ff ${xxx-fix} # 在develop分支拉取BUG子分支代码进行合并
git push origin develop
git branch -d ${xxx-fix} # 删除本地开发分支
新特性开发
从develop分支检出,开发完合并到develop分支,检出的新特性分支需要提交到服务器上,便于多人协作
# 从develop分支检出
git checkout develop
git fetch && git rebase # 从服务器下载最新代码,并与本地修改合并(如果有)
git checkout -b ${xxx-feature} # 从develop分支切出新功能子分支,分支名用小写英文单词,多个单词以短横线"-"分隔
# 提交新特性分支到服务器
git push origin ${xxx-feature}
# 在${xxx-feature}分支上开发,多次git commit和git push origin ${xxx-feature}
# 在gitlab中创建一个pull request
改进或重构开发
改进或重构开发流程和新特性开发流程一致,分支命名上用${xxx-improvement}
定制项目开发
从master分支检出custom-${name},开发完成后合并到custom-${name}分支,分支提交到服务器,便于多人协作
# 从master分支检出
git checkout master
git fetch && git rebase
git checkout -b custom-${name} # 注意分支名以custom-加具体项目命名
# 提交定制项目分支到服务器
git push origin custom-${name}
# 在custom-${name}分支上开发,提交到定制分支
git add .
git commit -m “提交注解”
git fetch && git rebase # push前进行代码更新
git push origin custom-${name} # 项目定制分支不用进行merge到其他分支
# 如需要详细定制、多人协作开发的项目可将该子分支代码移custom(定制项目group)中
其他处理
合并请求处理
# 代码审核
# 合并到develop分支
git checkout develop
git merge --no-ff ${feature_name}
# 提交develop到服务器,并删除新特性分支
git push origin develop
# 删除本地的分支
git branch -d ${feature_name}
# 删除服务器上的分支
git push origin :${feature_name}
相同分支的合并不要用git merge,也不要用git pull,建议使用用git rebase
清除本地驻存的分支
git branch -rd origin/{branch-name} # 清除本地分支
# 新功能开发时,需要将develop上面代码合并到自己新功能分支上
git checkout ${xxx-feature} # 在新功能分支进行操作
git fetch && git rebase # 更新最新代码(本地代码已提交到本地仓库)
git merge --no-ff develop # 在新功能分支拉取develop分支代码进行合并
# 将最新的develop分支代码合并到新功能分支,这里可能需要处理冲突
git push origin :${xxx-feature} #然后删掉远程仓库的该功能分支
git push origin ${xxx-feature} #将该新的新功能分支重新推到服务器
参考资料
我是三土,感谢各位朋友:点赞、收藏和评论,我们下期再见!