說來有幸,此次實習入職的時間點很是巧,時間點正好是team剛把代碼從svn遷移到git上,因此就利用這個契機好好學習了一下在git下的項目開發流程,在本篇博客中將會簡單介紹git下最基本最經常使用的開發流程。git
首先,咱們須要明確一點的是,在git repo下,咱們通常將某個項目的全部分支分爲如下幾條主線。shell
顧名思義,既然名字叫Master,那麼該分支就是主分支的意思。在git repo下主分支的職責主要就是負責記錄stable版本的迭代,當在beta版本的項目或是開發版本的項目獲得了充分的驗證以後,我才能將分支併入master分支。master分支永遠是production-ready的狀態,即穩定可產品化發佈的狀態。網絡
這個分支就是咱們日常開發的一個主要分支了,不論是要作新的feature仍是須要作bug fix,都是從這個分支分出來作。在這個分支下主要負責記錄開發狀態下相對穩定的版本,即完成了某個feature或者修復了某個bug後的開發穩定版本。svn
這是由許多分別負責不一樣feature開發的分支組成的一個分支系列。new feature主要就在這個分支系列下進行開發。當我在一個大的develop的迭代之下,每每咱們會把每個迭代分紅不少個功能點,並將功能點分派給不一樣人的人員去開發。每個人員開發的功能點就會造成一個feature分支,當功能點開發測試完畢以後,就會合併到develop分支去。學習
一樣,這也是有多個分支組成的一個分支系列。這個分支系列從develop分支出來,也就是預發分支。在預髮狀態下,咱們每每會進行預發環境下的測試,若是出現缺陷,那麼就在該release分支下進行修復,修復完畢測試經過後,即分別併入master分支後develop分支,隨後master分支作正常發佈。測試
這個分支系列也就是咱們常說的緊急線上修復,當線上出現bug且特別緊急的時候,就能夠從master拉出分支到這裏進行修復,修復完成後分別併入master和develop分支。spa
下面這張圖將完整展現這一個流程.net
接下來,我將會以簡單例子和命令的方式演示幾個主要開發流程。code
首先咱們得創建一個用於練習的項目開發
mkdir gitFlow cd ./gitFlow/ touch 1.txt touch 2.txt git init git add -A git commit -m 'master init'
咱們首先創建項目文件目錄,也就是gitFlow,而後git init進行初始化.git文件操做,以後生成兩個文件做爲基礎並添加進track list,最後commit到本地。因而咱們第一個版本的master分支下的commit就創建好了。我能夠經過git log以及git branch來查看一下當前的情況就一目瞭然了。
$ git log commit 2ea6fb8ba4f873bb08dfeaeabd473793211c37eb Author: nyankosama <825138000@qq.com> Date: Wed Oct 16 19:30:03 2013 +0800 master init $ git branch * master
而後咱們從master分支中拉出develop分支
$ git checkout -b develop Switched to a new branch 'develop'
如圖
當前develop和master的head都指向同一個節點,那麼咱們最簡單的準備工做就已經完成了。
接下來將會展現當有新的需求或功能點須要開發時的一個開發流程。首先假設如今有一個功能點,指派給A同窗進行開發了,那麼A同窗應該怎麼作呢?首先,他應該從最新develop分支中拉出一個feature分支,假設爲該feature分支命名爲feature1。
$ git checkout -b feature1 Switched to a new branch 'feature1' $ git branch develop * feature1 master
因而,咱們便建立並切換到了feature1分支。
$ ls 1.txt 2.txt $ echo "feature1" >> 1.txt
因而如今A同窗開始了他的開發,他將feature1寫入了1.txt,這樣他就完成了該功能點。那麼以後他應該進行commit,並提交QA進行相應的功能測試。
$ git status # On branch feature1 # Changes not staged for commit: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: 1.txt # no changes added to commit (use "git add" and/or "git commit -a") $ git add -A $ git commit -m 'feature1'
提交以後,咱們能夠很容易的看到當前的一個分支節點網絡的狀況,如圖。
A同窗開發的feature1分支有了更新,已經超前於develop分支,所以咱們如今須要對feature1分支進行合併操做。
$ git checkout develop Switched to branch 'develop' $ git merge feature1 Updating 2ea6fb8..8d30443 Fast-forward 1.txt | 1 + 1 file changed, 1 insertion(+)
由於當前咱們並無發生衝突,因此develop分支的head只是單純的forward到了feature1分支的節點上。因而,我便完成了分支的合併,當前的分支網絡以下圖。
develop分支和feature1分支的head都在同一個節點,A同窗的本次開發任務已經完成。
接下來將展現如何處理衝突,如今咱們假設又有兩個功能點指派給A同窗和B同窗開發,兩位分別將feature2 和 feature3 字符串寫入2.txt,而後提交到本身的分支中。
$ git checkout -b feature2 Switched to a new branch 'feature2' $ echo "feature2" >> 2.txt $ git add -A $ git commit -m 'feature2' [feature2 aaf2653] feature2 1 file changed, 1 insertion(+)
$ git checkout develop Switched to branch 'develop' $ git checkout -b feature3 Switched to a new branch 'feature3' $ echo "feature3" >> 2.txt $ git add -A $ git commit -m 'feature3' [feature3 060c9d0] feature3 1 file changed, 1 insertion(+)
好了,讓咱們切換回develop分支進行merge。
$ git checkout develop Switched to branch 'develop' $ git merge feature2 Updating 96f1771..aaf2653 Fast-forward 2.txt | 1 + 1 file changed, 1 insertion(+)
咱們merge到feature2時,還未出現衝突,由於develop只是forward到了feature2的節點,而此時feature3的節點已經沒法有develop直接forward過來,因此當咱們merge feature3分支時就會出現衝突。
$ git merge feature3 Auto-merging 2.txt CONFLICT (content): Merge conflict in 2.txt Automatic merge failed; fix conflicts and then commit the result.
讓咱們來看看衝突的2.txt
<<<<<<< HEAD feature2 ======= feature3 >>>>>>> feature3
顯而易見,咱們須要手動將文件衝突的部分進行修改。咱們刪除掉git爲咱們添加的衝突指示,並讓feature2和feature3字符串同時保留在2.txt中後提交。
$ cat 2.txt feature2 feature3 $ git add 2.txt $ git commit [develop f5cb288] Merge branch 'feature3' into develop
好了,讓咱們來觀察一下分支節點圖
如圖所示,feature2和feature3便已經順利地合併到了develop分支中。
[1]: http://static.oschina.net/uploads/space/2014/0529/102737_T9YC_1781981.jpg
[2]: http://static.oschina.net/uploads/space/2014/0529/103631_xmDb_1781981.png
[3]: http://static.oschina.net/uploads/space/2014/0529/103821_gnR6_1781981.png
[4]: http://static.oschina.net/uploads/space/2014/0529/103848_y10l_1781981.png
[5]: http://static.oschina.net/uploads/space/2014/0529/104054_3UN1_1781981.png