實習第一天,上司讓我學習一下Git Flow

簡述Git Flow

首先,Git Flow並非Git的替代品,Git Flow只是把標準的Git命令用腳本組合了起來,造成比較有效而簡單的命令。html

Git Flow只是給咱們提供一個更簡便的工做流程命令,而更重要的是咱們須要去學習和理解關於版本控制系統的工做流程,纔能有效的迭代產品,避免混亂。git

而當項目處於一個多人協做的狀態下,工做流程顯得很是之重要。假設當兩個甚至多個開發者同時再開發各自新功能時,若是在同一分支上進行協做時,這必然會產生大量的衝突。而工做流程的作法,就是每一個開發者能夠各自切出一個獨立分支,當各自功能實現而且測試成功後,再自行合併到master分支中,甚至無需等待其餘功能實現再一塊兒發佈。github

分支應用情境

Git Flow中,主要的分支有masterdevelophotfixreleasefeature 這五種分支。masterdevelop分支是咱們最多見的分支,它們被稱做長期分支,一直存活在整個工做流程中,而其它的分支大部分會因任務結束而被刪除。web

git flow分支應用示意圖

master分支

該分支主要用來存放穩定、隨時能夠上線的版本。shell

這個分支的來源只能從別的分支合併過來,開發者不會直接commit到這個分支上。markdown

一般咱們也會在這個分支上的提交打上版本號標籤。curl

develop分支

這個分支主要是全部開發的基礎分支。ide

當要添加功能時,全部功能都是從這個分支切出去的,而功能分支實現後,也都會合並回來這個分支中。oop

hotfix分支

當線上產品發生了緊急問題的時候,就會從master分支中開一個hotfix分支出來進行修復。gitlab

hotfix分支修復完成以後,就會合併到master分支中,而且也會合併到develop分支中。

release分支

develop分支完成需求後,就能夠從develop分支中開一個release分支,進行上線前最後的測試。

測試完成後,釋放release分支將會同時合併到master以及develop分支中。

feature分支

當咱們須要補充功能的時候,就會從develop分支中開一個feature分支進行功能開發。

當功能實現後,在將feature分支合併到develop分支中,等待最後的測試發佈。

示意圖

git flow分支應用示意圖

安裝與使用

安裝

Mac

brew install git-flow
複製代碼

若是沒有安裝brew的話可以使用下列命令進行安裝:

/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"
複製代碼

Win

Windows安裝git flow

初始化

先將項目克隆到本地。

git clone <project-url>
複製代碼

初始化Git Flow

git flow init
複製代碼

命令行會提示你是否修改Git Flow提供的默認分支前綴。不一樣場景的分支前綴不一樣,默認狀況下分支前綴是這樣的。

場景 分支前綴
新功能 feature
預發佈 release
熱修復 hotfix
打標籤
Which branch should be used for bringing forth production releases?
   - develop
   - master
Branch name for production releases: [master]

Which branch should be used for integration of the "next release"?
   - develop
Branch name for "next release" development: [develop]

How to name your supporting branch prefixes?
Feature branches? [feature/]
Release branches? [release/]
Hotfix branches? [hotfix/]
Support branches? [support/]
Version tag prefix? []
複製代碼

分支前綴的做用是區分不一樣分支的使用場景,同時當你使用Git Flow命令時就不須要手動增長分支前綴,Git Flow會幫你加上。

一般狀況下不須要修改默認的命名前綴,只須要加上-d就能夠跳過修改命名步驟。

git flow init -d
複製代碼

feature場景

feature場景

當咱們須要開發一個新功能的時候,此時須要基於develop分支拉出feature分支進行開發,即feature場景的生命週期開始。

一般來講,一種場景的完整生命週期至少包含如下幾種行爲:

  • start :開始開發
  • publish :發佈到遠程分支
  • finish :完成開發、合併分支

start

新功能開始開發前,需準備好開發分支。

git flow feature start <feature-name>
複製代碼

執行上面命令後,將會在本地建立一個名爲<feature-name> 的分支,並切換到該分支。

並且不管你當前處於哪一個分支,它都會基於本地develop分支建立的。

上述命令至關於執行了下面的Git操做。

git checkout -b feature/<feature-name> develop
複製代碼

須要注意的一點是,該分支是基礎本地的develop 分支建立,因此執行此命令錢通常須要拉取最新的遠程代碼。

publish

在本地開發完成新功能並進行commit操做後,須要將本地代碼提交到遠程倉庫。

