Gitflow工作流
1. 简介
Gitflow
工作流通过为功能开发、发布准备和维护分配独立的分支,让发布迭代过程更流畅。严格的分支模型也为大型项目提供了一些非常必要的结构。
注:借鉴于nvie的Vincentive Driessen
Gitflow
工作流定义了一个围绕项目发布的严格分支模型。虽然比功能分支工作流复杂几分,但提供了用于一个健壮的用于管理大型项目的框架。
Gitflow
工作流没有用超出功能分支工作流的概念和命令,而是为不同的分支分配一个明确的角色,并定义分支之间如何和什么时候进行交互。 除了使用功能分支,在做准备、维护和记录发布时,也定义了各自的分支。 当然你可以用上功能分支工作流所有的好处:Pull Requests
、隔离实验性开发和更高效的协作。
1.1 工作方式
Gitflow
工作流仍然用*仓库作为所有开发者的交互中心。和其它的工作流一样,开发者在本地工作并push
分支到要*仓库中。
1.2 历史分支
相对于使用仅有的一个master
分支,Gitflow
工作流使用两个分支来记录项目的历史。master
分支存储了正式发布的历史,而develop
分支作为功能的集成分支。 这样也方便master
分支上的所有提交分配一个版本号。
1.3 功能分支
每个新功能位于一个自己的分支,这样可以push
到*仓库以备份和协作。 但功能分支不是从master
分支上拉出新分支,而是使用develop
分支作为父分支。当新功能完成时,合并回develop
分支。 新功能提交应该从不直接与master
分支交互。
- 注意,从各种含义和目的上来看,功能分支加上develop分支就是功能分支工作流的用法。但Gitflow工作流没有在这里止步。
1.4 发布分支
一旦develop
分支上有了做一次发布(或者说快到了既定的发布日)的足够功能,就从develop
分支上checkout
一个发布分支。 新建的分支用于开始发布循环,所以从这个时间点开始之后新的功能不能再加到这个分支上—— 这个分支只应该做Bug
修复、文档生成和其它面向发布任务。 一旦对外发布的工作都完成了,发布分支合并到master
分支并分配一个版本号打好Tag
。 另外,这些从新建发布分支以来的做的修改要合并回develop
分支。
使用一个用于发布准备的专门分支,使得一个团队可以在完善当前的发布版本的同时,另一个团队可以继续开发下个版本的功能。 这也打造定义良好的开发阶段(比如,可以很轻松地说,『这周我们要做准备发布版本4.0』,并且在仓库的目录结构中可以实际看到)。
常用的分支约定:
用于新建发布分支的分支: develop
用于合并的分支: master
分支命名: release-* 或 release/*
1.5 维护分支
-
维护分支或说是热修复(
hotfix
)分支用于给产品发布版本(production releases
)快速生成补丁,这是唯一可以直接从master
分支fork
出来的分支。 修复完成,修改应该马上合并回master
分支和develop
分支(当前的发布分支),master
分支应该用新的版本号打好Tag
。 -
为
Bug
修复使用专门分支,让团队可以处理掉问题而不用打断其它工作或是等待下一个发布循环。 你可以把维护分支想成是一个直接在master
分支上处理的临时发布。
1.6 示例
下面的示例演示本工作流如何用于管理单个发布循环。假设你已经创建了一个*仓库。
创建开发分支
第一步为master
分支配套一个develop
分支。简单来做可以本地创建一个空的develop
分支,push
到服务器上:
git branch develop
git push -u origin develop
以后这个分支将会包含了项目的全部历史,而master
分支将只包含了部分历史。其它开发者这时应该克隆*仓库,建好develop
分支的跟踪分支:
git clone ssh://aaa@qq.com/path/to/repo.git
git checkout -b develop origin/develop
现在每个开发都有了这些历史分支的本地拷贝。
1. 小红和小明开始开发新功能
这个示例中,小红和小明开始各自的功能开发。他们需要为各自的功能创建相应的分支。新分支不是基于master
分支,而是应该基于develop
分支:
git checkout -b some-feature develop
他们用老套路添加提交到各自功能分支上:编辑、暂存、提交:
git status
git add <some-file>
git commit
2. 小红完成功能开发
添加了提交后,小红觉得她的功能OK了。如果团队使用Pull Requests
,这时候可以发起一个用于合并到develop
分支。 否则她可以直接合并到她本地的develop
分支后push
到*仓库:
git pull origin develop
git checkout develop
git merge some-feature
git push
git branch -d some-feature
第一条命令在合并功能前确保develop
分支是最新的。注意,功能决不应该直接合并到master
分支。 冲突解决方法和集中式工作流一样。
小红开始准备发布
这个时候小明正在实现他的功能,小红开始准备她的第一个项目正式发布。 像功能开发一样,她用一个新的分支来做发布准备。这一步也确定了发布的版本号:
git checkout -b release-0.1 develop
这个分支是清理发布、执行所有测试、更新文档和其它为下个发布做准备操作的地方,像是一个专门用于改善发布的功能分支。
只要小红创建这个分支并push
到*仓库,这个发布就是功能冻结的。任何不在develop
分支中的新功能都推到下个发布循环中。
3. 小红完成发布
一旦准备好了对外发布,小红合并修改到master
分支和develop
分支上,删除发布分支。合并回evelop
分支很重要,因为在发布分支中已经提交的更新需要在后面的新功能中也要是可用的。 另外,如果小红的团队要求Code Review
,这是一个发起Pull Request
的理想时机。
git checkout master
git merge release-0.1
git push
git checkout develop
git merge release-0.1
git push
git branch -d release-0.1
发布分支是作为功能开发(develop
分支)和对外发布(master
分支)间的缓冲。只要有合并到master
分支,就应该打好Tag
以方便跟踪。
git tag -a 0.1 -m "Initial public release" master
git push --tags
Git
有提供各种勾子(hook
),即仓库有事件发生时触发执行的脚本。 可以配置一个勾子,在你push
*仓库的master
分支时,自动构建好版本,并对外发布。
4. 最终用户发现Bug
对外版本发布后,小红小明一起开发下一版本的新功能,直到有最终用户开了一个Ticket
抱怨当前版本的一个Bug
。 为了处理Bug
,小红(或小明)从master
分支上拉出了一个维护分支,提交修改以解决问题,然后直接合并回master
分支:
git checkout -b issue-#001 master
# Fix the bug
git checkout master
git merge issue-#001
git push
就像发布分支,维护分支中新加这些重要修改需要包含到develop
分支中,所以小红要执行一个合并操作。然后就可以安全地删除这个分支了:
git checkout develop
git merge issue-#001
git push
git branch -d issue-#001
2. Git总结
2.1 Gitflow工作流分支
2.2 Confict冲突解决
-
方式一
- 获取最新代码
git fetch
- 对比代码
git diff origin/dev
- 修改冲突地方后提交并推送代码
- 发起合并请求
- 获取最新代码
-
方式二
- 拉取并合并最新代码
git pull origin dev
- 查看冲突代码
git status
- 修改冲突代码后提交并推送代码
- 发起合并请求
- 拉取并合并最新代码
3. 调试方法
- 判断问题发生在前端还是后端
-
如果前端为网页,可以通过网页调试工具里面的network判断
- 在前端中触发一次接口调用的请求
- 查看network中对应的请求记录
- 如果没有发现有新的请求记录,表示前端有问题,并未发起请求
- 如果有请求记录,返回的状态码为200,但是页面没有想要的效果,表示前端没有正确处理200的响应
- 如果返回的状态码为4xx, 表示前端构造的请求有问题,比如404没有正确的请求网址,401、403请求的身份有问题,405请求的方式有问题,400表示构造的请求参数不正确(类型不对或缺少参数)
- 如果返回500状态码,表示服务器端出现问题
- 如果前端不是网页,比如app,通过日志的访问请求记录判断
-
在服务器中查看日志文件的方法:
tail flask.log # 查看最后一条记录
tail -n 100 flask.log # 查看最新的100条记录
tail -f flask.log # 实时查看
-
如果是后端出现的问题,通过pycharm或日志来判断
- 查看记录错误的日志,根据日志的信息判断错误