昨天寫了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