gitflow工作流程

前言-约定

$ 开头- 是指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
设置保护分支-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 <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 添加对应的任务

添加任务.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 <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进行关联
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容

  • 多种多样的工作流使得在项目中实施Git时变得难以选择。这份教程提供了一个出发点,调查企业团队最常见的Git工作流。...
    JSErik阅读 4,356评论 2 8
  • 既然都要老去,那就做一个优雅着老去的女人吧! 昨晚,爸爸给我打电话 “最近工作怎么样?还能适应吗?压力大不大?” ...
    我叫大师阅读 616评论 0 0
  • 夜深了。 他来到山头,灌了一口水。仰望星空,想着,想着。想什么呢?他在想一年前的那个小镇...
    彧冥阅读 231评论 0 0