我的GIT工作流程


Friendbuy是一家互聯網創業公司。產品的源代碼是托管在GITHUB上的。在EC2上有三套環境:生產環境,測試環境和持續集成環境。基本上每天都有大量的代碼被提交,測試和部署。一年多的磨合下來,逐漸理順了GIT的使用流程。但是,最開始並不是這樣的,所有的開發人員都沒有使用過GIT,基本上都是SVN的背景。

最開始的使用方式

只有一個GIT分支,就是MASTER。開發團隊直接向MASTER提交新的改動,部署其實就是在生產環境下執行

git pull

開發人員的日常工作也很簡單

git pull --rebase
git commit -a -m "xxxx"
git push

基本上是把Git當作SVN來使用。

生產環境不穩定

很快就出現了問題。在一次給客戶的演示的過程中,掉鏈子了。

老板很不高興,對於生產環境部署的質量產生了懷疑。

於是為了使得生產環境穩定,團隊決定犧牲時效性,建立更加正規的流程,添加了測試環境和自動集成環境

每次提交的代碼都會被自動集成環境自動進行測試

不定期的會人工部署到測試環境中測試

當測試環境測得差不多的時候才會決定部署到生產環境

另外每次部署到測試環境和產品環境的時候都會打一個標簽

git tag -a xxx -m xxx

 

速度就是生命

眾所周知,互聯網創業公司玩的就是速度。加上了這么一套流程之后,一個feature要發布變得非常冗長。

最要命的是,網站為了嘗試不同的風格,還經常全面改版。每次完整的改版都要協調各方面的資源,特別是有一個很長的UI調整過程。

問題是在網站局部改版的情況下,客戶的其他特性仍然要響應,產品的線上BUG仍然要FIX。

於是就有了分支。

git branch new-retailer-site master
git checkout new-retailer-site
#change some thing
git commit -a -m "xxx"
git push origin new-retailer-site

分支用完了之后,要合並到master中

git checkout master
git merge new-retailer-site
#fix conflit
git commit -a -m "xxx"
git push

最后就可以把分支刪除了

git push origin :new-retailer-site

 

千萬不能搞亂master

分支在很短的時間就沖到了兩位數。對於分支的管理一開始也並不在意。

直到出了這么一個事情:

開發團隊一致決定new-retailer-site已經差不多了,可以“准備”發布了。然后new-retailer-site被合並到了master中。

然后在master上有開發了一些其他特性。

但是new-retailer-site的UI遲遲不能夠讓人滿意。直到有一天開發團隊被要求先把master中的“有用”的feature發布,樣式改版工作延后發布。

這可難辦了,所有的改動已經混雜在同一個分支中了。

最后的解決辦法是用

git log

把一條條的改動給找出來,由於比對實在太麻煩了,還寫了點代碼來干這事

def list_commits(branch):
  commits = local('git log ' + branch + ' ^master --no-merges --format=format:%s,%H', capture=True)
  commits = commits.split('\n')
  for commit in commits:
    print('==> %s <==' % commit.split(',')[0])
    print('https://github.com/friendbuy/apps/commit/%s' % commit.split(',')[1])

然后把找出來的commit,一條條cherry pick出來

git cherry-pick <commit id>

接下來很長一段時間都是搞不清楚,到底是哪個分支是產品部署的分支。

直到某一天,團隊決定以后再也不能隨便把無關分支合並到master了。

正常的工作流程應該是,選定要候選發布的branch,比如說new-retailer-site

git checkout new-retailer-site
git merge master
# fix conflict
git commit -a -m "merge"
git push

然后在測試環境下

git checkout new-retailer-site
git pull

測試通過了之后,確定可以發布到產品環境了

git checkout master
git merge new-retailer-site
git push

然后把剩余的分支,逐個更新

git checkout feature-branch-1
git merge master
# ...
git checkout feature-branch-2
git merge master
# ...

總結

使用feature branch的方式,可以同時進行很多項特性的開發,並有產品的需要決定什么時候發布哪些特性。比如在聖誕節期間,基本上就沒有feature branch被發布,但是開發並不會因此停滯。而且業務的優先級經常調整,經常開發到一半的分支也會被扔掉。

在使用多分支開發的時候要保持一個master分支始終對應“一定會被發布到產品環境的代碼”,以master為中心保持一致的合並方向,不然分支之間亂合並就很難管理了。

目前有一個缺陷是持續集成環境只對master進行測試,理想的情況下應該建立一個staging的分支,持續集成環境也要對staging分支進行測試。

 






免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM