赞
踩
因为Sourcetree的mac版本和window版本界面和操作方式有所差异,一直在网上找不到合适的教程或者指导说明,就干脆自己写一个。
如果已经了解什么是git flow工作流及其代码操作方式的同学,可以直接跳到 3.mac中使用Sourcetree实现git flow 这一步进行学习。
2010年5月,在一篇名为“A successful Git branching model”的博文中,原Git Prime的首席技术官Vincent Driessen介绍了一种构建在Git(一个开源的分布式版本控制系统)之上的软件开发模型。通过利用Git创建和管理分支的能力,为每个分支设定具有特定的含义名称,并将软件生命周期中的各类活动归并到不同的分支上,实现了软件开发过程不同阶段的相互隔离。这种软件开发的活动模型被Vincent称为“Git Flow”(Git工作流程)。Git Flow已经开始流行于基于主干的工作流,它现在被认为是现代连续软件开发和DevOps(开发、技术运营和质量保障三者的交集)实践的最佳实践。
git flow的核心就是分支(branch),通过在项目的不同阶段,创建不同的分支并完成不同的操作来实现一个完整高效的工作流。git glow的分支又分为两大类:长期分支和短期分支,其中主分支包括master(主要分支)和develop(开发分支),辅助分支包括feature(功能分支)、release(预发布分支)、hotfix(补丁分支)和其他自定义分支。
(1)初始化仓库(需要已经存在master分支,目前git项目主分支时main分支,可以先创建master分支后删除main分支,或者直接使用main分支作为主分支)
(2)基于master分支创建develop分支
(1)基于develop分支创建feature分支
(2)功能分支开发完成后,合并到develop分支
(1)基于develop创建release分支
(2)完成后merge到master分支,同时打个标签,之后在merge到develop分支
(1)基于master创建hotfix分支
(2)修复bug后,merge到master分支,同时打个标签,再merge到develop分支
(1)创建并切换到develop分支(基于master分支)
git checkout -b develop master
(2)创建并切换到feature分支(基于develop分支)
git checkout -b feature/Vx.x.xx.xx develop
feature/Vx.x.xx.xx中的x.x.xx.xx
第一个x代表着主版本
第二个x代表着次版本
第三个xx代表着补丁版本
按理说到这里就结束了,但是因为git项目经常是多人开发,因此为了避免频繁地更替补丁版本,因此又加了一级。
详情可参照npm的语意版本控制
完成功能开发后,将功能合并到develop分支
# 切换到develop分支
git checkout develoop
# 合并功能分支
git merge feature/Vx.x.xx.xx
# 删除功能分支
git branch -d feature/Vx.x.xx.xx
当然你也可以选择不删feature-x分支,但是通常情况下,因为分支已经合并到develop分支,这就意味着feature/Vx.x.xx.xx分支的工作已经结束,并且创建新的预发布分支,测试其内容,并且进行修正。因此feature/Vx.x.xx.xx分支就没有了存在的意义,并且在版本迭代快速的今天,删除已经完成其使命的ffeature/Vx.x.xx.xx是一个明智之选。
(1)创建release预发布分支
git checkout -b release/Vx.x.xx.xx develop
(2)完成后,合并到master分支
# 切换到master分支
git checkout master
# 合并release/Vx.x.xx.xx分支到master分支
git merge release/Vx.x.xx.xx
# 打个标签,用于后续的正式发布,其中xxxxxxxx表示日期,例如20221017,如果一天内多次发布,还可以在xxxxxxxx之前加上_xx,表示第几次发布,比如Vx.x.xx.xx_01.20221017表示20221017版本x.x.xx.xx的第二次发布(第一次为_00,通常可以省略)。
git tag -a Vx.x.xx.xx.xxxxxxxx
(3)将release分支合并到develop分支
git checkout develop
git merge release/Vx.x.xx.xx
(4)合并完成之后删除release分支
git branch -d release/Vx.x.xx.xx
(1)创建hotfix分支
git checkout -b hotfix/Vx.x.xx.xx
(2)完成后合并到master分支
git checkout master
git merge hotfix/Vx.x.xx.xx
# 打标签,标签规则和之前类似,只是在_xx和xxxxxxxx添加了一个hotfix表示修复版本
git tag -a V.x.x.xx.xx.hotfix.xxxxxxxx
(3)合并到develop分支
git checkout develop
git merge hotfix/Vx.x.xx.xx
(4)删除hotfix分支
git branch -d hotfix/Vx.x.xx.xx
以上就基本完成了git flow开发的流程。
本地创建一个新项目,比如使用vue create 项目名称
按照流程创建一个Vue2默认项目(因为只是演示git flow的使用方式,项目就使用简单的设置)。在git上创建远程仓库后,建立连接。
如图,我创建了一个名为git-flow的项目,建立连接,使用it push -u origin "master"
命令推送代码,发现提示报错,本地并没有master分支,这是因为美国之前的人种冲突事件,给master分支(master也意味着主人)蒙上了一层阴影。因此之前git上创建的新项目默认的master分支也被改为了main分支。
但是,Sourcetree可能因为并不是用于创建项目,而是管理项目,因此考虑到以往的使用者项目,仍然沿用master分支作为git flow的主分支。
鉴于我们在本地已经有了初始仓库,就不使用“从url克隆的方式”拉取代码了。选择“扫描文件夹”,
选中项目外一层文件夹即可扫描到本地已有的git项目,勾选需要使用Sourcetree管理的项目,点击添加多个仓库即可。
可以看到Sourcetree的目录列表就有了我们的项目,并且在最右侧展示当前项目在本地的分支。
(1)双击项目,进入管理界面
(2)尝试git flow初始化仓库
点击仓库 -> git-flow 或 hg flow -> 初始化仓库
可以看到,默认生产环境分支是master,如果直接点击确定,则无法继续下一步。现在我们有两种选择,要么将生产环境分支改为main,要么新建一个master分支。两种都可以,我选择按照提示选择后者。
(3)创建新分支master
点击分支,输入master作为新分支名称,创建分支。
可以看到,本地基于main分支就创建了一个master分支,并且main分支前面的小圆圈变到了master分支前面,这代表Sourcetree在创建分支后,自动切换到了该分支(如果希望切回main分支,双击该分支即可)。
(4)删除main分支
因为之前没有将main分支上传到远程,直接勾选强制删除,确定即可。
(5)正式构建git flow工作流
可以看到,本次构建git flow工作流成功,并且自动创建和切换了develop分支作为开发分支。
点击推送,选中需要推送的分支,点击确定。
可以看到Sourcetree上的远端-origin下出现了master和develop分支。切换到gitee上查看也有,说明推送成功。
(1)创建一个功能分支。
选择 仓库 -> git flow 或 hg flow -> 下个操作,建立新的功能(或者直接选择 仓库 -> git flow 或 hg flow -> 建立新的功能),输入功能名称,点击确定,就新建了一个feature/V1.0.00.00分支。
因为feature分支随着功能的增加,版本会逐渐增多,Sourcetree使用文件夹的形式显示。
(2)推送feature分支到远端。
(1)模拟完成feature功能分支开发
(2)提交本地代码,并推送到远端
点击仓库 -> 提交。
选中需要提交的文件,写入提交的注释,选择立即推送,点击提交。
可以看到,文件已经成功推送到了远端上。
点击完成当前项目
默认是删除分支(如果确认要删除,那就选择),我选择保留分支,点击确定。
合并完成后,可以看到develop分支超前了一个版本。
可以看到 feature/V1.0.00.00 分支确实合并(merge)到了 develop,但是develop并没有提交到远端。
之前的feature分支合并到develop分支后,可以不着急将develop推送到远端。可以先创建一个release分支,用于测试,等待测试完成通过后,再进行合并推送。
(1)创建release分支
初学者通常选择下个操作来查看和使用git flow进行的步骤。当然,如果你已经和熟练该流程,就可以直接使用下个操作下面的 “建立新的发布版本” 等操作。
(2)点击推送,推送到远端
(1)修改
此时测试如果发现了问题,就需要对代码就行修改。
(2)提交并推送
修改完成后重新提交推送。
从Sourcetree上可以看出,完成预发布版本,实际上做了下面几件事:
1、将该release分支merge(合并)到了master分支,随后将master分支推送到远端,并且打了个标签。
2、将该release分支删除。
3、将刚打的标签分支merge(合并)到了develop分支,并推送到了远端。
推送到远端
修复bug
从Sourcetree上可以看出,完成hotfix补丁版本,其实做的事情和完成release分支版本类似:
1、将该release分支merge(合并)到了master分支,随后将master分支推送到远端,并且打了个标签。
2、将该release分支删除。
3、将刚打的标签分支merge(合并)到了develop分支,并推送到了远端。
因为我本地已经有一个项目了,所以我修改了个名称,命名为git-flow-copy进行克隆。
可以看到新克隆下的项目,远端的分支和标签版本都可以看到,但是本地默认只有master分支。
git flow初始化后,本地创建并切换到了develop分支
如果需要其他分支,右键,检出即可。
注意:当你在某一分支时,无法删除当前分支,必须要切换到其他分支之后才行。
建议切换到master主分支(通常主分支不会删除),右键需要删除的分支
注意到这里有强制删除和删除远程分支选项。后者我们理解,那强制删除和删除有什么区别吗?我们都尝试看看。
(1)不选择强制删除
重新检出,没有问题
(2)选择强制删除
没有任何区别,还是可以检出。所以强制不强制的区别是什么,目前还不太清楚,以后遇到,再退回来完善。
方法一:在删除本地分支的时候,勾选删除远程分支。
方法二:直接右键远程中需要删除的分支,点击删除。
(1)按照 3.6 的方式,创建一个新的feature/V1.0.00.01功能分支。
(2)模拟新功能开发
完成功能开发后,Sourcetree点击仓库 -> 提交
我们选择保留分支
(3)发布新的预发布版本
(4)推送预发布版本到远程
(5)完成预发布项目
(6)同理,创建一个feature/V1.0.01.00分支,但是我们需要做些改动。比如,增加一个组件,修改一些文字等。
执行提交推送。之后,按照git-flow的下个操作继续执行即可,记得完成feature分支后,推送develop分支。
但是创建新的release分支时,会有一个问题,如果保留之前的release分支,将无法创建新的release分支。本节内容关键是如何合并分支,先不在意这些细节。暂时不用release分支测试合并,使用feature分支做合并测试。
(7)基于 feature/V1.0.00.01分支 创建 feature/V1.0.00.02分支
(8)合并feature/V1.0.00.02分支到feature/V1.0.01.00分支
git checkout feature/V1.0.01.00
git merge feature/V1.0.00.02
发现冲突,
重新提交推送
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。