git工作流

简介

 一个大型项目都是由很多人一起开发完成的,所以合理的开发模式是很重要的,不然会带来很多的问题,如代码冲突,合错代码等。

在git开发中一般分为4中工作流,也叫开发模式,如:集中式工作流,功能分支流,Git Flow工作流,Forking工作流。

集中式工作流

图为三个人都有一份本地的远程拷贝,分别开发完后提交commit到远程仓库,如果有冲突先解决冲突。这种模式是最简单的开发模式,它的缺点是不同的人提交的日志混杂一起,难以定位问题,而且容易产生冲突。适合团队少,开发不频繁,不需要同时维护多个版本的小项目。

功能分支工作流

功能分支工作流基于集中式工作流演进而来。在开发新功能时,基于 master 分支新建一个功能分支,在功能分支上进行开发,而不是直接在本地的 master 分支开发,开发完成之后合并到 master 分支,如下图所示:


相较于集中式工作流,这种工作流让不同功能在不同的分支进行开发,只在最后一步合并到 master 分支,不仅可以避免不同功能之间的相互影响,还可以使提交历史看起来更加简洁。

具体流程:

1. 如果新增一个功能,功能分支可以取一些有意义的名字,便于理解,例如 feature/rate-limiting。

git checkout -b feature/rate-limiting

2.在分支开发完成后,提交到功能分支。

git commit -a -m "add reate limiting"

3.push 到远程仓库

git push origin feature/rate-limiting

4.GitHub上会看到Compate&pull request,点击会进入pull request页面,填写评论。点击Create pull request提交、

5.管理员收到PR后,会点击Merge pull request合并到master

Merge pull request: 提供了3种merge方法:

     1.Create a merge commit:GitHub 的底层操作是 git merge --no-ff。feature 分支上所有的 commit 都会加到 master 分支上,并且会生成一个 merge commit。这种方式可以让我们清晰地知道是谁做了提交,做了哪些提交,回溯历史的时候也会更加方便。

      2. Squash and merge:GitHub 的底层操作是 git merge --squash。Squash and merge 会使该 pull request 上的所有 commit 都合并成一个 commit ,然后加到 master 分支上,但原来的 commit 历史会丢失。

      3. Rebase and merge:GitHub 的底层操作是 git rebase。这种方式会将 pull request 上的所有提交历史按照原有顺序依次添加到 master 分支的头部(HEAD)

这种模式简单,能并行开发多个功能,还可以code review。缺点:无法分配明确的目的,不利于团队配合。

Git Flow 工作流

Git Flow 工作流是一个非常成熟的方案,也是非开源项目中最常用到的工作流。它定义了一个围绕项目发布的严格分支模型,通过为代码开发、发布和维护分配独立的分支来让项目的迭代流程更加顺畅,比较适合大型的项目或者迭代速度快的项目。

Git Flow 的 5 种分支:master、develop、feature、release 和 hotfix.


Git Flow开发流程

a. 当前版本为0.9.0

b.需要开发一个功能,使程序输出hello go 字符串

c. 在开发阶段,线上紧急有Bug需要修复、

假设我们项目下有个文件名字为main.go

1.首先创建分支:develop、  git checkout -b develop master (基于master分支创建develop分支)

2. 基于develop分支创建功能分支:feature/print-hello-go  git checkout -b feature/print-hello-go

3. feature/print-hello-go 分支中,在 main.go 文件中添加一行代码fmt.Println("Hello")

4. 紧急修复 Bug。当我们正在开发中要修改bug,步骤如下:

  $ git stash # 1. 开发工作只完成了一半,还不想提交,可以临时保存修改至堆栈区

  $ git checkout -b hotfix/print-error master # 2. 从 master 建立 hotfix 分支

  $ vi main.go # 3. 修复 bug

   $ git commit -a -m 'fix print message error bug' # 4. 提交修复

  $ git checkout develop # 5. 切换到 develop 分支

  $ git merge --no-ff hotfix/print-error # 6. 把 hotfix 分支合并到 develop 分支

  $ git checkout master # 7. 切换到 master 分支

  $ git merge --no-ff hotfix/print-error # 8. 把 hotfix 分支合并到 master

  $ git tag -a v0.9.1 -m "fix log bug" # 9. master 分支打 tag

  $ git branch -d hotfix/print-error # 11. 修复好后,删除 hotfix/xxx 分支

  $ git checkout feature/print-hello-go # 12. 切换到开发分支下

  $ git merge --no-ff develop # 13. 因为 develop 有更新,这里最好同步更新下

  $ git stash pop # 14. 恢复到修复前的工作状态

5. 继续开发

6. 提交代码到feature/print-hello-go分支 git push origin feature/print-hello-go

7. 我们在 GitHub 上,基于 feature/print-hello-go 创建 pull request, 进行 code review,代码仓库 matainer 将功能分支合并到 develop 分支。

8. 基于 develop 分支,创建 release 分支,测试代码。git checkout -b release/1.0.0 develop

9. 测试通过后,将功能分支合并到 master 分支和 develop 分支

Git Flow 工作流比较适合开发团队相对固定,规模较大的项目


Forking 工作流

而在开源项目中,最常用到的是 Forking 工作流,例如 Kubernetes、Docker 等项目用的就是这种工作流。这里,我们先来了解下 fork 操作。

fork 操作是在个人远程仓库新建一份目标远程仓库的副本,比如在 GitHub 上操作时,在项目的主页点击 fork 按钮(页面右上角),即可拷贝该目标远程仓库。Forking 工作流的流程如下图所示。


1.首先fork代码到本地 并创建远程提交的分支 如下的upstream就是创建远程分支 并且这个分支是在你fork的项目进行pull 和 push的

git remote add upstream https://github.com/****  

git remote set-url --push upstream no_push

2. 创建功能分支,并同步本地仓库为最新状态

    $ git fetch upstream

    $ git checkout master

    $ git rebase upstream/master

3. 提交commit,并push


Forking 工作流比较适用于以下三种场景:(1)开源项目中;(2)开发者有衍生出自己的衍生版的需求;(3)开发者不固定,可能是任意一个能访问到项目的开发者。

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

推荐阅读更多精彩内容

  • 中心化的工作流 优势 首先它让每个开发者都有自己的本地的完整项目副本。隔离的环境使得每个开发都的工作独立于项目的其...
    zucchiniy阅读 183评论 0 0
  • 一、Gitflow工作流概述 工作流(Workflow),指“业务过程的部分或整体在计算机应用环境下的自动化”。是...
    大海螺Utopia阅读 1,222评论 4 3
  • 多种多样的工作流使得在项目中实施Git时变得难以选择。这份教程提供了一个出发点,调查企业团队最常见的Git工作流。...
    JSErik阅读 4,393评论 2 8
  • 版本控制 概述 在软件开发过程,每天都会产生新的代码,代码合并的过程中可能会出现如下问题: 代码被覆盖或丢失 代码...
    isuntong阅读 261评论 0 0
  • 目前,git主流的工作流有3种: git flow 模型 github 模型 gitlab 模型 阮一峰的这篇 G...
    mervynyang阅读 473评论 0 1