git flow 使用规范

Git的优点

  • 分布式,本地包含远程仓库所有源码,可以离线操作

  • 便捷的分支功能,可以很方便的进行团队合作和版本控制

Git flow

  • Git flow 是前人经过探索总结出来的一套Git分支管理规范和流程,来保证我们在开发过程少踩一些坑。

首先,项目存在两个长期分支,前者用于存放对外发布的版本,任何时候在这个分支拿到的,都是稳定的分布版;后者用于日常开发,存放最新的开发版。


两条长期维护分支

主分支master :

主分支 , 产品的功能全部实现后 , 最终在master分支对外发布;
该分支为只读唯一分支 , 只能从其他分支(release/hotfix)合并 , 不能在此分支修改;
另外所有在master分支的推送应该打标签做记录,方便追溯;

开发分支develop :

主开发分支 , 基于master分支克隆;该分支为只读唯一分支 , 只能从其他分支合并;
包含所有要发布到下一个release的代码; feature功能分支完成 , 合并到develop(不推送而是merge);
develop拉取release分支 , 提测; release/hotfix 分支上线完毕 , 合并到develop并推送;

其次,项目存在三种短期分支。


分支维护过程

功能分支(feature branch):

功能开发分支 , 基于develop分支克隆 ;
功能开发完毕后合到develop分支;主要用来开发新功能,每个功能新开一个feature,保证功能的独立性;
feature分支可同时存在多个 , 用于团队中多个功能同时开发 , 属于临时分支 , 功能完成后可选删除;
(未正式上线之前不推送到远程中央仓库!!!)
分支命名: feature/ 开头的为特性分支, 命名规则: feature/user_module、 feature/cart_module

补丁分支(hotfix branch):

补丁分支 , 基于master分支克隆 , 主要用于对线上的版本进行BUG修复;
修复完毕后合并到develop/master分支并推送 , 打Tag;
属于临时分支 , 补丁修复上线后可选删除;
分支命名: hotfix/ 开头的为修复分支,它的命名规则与 feature 分支类似;

预发分支(release branch):

测试分支 , 基于feature分支合并到develop之后  , 从develop分支克隆;
属于临时分支 , 功能上线后可选删除
主要用于提交给测试人员进行功能测试 , 测试过程中发现的BUG在本分支进行修复 ,
修复完成上线后合并到develop/master分支并推送(完成功能) , 打Tag;
分支命名: release/ 开头的为修复分支;

易错操作:

1、feature分支一旦合并到develop后不能再再该feature上修改了,
如果要改的话只能在合并后的develop上拉release进行修改,
这就是为什么未正式上线之前不推送到远程中央仓库!!!    
2、在release合并到develop分支前,不能把feature2合并到develop,这样会造成混乱。

常用命令:

1、 创建功能分支

创建功能分支
(develop)$: git checkout -b feature/xxx               # 从dev建立特性分支
(feature/xxx)$: blabla                                # 开发
(feature/xxx)$: git add .                             #添加到暂存区
(feature/xxx)$: git commit -m 'blabla'    #提交备注

2、功能完成,把功能合并到develop


把功能合并到develop
(feature/xxx)$: git checkout develop                  # 切换至develop分支
(develop)$: git pull                                  #一定要先更新develop,再去merge代码
(develop)$: git merge feature/xxx
(develop)$: git push                                  #建议再编辑器里查看冲突文件,解决后再push
git branch -d feature/xxx                             #功能分支代码合并到develop后就没用了,如果接下来还要修改问题到对应到release分支进行修改        

3、功能准备发布


功能准备发布
(develop)$: git checkout -b release/xxx                #这个分支专门用于发布前的准备,包括一些清理工作、全面的测试、文档的更新以及任何其他的准备工作。它与用于功能开发的分支相似,不同之处在于它是专为产品发布服务的。

4、发布完成


release测试通过后合并到master和develop
(release/xxx )$: git checkout master
(master)$: git merge release-0.1
(master)$: git push
(master)$: git checkout develop
(develop)$: git merge release-0.1
(develop)$: git push
(develop)$: git branch -d release-0.1          

发布分支扮演的角色是功能开发(develop)与官方发布(master)之间的一个缓冲。无论什么时候你把一些东西合并入master,你都应该随即打上合适的标签。

(master)$: git tag -a Verson1.0 -m"Initial public release"            #一般在提交的时候打标签
(master)$: git push --tags

5、线上bug修复
线上产生bug,新建hotfix分支进行修复,步骤和创建feature分支相同


hotfix
(master)$: git checkout -b hotfix/xxx
(hotfix/xxx)$: # Fix the bug
(hotfix/xxx)$: git checkout master
(master)$: git merge hotfix/xxx
(master)$: git push

(master)$: git checkout develop
(develop)$: git merge hotfix/xxx
(develop)$: git push
(develop)$: git branch -d hotfix/xxx

Git Flow使用:

