關於git-flow的實踐

關於git的使用上深究的話是有不少疑惑點的,因此寫篇文章記錄下。git

概述

以下圖,是經常使用的git工做策略,網上基本都在說這一套的了。bash

Image result for gitflow

主要的概念就是,有feature的時候就在develop上拉一條獨立branch出來作,一條branch對應一個feature,作完之後在merge/rebase進去develop,要發佈版本的時候在從develop裏面抽出來到release branches ( 這部分有的團隊不同,他們會先把develop穩定的版本抽到master而後發佈的時候是從master中拉取 )。服務器

總體概念是很簡單的,也有不少輔助工具(例如sourcetree就自帶有git flow工具,推薦使用)去幫忙實現這個策略。可是帶新人的時候他們總會遇到相似的問題,主要是GIT用得不熟悉。工具

開始實踐

正常flow

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節點新增分支就行。

相關文章
相關標籤/搜索