git 做單版本在線的專案是很成熟的,流程很清晰,每個issue創建一個branch,然後合併到master,打tag即可。
例如web項目,發布了1.0.0,然後修bug發布1.0.1、 1.0.2,新功能1.1.0、1.2.0,改版大功能2.0.0 。只有一個版本在維護,一般不會出現 1.0.0 和 2.0.0 同時都在發布新版的情況。
git簡單流程:http://rogerdudler.github.io/git-guide/index.zh.html
複雜點的流程:http://jiongks.name/blog/a-successful-git-branching-model/
但多版本並行發布的時候怎麼辦?
以Ubuntu系統為例,14.04 、 14.10 、 15.04 同時存在,14.10發布後,14.04也在持續的發布新版,例如14.04.1 、 14.04.2。
如果按照上面的git簡單工作流程:
14.04在master裡打tag發布了,下一個里程碑是14.10,很多人開發了很多分支,然後合併到master裡,每天發布daily build版,看起來很美好。
突然,14.04有個緊急bug要修復,不可能等幾個月等到14.10發佈時帶著一起修復,需要發布14.04.1那怎麼辦?從哪裡checkout 14.04的程式碼?即使從tag裡checkout下來了,修復完畢,合併到哪裡?只能合併到master,但master是14.10,不能發行啊。
如果依照git複雜流程:
14.04在master打tag發布了,下一個里程碑是14.10,很多人開發了很多分支,然後合併到develop分支裡,每天發布daily build版。
突然,14.04有個緊急bug要修復,從master拉一個分支叫做hotfix-xxx,修復完畢,合併到master,打tag,發布14.04.1 。也合併到develop。
當14.10開發完畢,打算發佈時,從develop拉一個分支叫做release-14.10,收尾完畢,把release-14.10合併到master,打個tag,發布了。也合併到develop,看起來很美好。
突然,14.04又有個緊急bug要修復,需要發布14.04.2怎麼辦?從哪裡checkout 14.04.1的程式碼?即使從tag裡checkout下來了,修復完畢,合併到哪裡?只能合併到master,但master是14.10啊。
是每個版本一個項目? 例如 14.04 、14.10 、15.04 是3個專案?
這樣感覺很奇怪,不優雅。請教大家有沒有什麼好辦法。
为情所困2017-05-02 09:21:04
從tag:v14.04
拉一个分支叫branch:14.04.1-dev
,在里面进行开发,稳定以后打上tag:v14.04.1
就好,不用拘泥於“分支=>開發=>合併”,不需要合併的時候就不合併,一點問題都不會有,尤其是多版本同時維護的時候,cherry-pick取代merge是常態
不過git的master確實有點混淆,不同的項目的策略不一樣,有的master是stable的含義,裡面是穩定版本,新版本在分支裡,有的反過來master是dev的含義,穩定版本在分支裡。還有的master是release的意思,裡面是「保持和線上部署一致的那份程式碼」。 所以我覺得可能直接不用master,用更明確的分支名稱有可能是更好的策略?
为情所困2017-05-02 09:21:04
我認為你描述的場景下,不同的版本在不同的分支下或者不同的項目下基本上是一樣的,因為不同分支之間基本上不會合併了(分支叫什麼名字可以不用太過在意)。那麼在一個改動如果需要應用到不同版本時,我覺得可以考慮如下的方法:
當然,每種方法都有坑是毫無疑問的。
给我你的怀抱2017-05-02 09:21:04
你好,這種複雜的版本場景適合用 Gitflow,可以直接去看 Gitflow 來了解一下。連結為:http://nvie.com/posts/a-successful-git-branching-model/