Git Flow
  • 初始化:
    这个命令会进行一些默认的配置,可以自动创建上面介绍的所有分支:master、develop、feature、relase、hotfix等分支。完成后当前所在分支就变成 develop. 任何开发都必须从 develop 开始
    git flow init

  • 开始新Feature:
    git flow feature start some_awesome_feature

  • 发布新特性分支到远程服务器(也就是push到远程):
    git flow feature publish some_awesome_feature

  • 取得其它用户发布的新特性分支,并签出远程的变更:
    git flow feature pull origin some_awesome_feature

  • 完成一个Feature:
    该命令将会把feature/some_awesome_feature合并到develope分支,然后删除功能(feature)分支。
    git flow feature finish feature/some_awesome_feature

  • 开始一个Release:
    当你的功能点都完成时(需要发布新版本了),就基于develop创建一个发布(release)分支。
    你可以选择提供一个 [BASE]参数,即提交记录的 sha-1 hash 值,来开启动 release 分支. 这个提交记录的 sha-1 hash 值必须是'develop' 分支下的
    git flow release start RELEASE [BASE]

  • Publish一个Release:
    git flow release publish RELEASE

  • 发布Release:
    别忘了git push --tags,标签打在release分支上
    git flow release finish RELEASE

  • 开始一个Hotfix:
    git flow hotfix start VERSION [BASENAME]

  • 发布一个Hotfix:
    git flow hotfix finish VERSION

Git WorkTree应用:

1、应用场景:
 a)我在 feature 分支开发得多些,但总时不时被高优先级的 BUG 打断需要临时去 develop 分一个分支出来解 BUG。
 b)不同分支依赖的node_module包可能不同,打包发布时,可能因为切换分支但是包没有及时更新(被ignore),导致打包不成功
2、解决方法:git 2.6 以上开始提供了 worktree 功能,可以解决这样的问题
3、使用方法:

git worktree add -b <新分支名> <新路径> <从此分支创建>

git worktree add -b myNewBranch ../testDir master

这样,原本的仓库文件夹的同级目录下会出现一个 testDir文件夹。这个仓库里只有一个 .git 文件用来记录这是主仓库的一个工作目录。

相比于克隆多个仓库,使用这种方法创建的多个目录,有诸多好处:
只有一个仓库会占用版本库的空间,其它只占用工作目录的空间,对大型项目而言非常节省空间。
因为所有工作目录共享一个仓库,所以一个更新意味着整个更新(A 目录里对分支做的改动,B 目录里切到此分支也是改动后的;避免到时候找不到某个未推送的改动改到了哪个仓库)

4、删除方法:

如果要删除其中一个工作目录,直接删除文件夹即可。随后使用命令清除多余的已经被删的工作目录:
git worktree prune

5、本地git树清除缓存:

git remote prune origin

我的Git 常用命令:

1、 tag标签
  • 显示所有的tag标签 git tag
  • 查看某个版本系列的缩略tag git tag -l 'v1.0.*'
  • 查看某个版本系列的详细tag git show v0.0.6 可以看到你commit的内容
  • 创建标签 git tag -a v1.0.0 -m "内容:v1.0.0"
  • 推送标签 git push origin v1.0.0
  • 删除标签 删除本地:git tag -d v1.0.0 删除远程:git push origin :refs/tags/v1.0.0
2、 删除node_modules并清除缓存
  • 删除node_module rm -rf node_modules
  • 清除缓存 npm cache clear --force
  • 重新安装依赖 npm install --no-shrinkwrap --update-binary
3、 回滚
  • 查看提交节点 git log
  • 本地强制回滚到某个节点 git reset --hard 12asddf123fsd34fsdfdf
  • 远程强制回滚 git push -f
4、git删除远端文件/文件夹(因为github/gitlab没有直接删除文件夹的操作)
  • 先到你需要修改的文件下
  • 删除远端对应的文件夹,本地不会删除 git rm -r --cached '文件名/文件夹名'
  • git commmit -m '提交'git push...
5、git 开启/关闭文件大小写鉴别(默认关闭,不推荐一直开启,可以在修改文件需要提交的时候开启,提交后再关掉)
  • 开启区分大小写:git config core.ignorecase false
  • 关闭区分大小写:git config core.ignorecase true
6 、修改本地文件名大小写并推送到远端(不要跟我说你可以直接修改文件夹名字然后push)

举个例子:把Add文件夹改成add文件夹,由于window或者在一些开发工具里不支持把Add直接改成同名只是大小写不一样的文件,所以需要先改成add_,然后在改成add

  • 按照上一步的操作打开git的区分大小写
  • cd进入到需要修改的文件夹的上一级
  • Add文件夹改成add_ : git mv Add add_
  • 再把add_ 文件夹改成add : git mv add_ add
  • git commmit -m '提交'git push...
7 、报错:似乎另外一个 git 进程在这个仓库中运行,例如:'git commit' 命令打开了一个编辑器...
  • rm -f ./.git/index.lock
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,125评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,293评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,054评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,077评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,096评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,062评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,988评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,817评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,266评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,486评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,646评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,375评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,974评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,621评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,642评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,538评论 2 352

推荐阅读更多精彩内容