gitflow工作流程

前言-约定

$ 开头- 是指shell命令, 没有的$ 前缀的是终端的提示信息

Gitflow工作流通过为功能开发、发布准备和维护分配独立的分支,让发布迭代过程更流畅。严格的分支模型也为大型项目提供了一些非常必要的结构。

gitflow工作流程_第1张图片
项目流程图

一. 初始化项目

首先要初始化一个空的git.方式从终端上来区分,可以分为两种:

1.1 从线上开始,这里以coding为例。
gitflow工作流程_第2张图片
初始化空项目

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
gitflow工作流程_第3张图片
设置保护分支-2
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 ..." 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 添加对应的任务

gitflow工作流程_第4张图片
添加任务.png

然后查看任务id

任务id

被分配到这个任务的人的开发流程

  1. 克隆仓库 -- 仅仅第一次需要

  2. 切换到 develop分支

$ git checkout develop
Already on 'develop'
Your branch is up-to-date with 'origin/develop'.
  1. 建立分支。 格式为 feature-#任务id
$ git checkout -b feature-#001
.....
开始编码
coding......
编码完成
.....
  1. 开发完成这个功能点后
$ git status
On branch feature-#001
Changes not staged for commit:
  (use "git add ..." to update what will be committed)
  (use "git checkout -- ..." 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进行关联

你可能感兴趣的:(gitflow工作流程)