如何让Git适应敏捷开发流程?
一旦涉及版本控制系统,Git实际上代表敏捷开发的水平。Git作为一款强大的开源系统,有较强的灵活性,可以按需匹配任何开发团队的工作流程。而这种分布式相比较集中式来说,自然赋予系统更好的性能特征,且允许开发人员在本地自由实验,在他们修改到自己认为没有问题时再发布到团队。
除了灵活性和分布式等优点外,Git的主要职能是支持和强化敏捷开发。将Git视为敏捷开发的一部分,与单片发布和集中版本控制系统相比,所有变更可以更快部署。
专家提示: Git是分布式版本控制系统(DVCS)。与CVS或Subversion (SVN)等工具不同,Git允许开发人员在团队资源库中创建个人独有的分支,并与主代码库并行存储。这些自创副本被称为fork。fork上的工作完成后,开发人员可以很轻松地将更改上传至主代码库。
方法一:将开发任务视为Git的分支
在产品功能细化并添加至产品路线图,开发团队做好开工准备后,Git开始发挥作用。但在正式开发之前,团队需要有一个敏捷功能开发速成课:产品、设计、质保(QA)、研发要开一个功能启动会就具体的功能、项目范围以及为了确保完成这些功能该被分解成什么样的任务等方面达成共识。在这些被称为用户故事的任务拆解完成之后,任务会分配给各个开发人员。
Git也是在这个时候参与到我们的敏捷开发流程中。在Worktile,我们会为每个独立的任务创建一个新的分支,无论是新的功能,BUG修复还是对现有代码的调整,每次代码的更改都会创建新的分支作为开发分支,等我们把功能完全做完之后,会提交Pull Request 到develop分支或者其他我们稳定的分支中,有管理员或者其他有合并权限的成员进行代码 Review,之后合并代码。 分支的应用使任务变得直观易懂,同时允许团队在一个中央代码库内轻松协作。开发人员一旦创建了分支,就意味着他们实际上拥有独立于中央代码库之外的个人代码库。
对敏捷团队而言,将功能拆分为用户故事后创建相应的分支,意味着开发团队的成员可以单独处理各自的任务,基于相同的代码库在不同的仓储下工作。开发工作量并未因此增加,因为开发人员能够更专注在与主仓储分开的小块任务,这样也避免因为存在过多依赖关系而减缓开发进程。
专家提示: 除了设置任务分支之外,还可以设置其他类型的Git分支,且它们之间可以兼容并存。例如,我们可以为单个版本的发布设置不同的分支,这样可以让开发人员为特定版本进一步制定稳定和强化的工作计划,而同时也不会影响到其他开发人员开发未来的版本。
创建单个版本发布的分支之后,需要定期将其融合到主分支任务中,确保所涉及的功能都能兼容到未来的版本中并发挥作用。为了最大限度地减少积压,所创建的单个版本发布的分支最好尽可能接近计划发布日期。
方法二:充分利用多分支可单独测试的优势
分支一旦被认为已经完成并可以进行代码review后,Git就开始在敏捷开发流程中扮演另外一个关键角色:测试。成功的敏捷团队会进行代码review并进行自动化测试(持续集成)。为了更好地完成代码review和测试工作,开发人员可以直接通知团队其他成员该分支已经完成可以review,然后提交Pull Request。简单来讲,Pull Request就是请求其他开发人员将你已经做好可以进行测试的分支合并到主分支上。
如果工具使用得当,持续集成服务器就可以在合并之前创建并检测你提交的Pull Request。这样做能确保合并分支不会出现问题。通常情况下,还能让我们更轻松地重新定位Bug修复和冲突,因为在各分支之间存在分歧时,Git能够区分各分支与主代码库之间的差异。
专家提示: 一个长期运行且未合并到主分支的分支,可能会影响团队的敏捷性和迭代能力。如果存在一个长期运行的分支,就意味着实际上存在两个不同版本的代码库,而这将直接带来更多的bug修复工作和冲突。最好的解决方式是设定短期的分支,可以通过将用户故事拆分为较小的任务、更为细致的sprint规划以及尽早合并代码作为隐性特征(dark features)等这些方式来实现。
方法三:Git确保敏捷开发的透明度和质量
Git/敏捷故事通常与效率、测试、自动化和整体敏捷性有关。将分支合并到主分支后,敏捷的工作流程就完成了。同样,通过提交Pull Request将代码合并后,意味着在代码完成的同时,所有文档中的工作也已经完成,团队其他成员已经停止代码活动,且已经可以进行发布。这使得敏捷团队可以快速而自信地进行频繁的发布:这也是成功敏捷团队的一个标志。
专家提示: 定期发布是敏捷开发的关键。要让Git适应敏捷工作流程,就要确保主分支一直是健康畅通的。这意味着,如果某个功能尚未做好,就可以等到下次再发版。如果团队想尝试较短的发版周期,也是可以的。
文章来源:Worktile敏捷博客
欢迎访问交流更多关于技术及协作的问题。
文章转载请注明出处。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Java并发编程笔记——J.U.C之executors框架:executors框架设计理念
一、executors框架简介 juc-executors框架是整个J.U.C包中类/接口关系最复杂的框架,真正理解executors框架的前提是理清楚各个模块之间的关系,高屋建瓴,从整体到局部才能透彻理解其中各个模块的功能和背后的设计思路。 网上有太多文章讲executors框架,要么泛泛而谈,要么一叶障目不见泰山,缺乏整体视角,很多根本没有理解整个框架的设计思想和模块关系。本文将对整个executors框架做综述,介绍各个模块的功能和联系,后续再深入探讨每个模块,包括模块中的各个工具类。 从Executor谈起 Executor是JDK1.5时,随着J.U.C引入的一个接口,引入该接口的主要目的是解耦任务本身和任务的执行。我们之前通过线程执行一个任务时,往往需要先创建一个线程,然后调用线程的start方法来执行任务: newThread(new(RunnableTask())).start(); 上述RunnableTask是实现了Runnable接口的任务类。而Executor接口解耦了任务和任务的执行,该接口只有一个方法,入参为待执行的任务: public interface ...
- 下一篇
浅谈lambda表达式
Java8发布已经有一段时间了,这次发布的改动比较大,很多人将这次改动与Java5的升级相提并论。Java8其中一个很重要的新特性就是lambda表达式,允许我们将行为传到函数中。想想看,在Java8之前我们想要将行为传入函数,仅有的选择就是匿名内部类。Java8发布以后,lambda表达式将大量替代匿名内部类的使用,简化代码的同时,更突出了原来匿名内部类中最重要的那部分包含真正逻辑的代码。尤其是对于做数据的同学来说,当习惯使用类似scala之类的函数式编程语言以后,体会将更加深刻。现在我们就来看看Java8中lambda表达式的一些常见写法。 lambda体中调用方法的参数列表和返回值类型,要和函数式接口中抽象方法的参数列表和返回值类型保持一致。 一、替代匿名内部类 lambda表达式用的最多的场合就是替代匿名内部类,实现Runnable接口是匿名内部类的经典例子。lambda表达式的功能相当强大,用()->就可以代替整个匿名内部类! package OSChina.Lambda; import org.junit.Test; import java.util.Co...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
-
Docker使用Oracle官方镜像安装(12C,18C,19C)
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS8编译安装MySQL8.0.19
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- MySQL8.0.19开启GTID主从同步CentOS8
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
推荐阅读
最新文章
- Hadoop3单机部署,实现最简伪集群
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- 设置Eclipse缩进为4个空格,增强代码规范
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS8编译安装MySQL8.0.19
- Red5直播服务器,属于Java语言的直播服务器