我理解的Git Flow

Git FLow是什么

Git Flow是构建在Git之上的一个组织软件开发活动的模型,也是软件开发过程中一种成功的分支管理策略。它的核心思想是利用成功的分支管理策略,管理软件的开发过程。

2010年5月,nvie 在他的“A successful Git branching model”一文中,介绍了这种模型,并将其命名为Git Flow。而且,他还为这种分支策略开发了一套Git扩展工具,我们可以在Git中,使用专属的分支管理命令操作分支。

因此,Git Flow 是一种软件开发模型,由一种分支管理策略,和一套与之配套的Git扩展工具组成。

下面这张图,形象的展示了Git Flow的全貌:

Git Flow中的分支

根据Git Flow的思想,开发人员需要合理的利用Git的分支功能,来管理软件的开发流程。因此,Git FLow模型定义了五种标准的分支,并且让它们各司其职,分别是:master分支,develop分支,feature分支,hotfix分支和release分支。

这五种分支又可分为两大类:主要分支辅助分支。主要分支,包括master分支和develop分支。辅助分支,包括feature分支,hotfix分支和release分支。

实质上,Git Flow就是要求开发者使用这五种标准的分支管理软件开发流程

主要分支

主要分支只用于与软件测试、部署、发布相关的活动,不会涉及任何的软件开发活动。主要分支会一直存在,是所有其他分支的源头,也是它们最终的归宿。

  • master

    master分支上存放的应该是随时可供在生产环境中部署的代码(Production Ready state)。它是源头中的源头,归宿中的归宿。它只用于新版本的发布,不涉及一切与软件开发、测试、部署有关的操作。
  • develop

    develop分支fork自master分支,主要用于开发工作。开发新功能时,从develop分支拉出feature分支。新功能开发完成后,再把feature分支合并到develop分支。可见,develop分支是一个承上启下的分支。

辅助分支

辅助分支主要用于具体的软件开发工作,包括新功能的开发、Bug修复和发布前的准备工作。辅助分支不是一直存在的,当它们被合并到主要分支后,会被删除掉。

  • feature

    开发者不能直接在master分支和develop分支上做开发工作,这样可能会污染软件的版本库。Git Flow要求从develop分支上引出一条feature分支,专门做具体的开发工作。每个开发者都可以从develop分支上引出自己的feature分支,并且这个feature分支是开发者私有的,可以不必提交到版本库中。开发完成后,把所有的feature分支都合并到develop分支上,然后把feature分支删掉。如果新功能被砍掉了,也可以直接删掉feature分支。

  • hotfix

    当线上产品遇到了严重Bug,或者发现了紧急的缺陷,不得不立即修复时,就可以从master分支引出一条hotfix分支。问题解决后,再把hotfix分支合并到master分支和develop分支,最后删除掉这个hotfix分支。
    这样做的好处是使Bug修复与新功能开发完全分离开,保证开发工作不受到影响。

  • release

    当新功能开发完,代码都合并到develop分支后,就可以为新版本发布做准备了。但是如果这时有新的开发任务到来,或者又有新的分支需要合并,而此时的develop分支又没有准备好合并到master分支时,那么就可以从develop分支引出一条release分支作为过渡。在release分支上,完成发布前的准备工作,然后合并到master分支和develop分支,最后删除release。
    release分支可以使develop分支解放出来,尽早的投入到下一版本的开发中。

Git FLow的使用方式

  • 使用原生的Git命令

    Git Flow本质上就是对git分支的利用,所以用原生的git分支命令就可以操作。
    • 创建分支
      从当前分支上引出新的分支

        git branch branch_name
      
    • 切换分支

        git checkout branch_name
      
    • 创建并切换分支

        git checkout -b branch_name
      
    • 合并分支
      把其他分支合并到当前分支

        git merge --no-ff -m "comment" branch_name
      
    • 删除分支

      • 要想删除一个分支,必须在已经合并了那个分支的分支上执行删除操作。

          git branch -d banch_name
        
      • 强制删除一个分支

          git branch -D branch_name
        
    • 查看所有分支

        git branch
      
    • 如果本地没有远程仓库的某个分支,把远程分支拉取到本地,并且建立连接

        git checkout -b branch_name orign/branch_name
      
    • 从远程分支更新本地分支

        git pull
      
    • 推送分支到远程分支
      把本地分支的更新推送到远程分支(需要先建立连接);或者在远程仓库�没有此分支时,把本地分支�推送到远程仓库

        git push origin branch_name
      
    • 使本地分支与远程分支建立连接

        git branch --set-upstream branch_name origin/branch_name
      
  • 删除远程仓库的分支

         git push origin --delete branch_name
    
  • 使用 nvie 开发的Git Flow工具

    nvie为Git Flow提供了一套命令行工具,使用它可以更方便的操作Git Flow.
    • 初始化Git Flow

        git flow init
      
      • 在一个git仓库中初始化git flow,会弹出一系列提示信息,跟着做就行了
      • 在一个非git仓库的文件夹中初始化,会创默认建好需要的分支,没有任何提示
    • 创建feature/release/hotfix/support分支
      初始化Git Flow会自动创建/指定主要分支,但辅助分支需要开发者手动创建。

      • 查看/创建/完成feature分支

          git flow feature
          git flow feature start feature_branch_name
          git flow feature finish feature_branch_name
        

        start命令,会创建一个新的feature分支;finish命令,会自动合并feature分支到develop分支和master分支,并删除feature分支。

      • push/pull一个feature分支到远程仓库

          git flow feature publish feature_branch_name
          git flow feature pull origin feature_branch_name
        
      • 其他分支 - hotfix/release/support分支的操作与feature分支基本相同,直接去参考官方文档吧。

参考文献:

  1. 基于git的源代码管理模型——git flow
  2. Git 常用命令和 Git Flow 梳理
  3. Git flow 分支策略
  4. Git Flow在github的主页
撤销更改

git checkout -- file 在加入到暂存区之前,遗弃修改
git reset HEAD file 在提交之前,遗弃暂存区的更改
git reset --hard HEAD^ 回退到上一版本
git reset --hard commit_id 回退到指定的版本

操作文件

git mv file newfile 重命名,文件名不区分大小写
git rm file 删除文件
git remote rename repo new_repo 重命名远程仓库

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

推荐阅读更多精彩内容