Git 基礎與工作流

Vane發表於2018-09-21

前期工作

  • 對Git基本命令有個初步的瞭解,本篇部落格不對基本命令一一解釋,推薦學習廖雪峰的Git教程

  • 配置SSH KEY,這一點比較容易被人遺忘。當然如果你不嫌麻煩用Https每次都輸入賬號密碼的話,請忽略這一點。

為什麼遠端倉庫需要SSH Key呢?因為遠端倉庫需要識別出你推送的提交確實是你推送的,而不是別人冒充的, 而Git支援SSH協議,所以,遠端倉庫只要知道了你的公鑰,就可以確認只有你自己才能推送。
當然,遠端倉庫允許你新增多個Key。假定你有若干電腦,你一會兒在公司提交,一會兒在家裡提交,只要把每臺電腦的Key都新增到遠端倉庫,就可以在每臺電腦上往遠端倉庫推送了。

建立遠端倉庫並與本地倉庫關聯

流程圖

建立遠端倉庫

在開發過程中,我們的master 分支通常用於迭代上線版本,例如1.0.0,1.1.0,2.0.0等等,所以我們將 master 分支設為保護分支,避免開發人員往master分支推程式碼。在建立遠端倉庫的時候,建議新增Readme.md檔案初始化倉庫,此時會自動生成master分支,我們就可以將master分支設定為保護分支了。

建立本地倉庫

在將一個專案進行版本管理之前,我們會通常在一個空的資料夾內建立專案或在AndroidStudio直接新建一個專案(AndroidStudio - New Project),完成基礎配置、依賴新增之後,才會初始化git倉庫進行管理(注意將不必跟蹤的檔案新增進.gitignore)

  • 第一步:初始化git倉庫

    $ git init
    複製程式碼
  • 第二步:關聯遠端倉庫

    $ git remote add origin git.XXXXXX(ssh/https)
    複製程式碼
  • 第三步:拉取遠端倉庫

    $ git pull origin master
    複製程式碼

    此時我們就將之前建立的Readme.md檔案拉取下來了。這樣才算真正的與遠端倉庫同步。

  • 第四步:建立並切換分支

    $ git checkout -b develop
    複製程式碼

    develop 分支是我們的開發分支,一般在完成小的功能節點後再推送到遠端倉庫上。在建立並切換到develop分支之後,工作區內儲存著最新的未新增到暫存區的程式碼。

  • 第五步:新增更改並提交

    $ git add . (再次提醒:.gitignore忽略不必要跟蹤檔案)
    $ git commit -m"init project"
    複製程式碼
  • 第六步:推送到遠端倉庫

    $ git push -u origin develop
    複製程式碼

    儘管我們不能將程式碼推送到master分支,但是新建分支並將該分支推送到遠端倉庫是不受限制的。當我們需要上線併合併到master 分支時,我們可以建立一個pull request完成合並。

多人協作開發

Git Flow工作流

Git Flow工作流是 Vincent Driessen 2010 年釋出出來的他自己的分支管理模型,到現在為止,使用度非常高。

Git Flow 的分支結構很特別,按功能來說,可以分支為5種分支,從5 種分支的生命時間上,又可以分別歸類為長期分支和暫時分支,或者更貼切描述為,主要分支和協助分支。

主要分支:

在採用 Git Flow 工作流的專案中,程式碼的中央倉庫會一直存在以下兩個長期分支:

  • master
  • develop

其中 :

  • origin/master 分支上的最新程式碼永遠是版本釋出狀態。
  • origin/develop 分支則是最新的開發進度。

當 develop 上的程式碼達到一個穩定的狀態,可以釋出版本的時候,develop上這些修改會以某種特別方式被合併到 master 分支上,然後標記上對應的版本標籤。

協助分支:

除了主要分支,Git Flow 的開發模式還需要一系列的協助分支,來幫助更好的功能的並行開發,簡化功能開發和問題修復。是的,就是下面的三類分支。這類分支是暫時分支非常無私奉獻,在需要它們的時候,迫切地建立,用完它們的時候,又揮揮衣袖地徹底消失。 協助分支分為以下幾類:

  • Feature Branch
  • Release Branch
  • Hotfix Branch

