git版本控制開發流程小結筆記(一)

前言

說來有幸,此次實習入職的時間點很是巧,時間點正好是team剛把代碼從svn遷移到git上,因此就利用這個契機好好學習了一下在git下的項目開發流程,在本篇博客中將會簡單介紹git下最基本最經常使用的開發流程。git

相關分支

首先,咱們須要明確一點的是,在git repo下,咱們通常將某個項目的全部分支分爲如下幾條主線。shell

1. Master

顧名思義,既然名字叫Master,那麼該分支就是主分支的意思。在git repo下主分支的職責主要就是負責記錄stable版本的迭代,當在beta版本的項目或是開發版本的項目獲得了充分的驗證以後,我才能將分支併入master分支。master分支永遠是production-ready的狀態,即穩定可產品化發佈的狀態。網絡

2. Develop

這個分支就是咱們日常開發的一個主要分支了,不論是要作新的feature仍是須要作bug fix,都是從這個分支分出來作。在這個分支下主要負責記錄開發狀態下相對穩定的版本,即完成了某個feature或者修復了某個bug後的開發穩定版本。svn

3. Feature branches

這是由許多分別負責不一樣feature開發的分支組成的一個分支系列。new feature主要就在這個分支系列下進行開發。當我在一個大的develop的迭代之下,每每咱們會把每個迭代分紅不少個功能點,並將功能點分派給不一樣人的人員去開發。每個人員開發的功能點就會造成一個feature分支,當功能點開發測試完畢以後,就會合併到develop分支去。學習

4. release branches

一樣,這也是有多個分支組成的一個分支系列。這個分支系列從develop分支出來,也就是預發分支。在預髮狀態下,咱們每每會進行預發環境下的測試,若是出現缺陷,那麼就在該release分支下進行修復,修復完畢測試經過後,即分別併入master分支後develop分支,隨後master分支作正常發佈。測試

5. Hotfix branches

這個分支系列也就是咱們常說的緊急線上修復,當線上出現bug且特別緊急的時候,就能夠從master拉出分支到這裏進行修復,修復完成後分別併入master和develop分支。spa


下面這張圖將完整展現這一個流程.net


分支管理策略

接下來,我將會以簡單例子和命令的方式演示幾個主要開發流程。code

1. 準備工做

首先咱們得創建一個用於練習的項目開發

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都指向同一個節點,那麼咱們最簡單的準備工做就已經完成了。

2. 功能點開發

接下來將會展現當有新的需求或功能點須要開發時的一個開發流程。首先假設如今有一個功能點,指派給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同窗的本次開發任務已經完成。

3. 處理衝突

接下來將展現如何處理衝突,如今咱們假設又有兩個功能點指派給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

相關文章
相關標籤/搜索