互联网公司常用的Git分支管理模型 | 开发工具

1,170 阅读4分钟

概述

Git是一个免费的开源分布式版本控制系统,旨在快速高效地处理从小型到大型项目的所有内容。下面这篇文章结合网上 [1] 和现实项目中对Git的分支模型使用做个总结

项目约定

分支描述

通常我们服务器上常驻的分支会有三个:developtestmaster

  • develop代表的是测试环境
  • test代表的是测试环境
  • master代表的是生产环境

可以认为:

  • master分支上的任何一个点都属于release代码,可以部署到生产环境服务器
  • develop分支上每个点都能启动运行,但是最新代码未经测试,可能还存在bug
  • test分支上每个点代表开发完成正在进行测试,测试系统部署服务就是该分支

注意事项:切记不要在master分支上面直接提交代码,不要直接使用git push origin master

分支命名

命名(xxx可代表gitlabgithub创建issues id的编号),hotfixfixcustomfeatureimprovement可分别代表需求类型,具体如下:

  • 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分支检出,处理完成后双向合并到testdevelop,检出的分支不提交到服务器

# 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}	#将该新的新功能分支重新推到服务器

参考资料

[1] nvie.com/posts/a-suc…

我是三土,感谢各位朋友:点赞、收藏和评论,我们下期再见!