前期工作
-
對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 合併方式,而是策略合併,策略合併會讓我們多一個合併提交。這樣做的好處是保證一個非常清晰的提交歷史,可以看到被合併分支的存在。
從上圖可以看到,Feature 分支上的三個節點不選擇Fast-Forward的方式合併,依然保留了Feature的提交歷程,節點流動清晰、容易追溯。
GitFlow 工作流示意圖
圖中畫了 Git Flow 的五種分支,master
,develop
,feature branchs
,release branchs
, hoxfixes
,其中 maste
和 develop
字型被加粗代表主要分支。master
分支每合併一個分支,無論是 hotfix
還是 release
,都會打一個版本標籤。通過箭頭可以清楚的看到分支的開始和結束走向,例如 feature
分支從 develop
開始,最終合併回 develop
,hoxfixes
從 master
檢出建立,最後合併回 develop
和 master
,master
也打上了標籤。
工作流程
瞭解以上概念,我們接著之前建立的倉庫繼續搗鼓。
-
第一步:基於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 複製程式碼
至此,以上步驟可以處理絕大部分協同開發的情況