前言-约定
$ 开头- 是指shell命令, 没有的$ 前缀的是终端的提示信息
Gitflow工作流通过为功能开发、发布准备和维护分配独立的分支,让发布迭代过程更流畅。严格的分支模型也为大型项目提供了一些非常必要的结构。
一. 初始化项目
首先要初始化一个空的git.方式从终端上来区分,可以分为两种:
1.1 从线上开始,这里以coding为例。
1.2 建立本地仓库
$ git clone https://git.coding.net/angke/xxxx.git
Cloning into 'ding'...
warning: You appear to have cloned an empty repository.
1.3.1 建立master分支.初始化项目
$ git checkout -b master
Switched to a new branch 'master'
$ echo "1.这里是项目说明;\n 2.这里是写开发规范" > readme.md
$ git add readme.md
$ git commit -m 'init commit'
$ git push -u origin master
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 258 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://git.coding.net/angke/ding.git
* [new branch] master -> master
Branch master set up to track remote branch master from origin.
1.3.2 在GUI界面。对master分支设保护
1.4 建立开发分支 develop
保证自己在master分支上,执行
$ git checkout -b develop
Switched to a new branch 'develop'
1.4.1 现在就可以开始初始化项目了。
移动框架源码到版本库
$ git status
On branch develop
Untracked files:
(use "git add <file>..." to include in what will be committed)
.env.example
.gitattributes
.gitignore
app/
artisan
bootstrap/
composer.json
composer.lock
config/
database/
package.json
phpunit.xml
public/
resources/
routes/
server.php
storage/
tests/
webpack.mix.js
nothing added to commit but untracked files present (use "git add" to track)
检查要提交的文件,并同步到中央仓库(这里是指coding)
$ git add .
$ git commit -m '初始化开发环境'
$ git push -u origin develop
到这里开发环境的配置就完成了。
二、 开发功能
开发功能 。 先进入coding 添加对应的任务
然后查看任务id
被分配到这个任务的人的开发流程
克隆仓库 -- 仅仅第一次需要
切换到 develop分支
$ git checkout develop
Already on 'develop'
Your branch is up-to-date with 'origin/develop'.
- 建立分支。 格式为 feature-#任务id
$ git checkout -b feature-#001
.....
开始编码
coding......
编码完成
.....
- 开发完成这个功能点后
$ git status
On branch feature-#001
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: .env.example
no changes added to commit (use "git add" and/or "git commit -a")
添加并,暂存代码
$ git add .env.example
$ git commit -m '#1 实现连接数据库featrue'
[feature-#001 d6cfee8] #1 实现连接数据库featrue
1 file changed, 3 insertions(+), 3 deletions(-)
接下我们要做的就是把实现这个feature的代码合并回开发分支,并删除这个这个实现feature分支了,
# rebase 变基操作 --- 将develop的代码更新到最新
$ git rebase origin
# 如果有冲突,rebase 将自动停止
$ git status #查看冲突文件
$ git add 冲突的文件名 # 手动或用工具编辑解决冲突,并告诉git 已经解决冲突
$ git rebase --continue #继续进行变基,如果有冲突,再重复上面 status add ,直到rebase 成功. 如果出现了错误操作,
# git rebase --abort 可将代码还原到边基操作之前的
#切换分支
$ git checkout develop
Switched to branch 'develop'
Your branch is up-to-date with 'origin/develop'.
#合并修改
$ git merge feature-#001
Updating 11e9ffc..d6cfee8
Fast-forward
.env.example | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
#删除feature分支
$ git branch -d feature-#001
Deleted branch feature-#001 (was d6cfee8).
#将代码同步到中央服务器的开发分支
$ git push origin develop
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 352 bytes | 0 bytes/s, done.
Total 3 (delta 2), reused 0 (delta 0)
To https://git.coding.net/angke/ding.git
11e9ffc..d6cfee8 develop -> develop
这样就完成了一个功能点的开发。项目中所有的功能点,就按照这个流程重复。 添加issue ,新建对应分支, coding. rebase 合并分支到 develop 分支, 删除 实现功能这个分支, 推送到中央服务器,每个功能点都按照这个流程走。
三、发布测试版本
直到我们要出一个版本了,这个时候 由 主程
进行如下操作
#切换到develop分支
$ git checkout develop
# 创建release分支
$ git checkout -b release-发布的版本号
对这个release的版本进行部署,并交于这个测试测试, 这个版本的代码,只进行bug修正,不再添加新的功能,
如果这个时候测试测试出了bug。 那么我们同样在coding 上添加相应的任务,并在客户端进行如下操作
# 切换到release分支
$ git checkout release-发布的版本号 develop
# 基于当前分支,新建并切换到 解决某个bug的分支, 分支名格式为 issue-#id
$ git checkout issue-#002
....编码....
# 保存代码
$ git add 变更的文件
$ git commit -m "#002 修复了什么bug"
#rebase操作
$ git rebase
# 合并代码到 release 分支
$ git checkout release-发布的版本号
$ git merge issue-#002
$ git push
# 合并代码到 develop 分支
$ git checkout develop
$ git merge issue-#002
$ git push
# 删除修复bug分支
$ git branch -d issue-#002
这样子一直循环,完成这个候选版本的修正操作。
项目发布
接下来我们就要进行代码的发布了
#切换到候选版本
$ git checkout release-0.1
# 切换到master分支
$ git checkout master
# 合并候选版本的代码到master分支,并打上 tag
$ git checkout release-0.1
$ git tag v0.1
# 同步到中央仓库
$ git push origin master
# 推送标签
$ git push v0.1:v0.1 # git push 本地tag名:远程tag名
# 删除候选版本分支
$ git branch -d release-0.1
这样就完成了整个项目的发布流程。
四、项目上线以及热修复
如果项目运行的时候在线上发现了bug,我们怎么解决呢,这个时候我们就要 基于 master
分支 创建对应的 hotfix
分支了。
$ git checkout -b hotfix-issue-#id master #基于master分支,创建一个热修复分支
...coding...
$ git add 变更文件
$ git commit -m 'hotfix issue #id'
# 切换到master分支,并合并代码
$ git checkout master
$ git merge hotfix-issue-#id
# 将这个 修复合并到develop分支上
$ git checkout develop
$ git merge hotfix-issue-#id
# 删除修复分支,重建tag, 并推送
$ git branch -d hotfix-issue-#id
$ git tag -d v0.1
# 保证当前在master分支上。执行下面操作,可以用git branch -a 查看当前分支 或者直接执行 git checkout master
$ git push origin :v0.1 #删除服务器上tag
$ git push origin master
$ git push v0.1:v0.1
这样就完成了v0.1版本的开发和发布以及修复线上问题的流程。
总结一下其中几个点
- 禁止直接使用
git pull
请用git pull -r
或者git pull --rebase
或者git fetch && git rebase
代替 - 所有的推送操作前,都要先进行rebase操作
- 所有更改功能和bug的修复最后都要合并会develop
- 所有为了解决和实现功能点的分支,再合并回develop分支后都要删除
- master分支只与release分支和hotfix分支直接接触。
- release分支一旦创建,develop实现新功能的分支,就不再于release分支合并了
- master分支的每次更新,都要创建一个tag
- 所有的提交信息操作,都要和 issue进行关联