昨天写了Git Flow印象(http://www.jiangyouxin.net/2013/02/11/git_flow.html),整体来讲这是个不错的东西,与如今厂里的研发模型很是契合。因此打算稍稍作些修改,而后拿到厂里去推广。 html
今天作的修改(按老周的话,这叫“微创新”),是在git flow feature finish的时候,提供一个选项,能够将全部修改合并为一个commit提交到develop分支上;feature分支自己的提交历史再也不保留。 git
为何须要这样一个选项?首先当前的git flow在将feature分支向develop合并的时候,使用了--no-ff,强制生成了一个merge结点。见下图(左): 测试
左图经过merge结点来肯定feature之间的边界 —— 若是不使用--no-ff就会造成右图(相似SVN的线性提交历史),日子一久就分不清哪些提交属于同一个feature了。 spa
这已经很好了,但仍不是最好。事实上,feature分支的原始提交历史,不少状况下是无用的。好比说在我厂推广git flow时,feature分支将伴随某个功能“开发 + 测试”的全过程,上面的提交历史体现的是开发和BUG FIX的节奏次序;等合并到develop时,功能基本稳定,只须要合并最终结果,之后也不多会关心这个feature的开发过程当中发生了什么事情。 .net
综上,我但愿每引入一个功能,只在develop分支上产生一个提交,而不是引入一大堆提交历史。 htm
需求想清楚后实现就比较简单了:给git flow feature finish命令增长一个-D(Discard history)参数;发现-D参数存在,则用git merge --squash取代git merge --no-ff;这时不会自动commit,须要在返回0(成功)时再执行git commit,正好也给用户一个机会输入一下commit message。另外删除feature分支时的git branch -d命令也须要相应地改成git branch -D。 开发
以上针对git flow的master分支而言;对于develop分支,已经实现了一个-S(squash)参数,但它在向develop合并的时候是这么写的:
git merge --squash "$BRANCH"
git commit
git merge
这样用最后一句"git merge”又把历史引回来了,这应该是一个BUG。做者或许是为了以后能够用-d删除分支。其实没这必要,既然已经合并过,以后用-D便可。 get
release和hotfix也存在与feature相似的问题,但并不彻底同样。估计今天改不完了,回头等所有弄完后,再把代码share出来。 it