本文囊括2076字
Git 作为一个强大的分布式版本控制系统,对比 SVN、CVS 等版本控制系统,其架构和设计在研发管理和协作上有着极大的优势。在个人开发的代码管理和团队协作过程中,合理使用分支能在极大程度上提升管理效率。这篇文章根据张三、李四、赵六开发成长历程改编,解读了在企业开发过程中进行协作开发的分支模型。
从不用版本管理 到 使用 Git 分支管理的故事,也就是从这个时候开始的。。。
3人通过本地仓库 master 分支向远程仓库 master 分支提交代码
解决频繁的代码提交冲突
协作了几天,团队发现提交代码 master 时候,经常产生代码冲突,要么张三和李四的代码冲突,要么李四跟赵六的代码冲突。这时总要有人把代码拉下来解决冲突。才能保证后续开发工作顺利进行。同时,由于缺少代码审查。部分质量较差的代码和无关内容也时不时被提交上去。
团队在解决冲突和代码重构的问题上花费了不少精力。。。
本地 master 分支检出新分支开发推送到远端仓库后,通过 Pull Request 合并到 master,然后拉回本地 master。
初步解决代码迭代版本问题
通过远程仓库 master 分支在版本发布时,检出一个以版本号命名的分支,作为特定版本管理。
团队增长带来的困扰
- 随着协作人数增多,远程仓库分支数量快速增长,查找起来很麻烦,经常出现分支重名问题。
- 分支命名混乱,提交新功能的分支和修复Bug的分支经常混淆在一块。
- 版本迭代的速度太快,产生了一大堆的 Realease 分支,又带来了一堆的管理问题。
- 还没来得及合并或独立维护的分支,时间久了容易出现管理遗漏和维护混乱。
- 虽然有 Code Review,但程序的 Bug 数和 Crash 频率明显随团队规模而增长,生产事故发生率和回滚率提高。
- 还有人把手头未完成开发的分支扔到远程仓库进行托管。
单个仓库还是多个仓库?
经过讨论,为了降低反复增加加仓库协作者名单的协作成本,三人统一意见继续保留使用 单仓库多分支 的方式。
用「分支模型」规范分支管理
经过一番讨论,三人达成了一致的意见,并针对上面的 分支模型 提出了些许细节的调整。
灵活使用 Git tag 和发行版管理功能
- 在 git 中,标签(tag)是特定提交(commit) 的一个指针,也就是每个 tag 对应一个特定的 commit。release/* 系列分支在实质上就是合并到 Product (master) 分支上成为一个特殊提交,所以 tag 的存在使得没有必要保留 release/* 分支。
- 另外,一般形如[码云]这样的 git 代码托管平台,本身自带「发行版(Release)」功能。
- 通过 git 本身只能记录项目的修改,而版本发布带来的项目构建物(特别是二进制文件)本身在某种意义上就不适合通过 git 进行存储。
- 通过「发行版(Release)」功能,可以将对应版本的源代码和生成的项目构建物(比如exe/dmg)保存下来,还支持编写对应的 Changelog,便于查找下载。
使用 Git-flow 脚本规范本地分支和开发
Git-flow 通过交互方式定义各类功能分支
通过一系列命令简化各种分支模型的管理操作,小范围功能可以通过本地合并到本地分支,或直接推送到远程再通过 Pull Request 合并操作。
企业级软件协作开发的管理平台 有序规划和管理软件研发全生命周期