对Git Flow做点微创新 (1)

不打扰是莪最后的温柔 提交于 2019-12-04 01:29:05

昨天写了Git Flow印象(http://www.jiangyouxin.net/2013/02/11/git_flow.html),总体来说这是个不错的东西,与现在厂里的研发模型非常契合。所以打算稍稍做些修改,然后拿到厂里去推广。

今天做的修改(按老周的话,这叫“微创新”),是在git flow feature finish的时候,提供一个选项,可以将所有修改合并为一个commit提交到develop分支上;feature分支本身的提交历史不再保留。

为什么需要这样一个选项?首先当前的git flow在将feature分支向develop合并的时候,使用了--no-ff,强制生成了一个merge结点。见下图(左):

左图通过merge结点来确定feature之间的边界 —— 如果不使用--no-ff就会形成右图(类似SVN的线性提交历史),日子一久就分不清哪些提交属于同一个feature了。

这已经很好了,但仍不是最好。事实上,feature分支的原始提交历史,很多情况下是无用的。比如说在我厂推广git flow时,feature分支将伴随某个功能“开发 + 测试”的全过程,上面的提交历史体现的是开发和BUG FIX的节奏次序;等合并到develop时,功能基本稳定,只需要合并最终结果,以后也很少会关心这个feature的开发过程中发生了什么事情。

综上,我希望每引入一个功能,只在develop分支上产生一个提交,而不是引入一大堆提交历史。

需求想清楚后实现就比较简单了:给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即可。

release和hotfix也存在与feature类似的问题,但并不完全一样。估计今天改不完了,回头等全部弄完后,再把代码share出来。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!