git flow feature publish <feature-name>
複製代碼

該命令主要作了三件事情:

  • 建立一個名爲feature/<feature-name>的遠程分支
  • 本地分支track遠程分支
  • 若是本地存在還沒提交的代碼,就進行代碼提交
git push origin feature/<feature-name>
git push --set-upstream origin feature/<feature-name>
git push origin
複製代碼

當你執行後publish操做後,後續還須要進行代碼提交的話,只需執行正常的push命令既可。

git push
複製代碼

finish

當功能開發完畢後就將進入測試階段,此時須要將該分支合併到develop分支。

git flow feature finish <feature-name>
複製代碼

該命令也主要作了三件事情:

  • 切換到develop分支
  • 合併代碼到develop分支
  • 刪除本地feature/<feature-name>分支
git checkout develop
git merge feature/<feature-name>
git branch -d feature/<feature-name>
複製代碼

Git Flowmerge操做與默認的git merge操做有些不一樣。

默認狀況下它會檢查本次merge有多少commit記錄,若是僅有一條的話採用fast-forward模式,即只移動HEAD指針而不會生成提交記錄;若是超過一條commit的話,這採用no-ff模式,該模式下則會多生成一條mergecommit記錄。

這樣作的好處是當有多條提交記錄時方便進行代碼回退和記錄監察,而只有單條提交記錄的時候則簡化代碼提交記錄從而便於管理。

finish操做過程當中,若是merge發生了衝突,則會終端finish操做,不會刪除feature/<feature-name>分支,同時也處於develop分支上。

當本地衝突解決並commit後,從新進行finish操做便可。

另外,finish指令還支持三個附加參數:

  • -r :即merge前先執行rebase,但即便rebase後符合fast-forward條件也不必定會用fast-forward
  • -F :即合併完成連同遠程分支一併刪除。
  • -k :即保留本地feature分支,不執行delete動做。

release場景

release場景

當新功能開發完成後,將進入測試階段,此時須要基於develop分支拉出release 分支進行集成測試,也有將release場景做爲預發佈環境進行測試。

在這種狀況下,通常而言release只有少數改動。

start

使用start開啓一個release場景。

git flow release start <release-name>
複製代碼

該命令會基於本地的develop分支建立一個release/<release-name>分支,並切換到這個分支。

須要注意一點是,若是本地還有未finishrelease分支的話,將不容許使用start指令開啓新的release分支,這一點是對並行發佈的一個限制。

publish

爲了讓其餘協同人員可以看到該分支並一同測試,須要將其發佈出去。

git flow release publish <release-name>
複製代碼

finish

待測試經過後須要發佈正式版:

git flow release finish <release-name>
複製代碼

該命令的動做會比較多,大體是:

  • git fetch,拉取最新的代碼
  • 將分支合併到master分支
  • 生成名爲<release-name>tag
  • 將分支合併到develop分支
  • 刪除release/<release-name>分支
  • 切換回develop分支

若是merge產生衝突不會終止流程,只是不會將本地的release分支刪除。待解決完衝突後需再次執行finish操做。

finish只是完成了本地代碼的一系列操做,可以使用下列命令進行推送全部的分支和tag

git push origin --all
git push origin --tag
複製代碼

hotfix場景

release場景

若是在線上發現了bug,須要進行緊急修復的時候,就須要用到了hotfix場景。

start

git flow hotfix start <hotfix-name>
複製代碼

該命令將從master分支建立了一個hotfix/<hotfix-name>的分支並切換到該分支。

finish

hotfix沒有publish命令,由於Git Flow認爲hotfix應該是小範圍的改動,不須要其餘協同人員參與。

但本地修改結束並進行commit操做後,則執行finish操做。

git flow hotfix finish <hotfix-name>
複製代碼

該命令所作任務與release基本相同,先拉取代碼,而後將分支合併到masterdevelop分支中,而且打上tag,而後刪除該分支,最後切回develop分支。

其餘代碼工做流

Git Flow類似的代碼管理工做流還有Github Flow和[Gitlab Flow][docs.gitlab.com/ee/topics/g…

  • Github Flow是簡化版的Git Flow,它使用了mainfeature來管理代碼,它只有一個長期分支,就是main
  • Gitlab Flow更關注代碼的持續集成,一個版本須要建立測試環境、預覽環境、生成環境的分支,最後彙總到stable branch分支用於發佈。
相關文章
相關標籤/搜索