干货:基于 Git Flow 的 Git 最佳实践(附加解决大家经常碰到的问题)
突然想写这一篇Git的使用心得,主要有几个原因,其一是自己使用Git也有快3年时间了,其间自己经历过一些坑,也有迷茫的时候,在呆过的大大小小的团队中,其实每个人也都并不是Git专家,很多对于流程以及Git本身的理解,还处于一个比较混乱的地带。自己写这篇文章希望能抛砖引玉,在总结自己得失的同时,能给大家带来更深层次的思考。
直接进入主题,经过这么多年的实践,多次想避开Git flow寻找更简单的流程,每次自认为找到了捷径,但事实上都发现有这样或者那样更多的问题,所以,我认为最佳的Git实践,仍然得基于标准的Git Flow,来看看Git Flow的标准模型,下面是大家非常熟悉的图:

来自非常经典的Git flow奠基论文:http://nvie.com/posts/a-successful-git-branching-model/
基于这个Git Flow,我所认为的Git 最佳实践,补充和修复了这么几点:
1.分支一共有5类,名称用 / 来区分是因为Sourcetree里面 / 可以作为一个文件夹使用,命名标准为下面这样:
master
develop
feature/***
release/v13.5
hotfix/v13.2
本地的分支可以有一些其他的命名规则,没关系,但是推到远程的必须是这几种命名规范,最好一字不差,比如不要把release写成Release
2.此Git Flow唯一可以变通的地方为开发的时候非必须一定要用feature分支,比如说一个项目刚开始开发的时候,或者突然发现一个不是特别严重的bug,我现在先修改下,想在下一个版本发的时候一起带出去,这种情况就在develop上面改就行了。
3.与Git Flow的论文略微不同,我倡导的是:一个版本开发完成,需要提测的时候,由各个feature合并到develop,然后在develop上开发自测,修复bug,正式提测的时候,由develop迁出release分支,提测
我个人认为这是一个非常良好的开发模型,伸缩性强,适用于各个规模的开发团队,一个人开发,我也会这么干,20个人的团队,也是没有任何问题的。关于这个模型,如果有任何疑问,都可以关注我的公众号(文章底部),然后给我发消息,我会一一解答。
还有关于之前收集网友的很多问题和疑问,我在这里一一回答下:
1,最经常问的,为什么忽略文件无效
因为Git的忽略文件没有办法对已经纳入版本库的文件生效,解决办法:gitignore里面添加完之后,把本地文件删了,然后commit,push上去,别人再更新,就OK了,下次还有这种类型的文件,就直接忽略了
2,Git可以添加项目中的文件夹权限控制吗
不行,问这个问题的原因是因为很多人把svn的思维搬到Git上来,Git并不是以文件夹为单位来组织的,所以现在大多数公司中UI的图片等资源,像png,psd等文件都是用的svn管理,代码用Git管理。想要用这种权限控制的话,很多人另辟捷径选择用Git的子模块和子数来处理,我感觉也是不太好
3,关于Git客户端
我认为就两种选择,命令行和Sourcetree等全局的客户端软件,TortoiseGit根本不适用,原因就是Git不是以文件夹为组织单位的,Tortoise是依托于文件管理器的操作,所以不对付。然后就是各种IDE的插件,很多人用,我个人也是不喜欢,原因很简单,Git是一种生活方式,并不只是在项目中用用而已
4,关于Git代码分支回滚
暴力派reset:
本地的分支先(reset)重置到一个commit,然后:git push -f,强推,这种是属于删除commit历史的行为,而且强推需要权限,一般来说master分支默认都不让强推
优点:彻底清除版本库上无用的代码,干净,但是做这种操作的同时,最好本地新建一个分支备份下代码
缺点:误操作的代价比较大
婉约派revert:
git revert HEAD~1(1代表从0到1,回退包含当前commit的两个commit,然后会创建新的commit)
优点:所有历史都在,回退的做法为新建一个commit来回滚之前几个commit的代码
缺点:回退几个commit这个需要手动计算,比较烦
5,cherry pick合并单个提交
cherry pick不能完全合并单个commit,因为每个commit都是建立在前一个commit之上
关于我:Android和JavaEE开发工程师,运营有微信公众号"大土豆爱开发",原则“简单,分享”,涉及的内容包括但不限于JavaEE,Android,Git等,欢迎大家关注,共同学习。
二维码:

干货:基于 Git Flow 的 Git 最佳实践(附加解决大家经常碰到的问题)的更多相关文章
- Git Flow,Git团队协作最佳实践
规范的Git使用 Git是一个很好的版本管理工具,不过相比于传统的版本管理工具,学习成本比较高, 实际开发中,如果团队成员比较多,开发迭代频繁,对Git的应用比较混乱,会产生很多不必要的冲突或者代码丢 ...
- CI Weekly #18 | flow.ci iOS 最佳实践出炉,正式支持 Git@OSC 构建
如大家所期待,flow.ci 现已支持开源中国的代码仓库 - 码云,可以直接构建 Git@OSC 的项目了,点击创建项目-选择代码仓库-选择码云-绑定 OSChina 账户-选择要构建项目,教程看这里 ...
- git flow工作流实际项目实践
公司项目的开发流程主要是这样 代码分为 develop分支 master分支 平时我开发的时候,主要在develop分支上改动 一般来讲,有以下几种改动方式 1.直接在develop上修改代码 这种一 ...
- 基于springboot的web项目最佳实践
springboot 可以说是现在做javaweb开发最火的技术,我在基于springboot搭建项目的过程中,踩过不少坑,发现整合框架时并非仅仅引入starter 那么简单. 要做到简单,易用,扩展 ...
- 【转载】干货再次来袭!Linux小白最佳实践:《超容易的Linux系统管理入门书》(连载八)用命令实现批量添加用户
Windows添加用户需要至少5个界面,而Linux一条命令就搞定了,这是不是高效人士办公第一法则呢.本文不给你一堆参数和选项,不让你见识教条主义,只给你最实用的代码. 想每天能听到小妞的语音播报,想 ...
- C# 异常处理最佳实践,解决代码分析提示CA1031:不要捕捉一般异常类型的解决办法
异常类型 异常一般分为系统异常 和 应用异常.系统异常有无法连接数据库,而应用异常是业务逻辑异常,比如授权失败. 在 C# 中异常基于 System.Exception,派生出 System.Syst ...
- 我的Android最佳实践之—— 解决闪空界面问题
进入应用时,由于应用的启动Activity都会有默认的theme,所以会跳一下原始界面,才启动我们定义的theme. 修改这个问题的方法,就是给应用启动的Activity设置一个空的theme.如下面 ...
- 应用Git Flow—Git团队协作最佳实践
规范的Git使用 Git是一个很好的版本管理工具,不过相比于传统的版本管理工具,学习成本比较高. 实际开发中,如果团队成员比较多,开发迭代频繁,对Git的应用比较混乱,会产生很多不必要的冲突或者代码丢 ...
- 从一个前端项目实践 Git flow 的流程与参考
Git flow 出自 A successful Git branching model,这里使用了一个前端项目配合本文稿实施了 git flow 并记录流程作出示例和参考,对 hotfix 与持续部 ...
随机推荐
- Web前端的路该怎么走?很迷茫
“路漫漫其修远兮,吾将上下而求索”,这句出自<离骚>. 虽然端午已过,但是还是不影响一个程序员想表(zhuang)达(boy)自己此刻心情的冲动. 偶然路过同事旁边,不(tou)小(kan ...
- Unity3D 骨骼动画原理学习笔记
最近研究了一下游戏中模型的骨骼动画的原理,做一个学习笔记,便于大家共同学习探讨. ps:最近改bug改的要死要活,博客写的吭哧吭哧的~ 首先列出学习参考的前人的文章,本文较多的参考了其中的表述: 1. ...
- zookeeper源码分析-版本生成
zookeeper版本生成规则: min - minor version number micro - minor minor version number qualifier - optional ...
- 用Emacs收发邮件
使用Emacs,将尽可能多的工作放到Emacs中来完成,这样可以提高工作效率. 1.安装必要的LISP插件和程序 $sudo apt-get install stunnel4 $sudo apt-ge ...
- centos文件权限详解
假设回显信息为 ①-②rws③r-x④r-x ⑤1 ⑥root ⑦root ⑧430540 ⑨Dec 20 18:27 ⑩/usr/sbin/passwd ,现在逐一分析其内容. ①. 首字符-,表 ...
- Vue按需加载提升用户体验
Vue官方文档异步组件: 在大型应用中,我们可能需要将应用拆分为多个小模块,按需从服务器下载.为了让事情更简单, Vue.js 允许将组件定义为一个工厂函数,动态地解析组件的定义.Vue.js 只在组 ...
- ip地址0.0.0.0与127.0.0.1的区别(转载)
原文链接:http://blog.csdn.net/ttx_laughing/article/details/58586907 最近在项目开发中发现一个奇怪的问题,当服务器与客户端在同一台机器上时,用 ...
- php设计模式--命名空间与自动载入
关于命名空间: 最早的php是没有命名空间的概念的,这样不能存在相同名称的类或者函数,当项目变大了之后,产生冲突的可能性就高了,代码量也会变大,为了规划,从php5.3开始对命名空间就支持了. 说明代 ...
- workerman启动失败解决
提示stream_socket_server(): unable to connect to tcp://0.0.0.0:2120 (Address already in use)php xxx.ph ...
- mysql left join
MySQL左连接不同于简单连接.MySQL LEFT JOIN提供该表额外字段在左侧. 如果使用LEFT JOIN,得到的所有记录的匹配方式相同, 在左边表中得到的每个记录不匹配也会有一个额外的记录. ...