参考文档:
https://github.com/xirong/my-git/blob/master/git-workflow-tutorial.md#%E4%B8%80%E8%AF%91%E5%BA%8F
最近公司代码从svn 迁移到gitlab;虽然成功搭建了gitlab 服务,但是成功的应用到开发上还是出现了很多问题,找了几篇git 文章,优化提出了新的工作流方式,特此笔记,下文中大部分文字与图片摘自上文链接
我们现在用的git 工作流方案
1、一个主分支master,一个测试分支release,修复bug ,是线上的bug ,就拉取个热修复分支(线上的版本一般都是在master),release 上的分支就基于release拉取个bug 分支(git checkout -b bug_123 release),修复好了,pull request 到要修复的分支;
2、新功能开发,一般是基于release ,拉取新的分支 (git checkout -b task_123 relaese),开发好了在合并到release ,即使跨版本发布也是没有问题,只要一个新功能一个分支,可以做到快速迭代,大功能可以跨几个版本上线
3、发布新版本之后在master 上打一个tag 标记,用做版本区分(个人觉得用处不大,可能是公司太小~)
正常情况下我觉得一个新功能基于一个开发分支develop ,测试的测试分支在develop 上拉取一个release 测试,我觉得这才是比较正确的,我这个是基于公司司情才做出的改变,本质上我还是觉得测试还是从develop 拉取最好;
14、常用工作流
- 迭代需求会、冲刺会后确定本次迭代的目标后,将迭代内容视为一个项目,在 Gitlab 上创建一个 Repository,初始化工程代码结构,根据上线日期,比如20150730上线,开出分支 release20150730、dev20150730 两个分支,dev 分支作为日常开发主干分支,release 分支作为提测打包、Code Review 的分支。
- 迭代开始,日常开发进行中,开发人员在 dev 分支上进行 Commit、Push 代码,并且解决掉日常协同开发中的冲突等问题,等到达到提测条件的时候,提测者,首先 Merge Master 分支上的最新代码 git merge --no-ff origin/master ,使得 Master 分支上的变更更新到迭代开发分支dev上面,之后,在 Gitlab 上面发起 pull request 请求,并指定 Code Review 人,请求的分支选择本次上线的 release 分支,即 release20150730。
- 被指定 Code Review 的人,对发起者的代码 Review 后,决定是否可以提交测试,若有问题,评论注释代码后,提交者对代码进行进行修改,重复步骤2,直到代码 Review 者认为 Ok。之后便可以借助自己公司的打包部署,对这些代码发布到测试环境验证。
- 步骤2-3重复多次后,就会达到一个稳定可发布的版本,即上线版本,上线后,将 release 版本上面最后的提交(图中0.2.4上线对应处)合并到 Master 分支上面,并打 Tag0.3。至此,一次完整的迭代开发完成。
- 若此次上线后,不久发现生产环境有 Bug 需要修复,则从 Tag 处新开分支 release_bugfix_20150731、dev_bugfix_20150731 ,开发人员从 dev_bugfix_20150731分支上进行开发,提测code review在 release_bugfix_20150731 分支上,具体步骤参考2-3,测试环境验证通过后,发布到线上,验证OK,合并到 Master 分支,并打 Tag0.2.3,此次 Bug 修复完毕,专为解 Bug 而生的这两个分支可以退伍了,删除release_bugfix_20150731、dev_bugfix_20150731两分支即可。(所有的历史 Commit 信息均已经提交到了 Master 分支上,不用担心丢失)
Git 的一些使用原则(供参考)
- master:master永远是线上代码,最稳定的分支,存放的是随时可供在生产环境中部署的代码,当开发活动告一段落,产生了一份新的可供部署的代码时,发布成功之后,代码才会由 aone2 提交到 master,master 分支上的代码会被更新。应用上 aone2 后禁掉所有人的 master的写权限
- develop:保存当前最新开发成果的分支。通常这个分支上的代码也是可进行每日夜间发布的代码,只对开发负责人开放develop权限。
- feature: 功能特性分支,每个功能特性一个 feature/ 分支,开发完成自测通过后合并入 develop 分支。可以从 master 或者develop 中拉出来。
- hotfix: 紧急bug分支修复分支。修复上线后,可以直接合并入master。
Git-Develop 分支模式是基于 Git 代码库设计的一种需要严格控制发布质量和发布节奏的开发模式。develop 作为固定的持续集成和发布分支,并且分支上的代码必须经过 CodeReview 后才可以提交到 Develop 分支。它的基本流程如下:
- 每一个需求/变更都单独从Master上创建一条Branch分支;
- 用户在这个Branch分支上进行Codeing活动;
- 代码达到发布准入条件后aone上提交Codereview,Codereview通过后代码自动合并到Develop分支;
- 待所有计划发布的变更分支代码都合并到Develop后,系统再 rebase master 代码到Develop 分支,然后自行构建,打包,部署等动作。
- 应用发布成功后Aone会基于Develop分支的发布版本打一个“当前线上版本Tag”基线;
- 应用发布成功后Aone会自动把Develop分支的发布版本合并回master;
15
、
git
主流工作流
--Forking
工作流
这个是github 上常见的功能forcking ,我个人觉得这个更加适用于开源的项目,或者大型互联网公司开发使用;
简单说就是复制一个到自己的托管工具上(github或者gitlab),然后开发新功能,或者是修改了bug,搞定之后(pull request 或者merge request 到主干上(master));由管理者去Code Review合并
Forking工作流是分布式工作流,充分利用了Git在分支和克隆上的优势。可以安全可靠地管理大团队的开发者(developer),并能接受不信任贡献者(contributor)的提交。
Forking工作流和前面讨论的几种工作流有根本的不同,这种工作流不是使用单个服务端仓库作为『中央』代码基线,而让各个开发者都有一个服务端仓库。这意味着各个代码贡献者有2个Git仓库而不是1个:一个本地私有的,另一个服务端公开的。
Forking工作流的一个主要优势是,贡献的代码可以被集成,而不需要所有人都能push代码到仅有的中央仓库中。 开发者push到自己的服务端仓库,而只有项目维护者才能push到正式仓库。 这样项目维护者可以接受任何开发者的提交,但无需给他正式代码库的写权限。
效果就是一个分布式的工作流,能为大型、自发性的团队(包括了不受信的第三方)提供灵活的方式来安全的协作。 也让这个工作流成为开源项目的理想工作流。
15.1工作方式
和其它的Git工作流一样,Forking工作流要先有一个公开的正式仓库存储在服务器上。 但一个新的开发者想要在项目上工作时,不是直接从正式仓库克隆,而是fork正式项目在服务器上创建一个拷贝。
这个仓库拷贝作为他个人公开仓库 —— 其它开发者不允许push到这个仓库,但可以pull到修改(后面我们很快就会看这点很重要)。 在创建了自己服务端拷贝之后,和之前的工作流一样,开发者执行git clone命令克隆仓库到本地机器上,作为私有的开发环境。
要提交本地修改时,push提交到自己公开仓库中 —— 而不是正式仓库中。 然后,给正式仓库发起一个pull request,让项目维护者知道有更新已经准备好可以集成了。 对于贡献的代码,pull request也可以很方便地作为一个讨论的地方。
为了集成功能到正式代码库,维护者pull贡献者的变更到自己的本地仓库中,检查变更以确保不会让项目出错, 合并变更到自己本地的master分支, 然后pushmaster分支到服务器的正式仓库中。 到此,贡献的提交成为了项目的一部分,其它的开发者应该执行pull操作与正式仓库同步自己本地仓库。
我的理解是
这就就像在github 上fork 一个到本地开发,然后改完提交到自己的gitHub,你将你觉得好的修改pull request 到代码拥有者那,人家看完你的代码觉得好,就合并到自己的仓库中
这个是基于仓库的开发工作流,适用于大的开源项目
16
、
git
主流工作流
--
Gitflow工作流
这个我个人觉得更加的适合大多数企业开发
相对于使用仅有的一个master分支,Gitflow工作流使用两个分支来记录项目的历史。master分支存储了正式发布的历史,而develop分支作为功能的集成分支。 这样也方便master分支上的所有提交分配一个版本号。
每个新功能位于一个自己的分支,这样可以push到中央仓库以备份和协作。 但功能分支不是从master分支上拉出新分支,而是使用develop分支作为父分支。当新功能完成时,合并回develop分支。 新功能提交应该从不直接与master分支交互。
注意,从各种含义和目的上来看,功能分支加上develop分支就是功能分支工作流的用法。但Gitflow工作流没有在这里止步。
一旦develop分支上有了做一次发布(或者说快到了既定的发布日)的足够功能,就从develop分支上checkout一个发布分支。 新建的分支用于开始发布循环,所以从这个时间点开始之后新的功能不能再加到这个分支上—— 这个分支只应该做Bug修复、文档生成和其它面向发布任务。 一旦对外发布的工作都完成了,发布分支合并到master分支并分配一个版本号打好Tag。 另外,这些从新建发布分支以来的做的修改要合并回develop分支。
使用一个用于发布准备的专门分支,使得一个团队可以在完善当前的发布版本的同时,另一个团队可以继续开发下个版本的功能。 这也打造定义良好的开发阶段(比如,可以很轻松地说,『这周我们要做准备发布版本4.0』,并且在仓库的目录结构中可以实际看到)。
维护分支或说是热修复(hotfix)分支用于给产品发布版本(production releases)快速生成补丁,这是唯一可以直接从master分支fork出来的分支。 修复完成,修改应该马上合并回master分支和develop分支(当前的发布分支),master分支应该用新的版本号打好Tag。
为Bug修复使用专门分支,让团队可以处理掉问题而不用打断其它工作或是等待下一个发布循环。 你可以把维护分支想成是一个直接在master分支上处理的临时发布。
17
、
git
主流工作流
—
集中式工作流(同
svn
)
像Subversion一样,集中式工作流以中央仓库作为项目所有修改的单点实体。相比SVN缺省的开发分支trunk,Git叫做master,所有修改提交到这个分支上。本工作流只用到master这一个分支。
首先,开发者克隆中央仓库。在自己的项目拷贝中,像SVN一样的编辑文件和提交修改;但修改是存在本地的,和中央仓库是完全隔离的。开发者可以把和上游的同步延后到一个方便时间点。
然后,开发者发布修改到正式项目中,开发者要把本地master分支的修改『推』到中央仓库中。这相当于svn commit操作,但push操作会把所有还不在中央仓库的本地提交都推上去。
18
、
git
主流工作流
—
功能分支工作流
功能分支工作流仍然用中央仓库,并且master分支还是代表了正式项目的历史。 但不是直接提交本地历史到各自的本地master分支,开发者每次在开始新功能前先创建一个新分支。 功能分支应该有个有描述性的名字,比如animated-menu-items或issue-#1061,这样可以让分支有个清楚且高聚焦的用途。
对于master分支和功能分支,Git是没有技术上的区别,所以开发者可以用和集中式工作流中完全一样的方式编辑、暂存和提交修改到功能分支上。
另外,功能分支也可以(且应该)push到中央仓库中。这样不修改正式代码就可以和其它开发者分享提交的功能。 由于master是仅有的一个『特殊』分支,在中央仓库上存多个功能分支不会有任何问题。当然,这样做也可以很方便地备份各自的本地提交。
功能分支除了可以隔离功能的开发,也使得通过Pull Requests讨论变更成为可能。 一旦某个开发者完成一个功能,不是立即合并到master,而是push到中央仓库的功能分支上并发起一个Pull Request请求,将修改合并到master。 在修改成为主干代码前,这让其它的开发者有机会先去Review变更。
Code Review是Pull Requests的一个重要的收益,而Pull Requests则是讨论代码的一个通用方式。 你可以把Pull Requests作为专门给某个分支的讨论。这意味着可以在更早的开发过程中就可以进行Code Review。 比如,一个开发者开发功能需要帮助时,要做的就是发起一个Pull Request,相关的人就会自动收到通知,在相关的提交旁边能看到需要帮助解决的问题。
一旦Pull Request被接受了,发布功能要做的就和集中式工作流就很像了。 首先,确定本地的master分支和上游的master分支是同步的。然后合并功能分支到本地master分支并push已经更新的本地master分支到中央仓库。
仓库管理的产品解决方案像Bitbucket或Stash,可以良好地支持Pull Requests。可以看看Stash的Pull Requests文档。
功能分支我的理解就是一个功能一个分支,开发好了提交到gitlab ,然后发起请求合并