關於git的使用上深究的話是有不少疑惑點的,因此寫篇文章記錄下。git
以下圖,是經常使用的git工做策略,網上基本都在說這一套的了。bash
主要的概念就是,有feature的時候就在develop上拉一條獨立branch出來作,一條branch對應一個feature,作完之後在merge/rebase進去develop,要發佈版本的時候在從develop裏面抽出來到release branches ( 這部分有的團隊不同,他們會先把develop穩定的版本抽到master而後發佈的時候是從master中拉取 )。服務器
總體概念是很簡單的,也有不少輔助工具(例如sourcetree就自帶有git flow工具,推薦使用)去幫忙實現這個策略。可是帶新人的時候他們總會遇到相似的問題,主要是GIT用得不熟悉。工具
1) master新增一個初始文件1.txt,而後push到remote測試
2) 成功push之後,新增branch -> developspa
git checkout -b develop
當前的分支狀態就是一個小點點,爲了看得更清楚些,會在develop進行一次推動:增長一個2.txt文件,並在1.txt文件中增長一行內容。code
3) 新增feature
如今要開發一個新的需求,咱們先基於develop拉一條branch開發
git checkout -b feature/1
而後在1.txt 隨便加點東西,目前 1.txt的內容以下:rem
master - Hello World develop - My Baby feature/1 - Test
commit源碼
4) 新增第二條feature
爲了模仿協同開發,咱們基於develop分支從新拉一份源碼,而後新增第二條branch: feature/2。一樣修改一下 1.txt :
master - Hello World develop - My Baby feature/2 - Test2
由於兩條feature都是基於develop,而且都沒有push,因此feature2看不到feature1的內容
5) feature1,2都完成開發,各自commit和push之後
能夠看到如今開始出現了分叉,這個時候咱們須要在develop branch整理一個版本發佈到測試服務器上測試了,分別把兩條branch rebase到develop上。
5.1) 先rebase feature/1
疑惑點:誰rebase誰?
這個是帶新人的時候常被問到的問題,咱們的原則是用分支較後的rebase到較前的分支上,能夠看到咱們的develop是在feature/1後面的,因此是在develop的分支上而後對feature/2進行rebase。
develop成功走到feature/1的節點上了,沒有衝突,而後要rebase feature/2 ,一樣是在develop上去rebase feature/2。能夠預料的是,由於兩個feature都改了同一個文件,因此必然會有衝突要處理。
master - Hello World develop - My Baby <<<<<<< HEAD feature/2 - Test2 ======= feature/1 - Test >>>>>>> feature/1 done
把1.txt修改爲以下:
master - Hello World develop - My Baby feature/2 - Test2 feature/1 - Test
而後add一下1.txt,用git status查看一下當前狀態:
mac002:gittest sevens$ git status rebase in progress; onto 87e2b10 You are currently rebasing branch 'develop' on '87e2b10'. (all conflicts fixed: run "git rebase --continue") Changes to be committed: (use "git reset HEAD <file>..." to unstage) modified: 1.txt
文件修改好了,再用下面命令繼續rebase:
mac002:gittest chensh$ git rebase --continue Applying: feature/1 done
成功合併兩條feature分支
如上圖,藍色是咱們的develop分支,能夠看到feature/1和feature/2的代碼都已經成功合併到develop分支上,而後push到remote就能夠了。
疑問點:爲何圖上feature/1的分支感受沒有合到develop上?
其實這就是rebase和merge的分別,咱們能夠回到feature/1,來對develop進行一次merge看看效果:
一樣會有衝突要處理,解決完衝突之後,commit一下,獲得以下分支圖:
合併以後feature/1是在develop的以前。
因此咱們能夠看到rebase和merge的區別,rebase是把分支的內容合併到目標分支上,而自己的分支是不會合併到目標分支上的,所以rebase了之後,咱們是能夠直接把分支delete掉的。而merge就是把整個分支合併到目標分支身上。
6) 發佈測試版本
這個時候,爲了更清晰,咱們能夠在當前節點上增長一個tag來紀錄當前的版本:
就能夠提取出來上測試服了
7) 發佈生產版本
回到咱們的gitflow圖上,咱們要須要一條branch 叫release,因爲是第一個版本,因此直接基於當前develop節點新增分支就行。