Feature 分支用來做分模組功能開發,命名看開發者喜好,不要和其他型別的分支命名弄混淆就好,舉個壞例子,命名為 master 就是一個非常不妥當的舉動。模組完成之後,會合併到 develop 分支,然後刪除自己。

Release 分支用來做版本釋出的預釋出分支,建議命名為 release-xxx。例如在軟體 1.0.0 版本的功能全部開發完成,提交測試之後,從 develop 檢出release-1.0.0 ,測試中出現的小問題,在 release 分支進行修改提交,測試完畢準備釋出的時候,程式碼會合併到 master 和 develop,master 分支合併後會打上對應版本標籤 v1.0.0, 合併後刪除自己,這樣做的好處是,在測試的時候,不影響下一個版本功能並行開發。

Hotfix 分支是用來做線上的緊急 bug 修復的分支,建議命名為 hotfix-xxx。當線上某個版本出現了問題,將檢出對應版本的程式碼,建立 Hotfix 分支,問題修復後,合併回 master 和 develop ,然後刪除自己。這裡注意,合併到 master 的時候,也要打上修復後的版本標籤。

Merge 與 --no-ff 引數

需要說明的是,Git Flow 的作者 Vincent Driessen 非常建議,合併分支的時候,加上 no-ff 引數,這個引數的意思是不要選擇 Fast-Forward 合併方式,而是策略合併,策略合併會讓我們多一個合併提交。這樣做的好處是保證一個非常清晰的提交歷史,可以看到被合併分支的存在。

no-Fast-Forward與Fast-Forward對比

從上圖可以看到,Feature 分支上的三個節點不選擇Fast-Forward的方式合併,依然保留了Feature的提交歷程,節點流動清晰、容易追溯。

GitFlow 工作流示意圖

理想的Git網路

圖中畫了 Git Flow 的五種分支,masterdevelopfeature branchs,release branchs , hoxfixes,其中 mastedevelop 字型被加粗代表主要分支。master 分支每合併一個分支,無論是 hotfix 還是 release ,都會打一個版本標籤。通過箭頭可以清楚的看到分支的開始和結束走向,例如 feature 分支從 develop 開始,最終合併回 develophoxfixesmaster 檢出建立,最後合併回 developmastermaster 也打上了標籤。

工作流程

瞭解以上概念,我們接著之前建立的倉庫繼續搗鼓。

多人協作開發流程

  • 第一步:基於develop 新建一條Feature 分支。

    $ git checkout -b myfeature develop
    Switched to a new branch "myfeature"
    複製程式碼
  • 第二步:啪啦啪啦 敲程式碼完成某部分功能並提交

    Complete some function
    
    $ git add .
    $ git commit -m"ok"
    複製程式碼
  • 第三步:切回到develop 分支,同步遠端分支(git pull)

    $ git checkout develop
    $ git pull origin develop
    複製程式碼
  • 第四步:將Feature 分支合併至develop 分支

    $ git merge --no-ff -m"merge" myfeature
    複製程式碼
  • 第五步:解決衝突,add and commit.(如果沒有衝突則忽略該步驟)

    Resolve Conflicts
    
    $ git add .
    $ git commit -m"fix bugs"
    複製程式碼
  • 第六步:將develop分支 推送至遠端倉庫

    $ git push origin develop
    複製程式碼
  • 切換至Feature 分支,HEAD 指向develop分支的最新節點(同步)

    $ git checkout myfeature
    $ git rebase develop
    複製程式碼

    因為前面develop分支主動合併了Feature分支並解決了衝突,所以這一步不會出現任何異常,如果出現異常請檢查前面的步驟是否正確。

  • 將Feature分支 推送至遠端倉庫

    $ git push origin myfeature
    複製程式碼

至此,以上步驟可以處理絕大部分協同開發的情況

相關文章