git分支管理与使用规范

git分支管理与使用规范

分支管理

flow

  • git flow
  • github flow
  • gitlab flow
  • fn flow

分支与开发定义

主要分支

  • master

    线上分支, 一直存在

  • develop

    常规开发分支, 一直存在

  • masterfix

    线上bug修改分支, 一直存在

辅助分支

  • feature/*

    功能开发分支, 从develop分支而来, 然后合并入develop, 最终删除.

  • release/*

    上线分支, 从develop分支而来, 然后合并入master, 并应用到develop, 最终删除.

  • hotfix/*

    线上bug修改分支, 从masterfix分支而来, 然后合并入masterfix, 最终删除.

如何使用各种分支

init

一个项目初始有master分支, 需要新建立一个develop分支和masterfix分支.

git br -b develop 
git push origin develop

git br -b masterfix
git push origin masterfix

feature

常规功能开发需要从develop分支checkout出feature分支.

git checkout -b feature/GET-1008-添加用户查询列表 [develop]

开发完毕后合并回develop分支

git checkout develop
git pull // 先更新develop
git merge feature/GET-1008-添加用户查询列表 --no-ff
git push origin develop

git branch -d feature/GET-1008-添加用户查询列表

Release

开发完毕, 准备发布:

git checkout -b release/1.0.0 [develop]

然后在发布分支上处理一些发布操作, 比如更改版本号, 上线前测试, 问题修改等等. 当分支可以进行上线发布后:

git checkout master
git merge release/1.0.0 --no-ff 
git tag -a 1.0.0

至此release完成, 但是需要将在release分支上的修改应用到develop上.

git checkout develop
git merge release/1.0.0 --no-ff

git branch -d release/1.0.0

然后, 我们可以激活masterfix分支, 同步一下已经上线的master分支, 为修改将要出现的线上bug做准备

git checkout masterfix
git merge master // 在正常情况下, 这里一定是fast-faward

hotfix

当出现bug时, 我们需要从master或者是masterfix分支上分出hotfix分支来修改bug.

git checkout -b hotfix/修改空指针 masterfix

修改完毕后

git checkout masterfix
git merge hotfix/修改空指针 --no-ff

期间可以进行多次hotfix, 最后当masterfix测试后没有问题, 准备上线:

git checkout master
git merge masterfix --no-ff

在master上打下当前上线的tag

git tag -a 1.0.1

同样, 这些修改要应用到develop分支上

git checkout develop
git merge masterfix --no-ff

分支与环境对应?

  • master -- online
  • release -- off
  • develop -- ci
  • masterfix -- online-bug-fix
  • feature -- local, dev

总结

使用规范

鼓励开分支

鼓励本地开分支开发, 独立功能独立分支.

将分支上提交合并

分支上开发的commit建议合并为一个commit, 这样易读, 方便主分支管理.

一种最简单直接的方法

git reset [分支开始处]
git commit -m "..."

另一种方法, 在feature分支上执行

git rebase -i develop // 将feature分支的修改应用到develop上

// 后续操作
http://www.ruanyifeng.com/blog/2015/08/git-use-process.html

保留分支信息

在不同分支合并时使用 --no-ff 参数生成merge commit

commit e562022b423f7bf29f77927dea4d13cb05230681
Merge: d88f815 799b7f8
Author: 杨晓辰 <yangxiaochen@yangxiaochendemacbook-pro.local>
Date:   Tue May 31 17:10:41 2016 +0800

    Merge branch 'feature/welcome' into develop

commit 799b7f87b99d5f5c49acf2edd8a6a363ff44f29f
Author: 杨晓辰 <yangxiaochen@yangxiaochendemacbook-pro.local>
Date:   Tue May 31 17:10:11 2016 +0800

    也修改auth

commit 18e7893f1583559003f7a4bb41fd03b937b3ed42
Author: 杨晓辰 <yangxiaochen@yangxiaochendemacbook-pro.local>
Date:   Tue May 31 17:08:04 2016 +0800

    修改 auth

减少以及消除无意义的分支内merge

同一分支更新时要避免产生无意义的merge

如果是一个人使用git-flow, 你会发现你所有的commit以及commit log都是有意义的. 你所有的更改, feature合并都是有明确记录的.

但是在多人使用下, 大家各自在本地开发, 往develop分支上merge, 那么就会出现每个人的develop分支不一致. 那么当一个人把自己的develop分支push到远端时, 其他人pull的时候就会出现分支合并, 产生 "Merge branch 'develop' of remote into develop" 的类似commit.

很多时候, 合并时没有冲突, 自动完成. 这种merge产生的commit是没有意义的, 而且会让分支看起来混乱.

按照以下规则可以减少甚至消除这种无意义的commit:

  1. 本地在往develop分支进行合并时, ** 先在develop上执行git pull **, 当你没有在本地对develop分支有commit时, 执行git pull是会发生Fast-forward合并的, 这种默认并不产生commit.
  2. 将feature合并到develop上.
  3. push develop. 将你的修改提交到远端.

多数时候, 如果多个人分开执行以上操作, 是不会有问题的.

如果多个人同时进行以上操作, 那么在进行第三步的时候, 是push不上去的, 需要先pull, 那么又会产生所谓的无意义commit, 该怎么办呢:

这时不要用git pull来拉取更改, 改为使用:

git pull --rebase

这个命令会将远端代develop拉下来, 然后从本地develop上跟远端develop分叉的地方开始, 将本地的commit一个个应用到远端develop的末端, 使之成为一条直线, 从而没有了merge commit.

关于冲突, rebase的时候也会有冲突:

比如远端 a->b->c

你的 a->b->d

进行rebase之后 a->b->c->e, 其中e的更改内容和log就是你的d, 如果有冲突, 冲突的修改也是提现在e

冲突提交

修改完冲突, 我们会进行commit提交冲突修改. 不要使用git commit -m, 请直接使用git commit, git会识别你这是一个冲突提交.

常用操作

回滚
git reset --hard [version] // 丢弃版本后的所有修改
git reset [version] // 保留版本后的所有已提交修改
git reset --soft [version] // 保留版本后的所有已提交修改到commit stage

补充提交

git commit --amend

提交tag到服务器

git push origin --tags

日志与diff

sourcetree // 软件

参考

http://nvie.com/posts/a-successful-git-branching-model/

Git 工作流程

合并commit

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

推荐阅读更多精彩内容

  • 多种多样的工作流使得在项目中实施Git时变得难以选择。这份教程提供了一个出发点,调查企业团队最常见的Git工作流。...
    JSErik阅读 4,311评论 2 8
  • 1.git的安装 1.1 在Windows上安装Git msysgit是Windows版的Git,从https:/...
    落魂灬阅读 12,590评论 4 54
  • git常用命令 GIT常用命令备忘:http://stormzhang.com/git/2014/01/27/gi...
    新篇章阅读 8,384评论 1 26
  • 妈妈出嫁后,在居委会的大姨为妈妈找到一处公租房。公租房在马山窖,门前有一条内河,以前河水清澈是附近居民的生活用水,...
    mimi播报阅读 316评论 2 6
  • 这两年的年过的不算好。恼人的亲戚们毫无疑问占了大多数原因,但更重要的其实是自己仍旧没有资本面对他们的显摆。 本科比...
    燃fancier阅读 227评论 0 3