实习第一天,上司让我学习一下Git Flow
码农天地 -简述Git Flow
首先,Git Flow
并不是Git
的替代品,Git Flow
只是把标准的Git
命令用脚本组合了起来,形成比较有效而简单的命令。
Git Flow
只是给我们提供一个更简便的工作流程命令,而更重要的是我们需要去学习和理解关于版本控制系统的工作流程,才能有效的迭代产品,避免混乱。
而当项目处于一个多人协作的状态下,工作流程显得非常之重要。假设当两个甚至多个开发者同时再开发各自新功能时,如果在同一分支上进行协作时,这必然会产生大量的冲突。而工作流程的做法,就是每个开发者可以各自切出一个独立分支,当各自功能实现并且测试成功后,再自行合并到master
分支中,甚至无需等待其他功能实现再一起发布。
在Git Flow
中,主要的分支有master
、develop
、hotfix
、release
、feature
这五种分支。master
和develop
分支是我们最常见的分支,它们被称作长期分支,一直存活在整个工作流程中,而其它的分支大部分会因任务结束而被删除。
该分支主要用来存放稳定、随时可以上线的版本。
这个分支的来源只能从别的分支合并过来,开发者不会直接commit
到这个分支上。
通常我们也会在这个分支上的提交打上版本号标签。
develop分支这个分支主要是所有开发的基础分支。
当要添加功能时,所有功能都是从这个分支切出去的,而功能分支实现后,也都会合并回来这个分支中。
hotfix分支当线上产品发生了紧急问题的时候,就会从master
分支中开一个hotfix
分支出来进行修复。
当hotfix
分支修复完成之后,就会合并到master
分支中,并且也会合并到develop
分支中。
当develop
分支完成需求后,就可以从develop
分支中开一个release
分支,进行上线前最后的测试。
测试完成后,释放release
分支将会同时合并到master
以及develop
分支中。
当我们需要补充功能的时候,就会从develop
分支中开一个feature
分支进行功能开发。
当功能实现后,在将feature
分支合并到develop
分支中,等待最后的测试发布。
brew install git-flow
如果没有安装brew
的话可使用下列命令进行安装:
/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"
WinWindows安装git flow
初始化先将项目克隆到本地。
git clone <project-url>
初始化Git Flow
。
git flow init
命令行会提示你是否修改Git Flow
提供的默认分支前缀。不同场景的分支前缀不同,默认情况下分支前缀是这样的。
Which branch should be used for bringing forth production releases?
- develop
- master
Branch name for production releases: [master]
Which branch should be used for integration of the "next release"?
- develop
Branch name for "next release" development: [develop]
How to name your supporting branch prefixes?
Feature branches? [feature/]
Release branches? [release/]
Hotfix branches? [hotfix/]
Support branches? [support/]
Version tag prefix? []
分支前缀的作用是区分不同分支的使用场景,同时当你使用Git Flow
命令时就不需要手动增加分支前缀,Git Flow
会帮你加上。
通常情况下不需要修改默认的命名前缀,只需要加上-d
就可以跳过修改命名步骤。
git flow init -d
feature场景当我们需要开发一个新功能的时候,此时需要基于develop
分支拉出feature
分支进行开发,即feature
场景的生命周期开始。
通常来说,一种场景的完整生命周期至少包含以下几种行为:
start :开始开发publish :发布到远程分支finish :完成开发、合并分支start新功能开始开发前,需准备好开发分支。
git flow feature start <feature-name>
执行上面命令后,将会在本地创建一个名为<feature-name>
的分支,并切换到该分支。
而且无论你当前处于哪个分支,它都会基于本地develop
分支创建的。
上述命令相当于执行了下面的Git
操作。
git checkout -b feature/<feature-name> develop
需要注意的一点是,该分支是基础本地的develop
分支创建,所以执行此命令钱一般需要拉取最新的远程代码。publish在本地开发完成新功能并进行commit
操作后,需要将本地代码提交到远程仓库。
git flow feature publish <feature-name>
该命令主要做了三件事情:
创建一个名为feature/<feature-name>
的远程分支本地分支track
远程分支如果本地存在还没提交的代码,就进行代码提交git push origin feature/<feature-name>
git push --set-upstream origin feature/<feature-name>
git push origin
当你执行后publish
操作后,后续还需要进行代码提交的话,只需执行正常的push
命令既可。
git push
finish当功能开发完毕后就将进入测试阶段,此时需要将该分支合并到develop
分支。
git flow feature finish <feature-name>
该命令也主要做了三件事情:
切换到develop
分支合并代码到develop
分支删除本地feature/<feature-name>
分支git checkout develop
git merge feature/<feature-name>
git branch -d feature/<feature-name>
Git Flow
的merge
操作与默认的git merge
操作有些不同。
默认情况下它会检查本次merge
有多少commit
记录,如果仅有一条的话采用fast-forward
模式,即只移动HEAD
指针而不会生成提交记录;如果超过一条commit
的话,这采用no-ff
模式,该模式下则会多生成一条merge
的commit
记录。
这样做的好处是当有多条提交记录时方便进行代码回退和记录监察,而只有单条提交记录的时候则简化代码提交记录从而便于管理。
当finish
操作过程中,如果merge
发生了冲突,则会终端finish
操作,不会删除feature/<feature-name>
分支,同时也处于develop
分支上。
当本地冲突解决并commit
后,重新进行finish
操作即可。
另外,finish
指令还支持三个附加参数:
-r
:即merge前先执行rebase
,但即使rebase
后符合fast-forward
条件也不一定会用fast-forward
。-F
:即合并完成连同远程分支一并删除。-k
:即保留本地feature
分支,不执行delete
动作。release场景当新功能开发完成后,将进入测试阶段,此时需要基于develop
分支拉出release
分支进行集成测试,也有将release
场景作为预发布环境进行测试。
在这种情况下,一般而言release
只有少数改动。
使用start
开启一个release
场景。
git flow release start <release-name>
该命令会基于本地的develop
分支创建一个release/<release-name>
分支,并切换到这个分支。
finish
的release
分支的话,将不允许使用start
指令开启新的release
分支,这一点是对并行发布的一个限制。publish为了让其他协同人员能够看到该分支并一同测试,需要将其发布出去。
git flow release publish <release-name>
finish待测试通过后需要发布正式版:
git flow release finish <release-name>
该命令的动作会比较多,大致是:
git fetch
,拉取最新的代码将分支合并到master
分支生成名为<release-name>
的tag
将分支合并到develop
分支删除release/<release-name>
分支切换回develop
分支如果merge
产生冲突不会终止流程,只是不会将本地的release
分支删除。待解决完冲突后需再次执行finish
操作。
finish
只是完成了本地代码的一系列操作,可使用下列命令进行推送所有的分支和tag
。
git push origin --all
git push origin --tag
hotfix场景如果在线上发现了bug,需要进行紧急修复的时候,就需要用到了hotfix
场景。
git flow hotfix start <hotfix-name>
该命令将从master
分支创建了一个hotfix/<hotfix-name>
的分支并切换到该分支。
hotfix
没有publish
命令,因为Git Flow
认为hotfix
应该是小范围的改动,不需要其他协同人员参与。
但本地修改结束并进行commit
操作后,则执行finish
操作。
git flow hotfix finish <hotfix-name>
该命令所做任务与release
基本相同,先拉取代码,然后将分支合并到master
、develop
分支中,并且打上tag,然后删除该分支,最后切回develop
分支。
与Git Flow
相似的代码管理工作流还有Github Flow和Gitlab Flow。
Github Flow
是简化版的Git Flow
,它使用了main
和feature
来管理代码,它只有一个长期分支,就是main
。Gitlab Flow
更关注代码的持续集成,一个版本需要创建测试环境、预览环境、生成环境的分支,最后汇总到stable branch
分支用于发布。