一个 Git 分支协作模式的进化故事

从不用版本管理到使用 Git

分支管理的故事,也就是从这个时候开始的。。。

某公司只有一个程序员,一开始并没有版本管理的概念。项目开发只有一个人在参与,所以也没用版本管理工具。

后来,老板又招了两个程序员,老板说:“研发管理要规范!”,经过一番调研,选用了 Git,三个人开始使用 Git 进行开发上的协作。

一开始,三个人都是通过一个仓库,在 master 分支上进行协作。每天上班第一件事就是先把最新的代码从服务器上拉到本地的 master 分支,下班前再把代码给推到服务器上的 master 分支,项目就这样展开了协作。

3人通过本地仓库 master 分支向远程仓库 master 分支提交代码

解决频繁的代码提交冲突

协作了几天,团队发现提交代码 master 时候,经常产生代码冲突,要么张三和李四的代码冲突,要么李四跟赵六的代码冲突。这时总要有人把代码拉下来解决冲突。才能保证后续开发工作顺利进行。同时,由于缺少代码审查。部分质量较差的代码和无关内容也时不时被提交上去。

团队在解决冲突和代码重构的问题上花费了不少精力。。。

为了解决单一分支频繁更新容易发生冲突的问题,三人开始研究使用分支的方式进行协作。通过在本地 master 检出新分支,修改后将新分支推送到远程仓库,再通过 拉取合并请求(Pull Request)在远程仓库上合并分支到 master 分支。最后再把代码从远程 master 拉取到本地 master 进行更新。在这个基础上,团队也开始展开相互的 代码审查(Code Review)工作。

本地 master 分支检出新分支开发推送到远端仓库后,通过 Pull Request 合并到 master,然后拉回本地 master。

初步解决代码迭代版本问题

经过一番折腾,几个人的协作总算能比较稳定地进行。在后续数周内,团队开发工作顺利展开,项目也得以落地,进入快速迭代阶段。为了解决迭代的版本问题,团队使用分支对每次版本发布检出一个分支进行保留。

通过远程仓库 master 分支在版本发布时,检出一个以版本号命名的分支,作为特定版本管理。

团队增长带来的困扰

两个月后,公司迎来了业务的快速增长。技术团队从原来三个人快速增长到十来个人。原来的成员开始带着新人做业务,随着团队的增长,原有的协作方式再次遇到各种各样的问题。经过短短一周的磨合,三人无比疲惫地坐到一起,对过去一周遇到的问题进行了复盘:

  • 随着协作人数增多,远程仓库分支数量快速增长,查找起来很麻烦,经常出现分支重名问题。
  • 分支命名混乱,提交新功能的分支和修复Bug的分支经常混淆在一块。
  • 版本迭代的速度太快,产生了一大堆的 Realease 分支,又带来了一堆的管理问题。
  • 还没来得及合并或独立维护的分支,时间久了容易出现管理遗漏和维护混乱。
  • 虽然有 Code Review,但程序的 Bug 数和 Crash 频率明显随团队规模而增长,生产事故发生率和回滚率提高。
  • 还有人把手头未完成开发的分支扔到远程仓库进行托管。

经过讨论三个人都意识到了问题所在,但无奈三人对于多人协作开发经验不多,讨论无果后,决定各自调研,再对比讨论。两天后,三个人带着方案展开了探讨。

单个仓库还是多个仓库?

在仓库管理的方案上,张三主张使用 单仓库多分支 的方式进行管理,李四则主张使用 多仓库多分支 的方式进行管理。

经过讨论,为了降低反复增加加仓库协作者名单的协作成本,三人统一意见继续保留使用 单仓库多分支 的方式。

用「分支模型」规范分支管理

在分支策略上,张三提出了使用 分支模式 作为分支管理规范化的解决方案,从 分支类型、用途 等角度规范开发的协作方式。

经过一番讨论,三人达成了一致的意见,并针对上面的 分支模型 提出了些许细节的调整。

灵活使用 Git tag 和发行版管理功能

针对单个仓库协作可能存在分支数量增长的问题,张三提出通过 Git tag 来取代 release/* 版本分支的作用。

  • 在 git 中,标签(tag)是特定提交(commit) 的一个指针,也就是每个 tag 对应一个特定的 commit。release/* 系列分支在实质上就是合并到 Product (master) 分支上成为一个特殊提交,所以 tag 的存在使得没有必要保留 release/* 分支。
  • 另外,一般形如[码云]这样的 git 代码托管平台,本身自带「发行版(Release)」功能。
  • 通过 git 本身只能记录项目的修改,而版本发布带来的项目构建物(特别是二进制文件)本身在某种意义上就不适合通过 git 进行存储。
  • 通过「发行版(Release)」功能,可以将对应版本的源代码和生成的项目构建物(比如exe/dmg)保存下来,还支持编写对应的 Changelog,便于查找下载。

使用 Git-flow 脚本规范本地分支和开发

除了在远程仓库上的管理方案,张三还建议提倡团队成员通过 [git-flow] 一系列的脚本扩展,规范本地的分支管理和开发流程。现网络上最流行的 git-flow 方案应该是 AVH 版 git-flow:https://nvie.com/posts/a-successful-git-branching-model/ 。通过安装后,开发成员可以在本地通过对项目的各类功能分支进行定义。

Git-flow 通过交互方式定义各类功能分支

通过一系列命令简化各种分支模型的管理操作,小范围功能可以通过本地合并到本地分支,或直接推送到远程再通过 Pull Request 合并操作。

经过一番调研和讨论,三人最终决定了团队在代码协作上使用 单仓库多分支 的方式,采用 分支模型 进行管理。

接下来的问题就比较简单了,在码云 gitee.com 上新建仓库,选择相应的分支模型即可。Git 的分支相比 SVN 来说是非常轻量级的,善用分支有利于更清晰的进行开发过程的管理。

原文地址:https://www.cnblogs.com/jiangchunsheng/p/11381407.html

时间: 2024-08-29 08:36:55

一个 Git 分支协作模式的进化故事的相关文章

三人小团队git分支协作试水

场景: 正在开发某一个新功能 或修复某个bug,未完全完成时 暂时不能提交到master 此时 测试需要更新一个测试版本 或者其他... 然而  master并不能正常跑通所有流程 思路: 1.保证有一份代码是无论何时都是可正常跑通所有流程的完全体代码,要求新增的功能可能已经部分添加进去也可能没有,反正测试人员就是要重新再安装一个最新版本 : ( 2.正在开发的功能在未完成之前不能交给测试人员来运行测试,但是也不能为了装新版本久把刚写不多的代码注释活着删掉(我以前就这么干过,猪都笑我) 3.新增

git 分支改名

给一个git分支改名的方法很简单 如果对于分支不是当前分支,可以使用下面代码: git branch -m 原名 新 如果是当前,那么可以使用加上新名字 git branch -m 原名 参见: http://zengrong.net/post/1746.htm 本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可.欢迎转载.使用.重新发布,但务必保留文章署名林德熙(包含链接:http://blog.csdn.net/lindexi_gd ),不得用于商业目的,基于本

【转】一个成功的Git分支模型 .

---恢复内容开始--- 能力所限,本文的翻译多处都很不地道,如果哪些地方难于理解,还烦请查看原文.—— Dbzhang800 20110921 在本文中,我向大家介绍的是在大约一年前我为自己的项目(包括工作和私人项目)引入的且已被证实非常成功的一个开发模型(development model).这段时间我一直想写点关于它的东西,但在此之前,我却从未能抽出充足的时间来完成这件事.我不会谈论项目的任何细节,只涉及分支策略(branching strategy)和发布管理(release manag

一个成功的 Git 分支模型

本文由 伯乐在线 - henry 翻译,sunbiaobiao 校稿.未经许可,禁止转载! 在这篇文章中介绍的开发模型在大约一年前已经在我的私有项目和工作引入的,而且已经被证明是非常成功的.我想写一些关于这个模型的东西已经好一段时间了,但是一直苦于没有时间,不过现在可以了.我不想探讨任何项目细节,只讨论分支策略和发布管理. 这篇文章围绕着Git做为我们所有的源代码版本控制工具而展开的. 为什么是Git 为了深入探讨git和集中式源码版本控制系统的利弊,参见这些文章.这方面有太多的激烈争论.作为一

一个成功的 Git 分支模型(适用于商业应用开发)

在这篇文章中,我将推广一下大约一年前我介绍过的一些项目(公私皆有)中使用的开发模型,它们的结果都非常成功.有段时间我非常想写出来分享一下,但是我至今才抽出时间来.我不会言及任何项目细节,仅讨论分支策略和发布管理. 为何使用 git? 关于 Git 和集中式源码版本控制系统的优缺点对比讨论, 见 此 web.这里有很多精彩激烈的论战.作为一名开发者,现在我更偏好使用 Git .Git 真的改变了开发者关于合并和分支的认知.我来自传统的 CVS/Subversion 世界,合并/分支是件恐怖的事情

(转载)介绍一个成功的 Git 分支模型

介绍一个成功的 Git 分支模型 在这篇文章中,我提出一个开发模型.我已经将这个开发模型引入到我所有的项目里(无论在工作还是私人)已经一年有余,并且它被证明是非常成功的.我打算写这些已经很久了,但我一直找不到时间来做,现在终于有时间了.我不会讲任何项目的具体细节,仅是关于分支策略和释放管理相关内容. 它主要体现了Git对我们源代码版本的管理. 为何是Git? 对于Git与其他集中式代码管理工具相比的优缺点的全面讨论,请参见这里.这样的争论总是喋喋不休.作为一个开发者,与现今的其他开发工具相比较,

介绍一个成功的 Git 分支模型 Release 分支

英文原文: http://nvie.com/posts/a-successful-git-branching-model/ 中文版: 在这篇文章中,我提出一个开发模型.我已经将这个开发模型引入到我所有的项目里(无论在工作还是私人)已经一年有余,并且它被证明是非常成功的.我打算写这些已经很久了,但我一直找不到时间来做,现在终于有时间了.我不会讲任何项目的具体细节,仅是关于分支策略和释放管理相关内容. 它主要体现了Git对我们源代码版本的管理. 为何是Git? 对于Git与其他集中式代码管理工具相比

Git团队协作工具

-- 故国神游,多情应笑我,早生华发. Git是什么? Git是一个版本控制工具,代码管理工具,团队协作工具.它跟SVN等传统工具实现同样的目的:但从某种程度来说,它更快,更灵活.我想绝大多数读者都已经在接触这个工具了,并且用于日常的项目中去了.我的这篇文章,不是作为一个Git入门教程,也不是作为一本大块头的教科书.(说到教科书,我推荐下面的这本.这本书确实好,很全面.我的这篇文章,其实就是这本书的读书笔记而已.) Pro Git -- http://git.oschina.net/progit

GitHub超详细图文攻略 - Git客户端下载安装 GitHub提交修改源码工作流程 Git分支 标签 过滤 Git版本工作流(转载)

最近听同事说他都在使用GitHub,GitHub是程序员的社区,在里面可以学到很多书上学不到的东西,所以最近在准备入手这方面的知识去尝试学习,正好碰到这么详细完整的文章,就转载了,希望对自己和大家有帮助. GitHub操作总结 : 总结看不明白就看下面的详细讲解. GitHub操作流程 : 第一次提交 : 方案一 : 本地创建项目根目录, 然后与远程GitHub关联, 之后的操作一样; -- 初始化Git仓库 :git init ; -- 提交改变到缓存 :git commit -m 'desc