Git 多人合作、分支管理

源倉庫

在項目的開始,項目的發起者構建起一個項目的最原始的倉庫,我們把它稱爲origin,例如我們的Una項目,origin就是這個項目的源倉庫了。

源倉庫的有兩個作用:

1、彙總參與該項目的各個開發者的代碼
2、存放趨於穩定和可發佈的代碼
源倉庫應該是受保護的,開發者不應該直接對其進行開發工作。只有項目管理者(通常是項目發起人)能對其進行較高權限的操作。

開發者倉庫

上面說過,任何開發者都不會對源倉庫進行直接的操作,源倉庫建立以後,每個開發者需要做的事情就是fork一份源倉庫,作爲自己日常開發的倉庫。

每個開發者所fork的倉庫是完全獨立的,互不干擾,甚至與源倉庫都無關。每個開發者倉庫相當於一個源倉庫實體的影像,開發者在這個影像中進行編碼,提交到自己的倉庫中,這樣就可以輕易地實現團隊成員之間的並行開發工作。而開發工作完成以後,開發者可以向源倉庫發送pull request,請求管理員把自己的代碼合併到源倉庫中,這樣就實現了分佈式開發工作,和最後的集中式的管理。

Git鼓勵大量使用分支:
查看分支:git branch
創建分支:git branch <name>
切換分支:git checkout <name>
創建+切換分支:git checkout -b <name>
合併某分支到當前分支:git merge <name>
刪除分支:git branch -d <name>

分支(Branch)

分支是git中非常重要的一個概念,也是git這一個工具中的大殺器,必殺技。在其他集中式版本管理工具(SVN/CVS)把分支定位爲高級技巧,而在git中,分支操作則是每個開發人員日常工作流。利用git的分支,可以非常方便地進行開發和測試,如果使用git沒有讓你感到輕鬆和愉悅,那是因爲你還沒有學會使用分支。不把分支用出一點翔來,不要輕易跟別人說你用過git。

在文章開頭的那張圖中,每一個矩形內部紛繁的枝蔓便是git的分支模型。可以看出,每個開發者的倉庫都有自己的分支路線,而這些分支路線會通過代碼彙總映射到源倉庫中去。

我們爲git定下一種分支模型,在這種模型中,分支有兩類,五種

永久性分支
master branch:主分支
develop branch:開發分支
臨時性分支
feature branch:功能分支
release branch:預發佈分支
hotfix branch:bug修復分支
永久性分支

永久性分支是壽命無限的分支,存在於整個項目的開始、開發、迭代、終止過程中。永久性分支只有兩個master和develop。

master:主分支從項目一開始便存在,它用於存放經過測試,已經完全穩定代碼;在項目開發以後的任何時刻當中,master存放的代碼應該是可作爲產品供用戶使用的代碼。所以,應該隨時保持master倉庫代碼的清潔和穩定,確保入庫之前是通過完全測試和代碼reivew的。master分支是所有分支中最不活躍的,大概每個月或每兩個月更新一次,每一次master更新的時候都應該用git打上tag,說明你的產品有新版本發佈了。

develop:開發分支,一開始從master分支中分離出來,用於開發者存放基本穩定代碼。之前說過,每個開發者的倉庫相當於源倉庫的一個鏡像,每個開發者自己的倉庫上也有master和develop。開發者把功能做好以後,是存放到自己的develop中,當測試完以後,可以向管理者發起一個pull request,請求把自己倉庫的develop分支合併到源倉庫的develop中。

所有開發者開發好的功能會在源倉庫的develop分支中進行彙總,當develop中的代碼經過不斷的測試,已經逐漸趨於穩定了,接近產品目標了。這時候,我們就可以把develop分支合併到master分支中,發佈一個新版本。所以,一個產品不斷完善和發佈過程就正如下圖:


注意,任何人不應該向master直接進行無意義的合併、提交操作。正常情況下,master只應該接受develop的合併,也就是說,master所有代碼更新應該源於合併develop的代碼。

暫時性分支

暫時性分支和永久性分支不同,暫時性分支在開發過程中是一定會被刪除的。所有暫時性分支,一般源於develop,最終也一定會迴歸合併到develop。

feature:功能性分支,是用於開發項目的功能的分支,是開發者主要戰鬥陣地。開發者在本地倉庫從develop分支分出功能分支,在該分支上進行功能的開發,開發完成以後再合併到develop分支上,這時候功能性分支已經完成任務,可以刪除。功能性分支的命名一般爲feature-爲需要開發的功能的名稱。



舉一個例子,假設我是一名PingHackers網站的開發者,已經把源倉庫fork了,並且clone到了本地。現在要開發PingHackers網站的“討論”功能。我在本地倉庫中可以這樣做:

step 1: 切換到develop分支

>>> git checkout develop

step 2: 分出一個功能性分支

>>> git checkout -b feature-discuss

step 3: 在功能性分支上進行開發工作,多次commit,測試以後...
step 4: 把做好的功能合併到develop中

>>> git checkout develop
# 回到develop分支
>>> git merge --no-ff feature-discuss
# 把做好的功能合併到develop中
>>> git branch -d feature-discuss
# 刪除功能性分支
>>> git push origin develop
# 把develop提交到自己的遠程倉庫中

這樣,就完成一次功能的開發和提交。

release:預發佈分支,當產品即將發佈的時候,要進行最後的調整和測試,這時候就可以分出一個預發佈分支,進行最後的bug fix。測試完全以後,發佈新版本,就可以把預發佈分支刪除。預發佈分支一般命名爲release-*。

hotfix:修復bug分支,當產品已經發布了,突然出現了重大的bug。這時候就要新建一個hotfix分支,繼續緊急的bug修復工作,當bug修復完以後,把該分支合併到master和develop以後,就可以把該分支刪除。修復bug分支命名一般爲hotfix-*

release和hotfix分支離我們還比較遙遠。。

上面大體介紹了git多人合作的思路,下面是具體步驟

一、基本設置

1、github相關

註冊github,創建倉庫,配置SSH Key

<1>註冊github(不必多說)

<2>創建倉庫
可以創建public和private倉庫,當然private需要掏錢。
一般我們只需要創建public 倉庫,需要配置README和忽略文件,以及開源協議

<3>配置SSH Key,只有配置他之後,你的電腦才能和github相關聯。以下爲具體步驟:

(1)使用ssh-keygen命令生成key pair:
$ssh-keygen -t rsa -C "${YourEmail}" # "-t rsa"表示使用密鑰的加密類型,還可以爲dsa;-C設置註釋文字,比如你的郵箱“YourEmail”,不一定要是github註冊郵箱
Enter file in which to save the key (/Users/faner/.ssh/id_rsa): # 直接回車
Enter passphrase (empty for no passphrase): # 輸入密鑰文件授權密碼
Enter same passphrase again: # 確認密鑰文件授權密碼
Your identification has been saved in /Users/faner/.ssh/id_rsa.
Your public key has been saved in /Users/faner/.ssh/id_rsa.pub.

(2)此時,敲入ls命令可以看到ssh-keygen在~/.ssh目錄下生成的public/private key pair,其中id_rsa爲密鑰對中的私鑰,需妥善保管;id_rsa.pub爲密鑰對中的公鑰,可任意公開。
RSA是一種支持變長密鑰的公共密鑰算法,需要加密的文件塊的長度也是可變的。DSA(Digital Signature Algorithm,數字簽名算法)是一種標準的DSS(數字簽名標準)。
id_rsa私鑰類似keychain進行CSR時生成的private key;id_rsa.pub公鑰則類似CSR申請下來的開發證書(在Apple Member Center中有在線備案)。
通過cat命令可以查看id_rsa.pub內容。
*git checkout develop
只有這樣你的xcode和終端的命令才保持一致
(3)github上,進入setting,打開SSH key進行設置就OK了

2、Xcode相關

(1)clone遠程源倉庫

終端進入存放代碼的目錄,使用以下命令clone。注意此時你clone下來的是github上整個文件夾

git clone "remote address"

(2)創建新項目,放到clone下來的文件夾下

進入本地倉庫目錄

cd 項目同級目錄

切換到develop分支,此時已經從遠程拉取develop分支

git checkout develop

將本地新項目提交到本地develop分支

git add .
git commit -m "初始化項目"

此時本地develop分支已經有你新建的項目,上傳到遠程develop分支。

這裏可以使用Xcode自帶的push功能,push到遠程develop分支

至此,項目已經初始化完成。。
至於實際開發中如何正確操作,可以參考實例演練

3、實例演練

舉一個例子,假設我是一名網站的開發者,已經把源倉庫fork了,並且clone到了本地。現在要開發網站的“討論”功能。我在本地倉庫中可以這樣做:

step 1: 切換到develop分支

>>> git checkout develop

step 2: 分出一個功能性分支

>>> git checkout -b feature-discuss

step 3: 在功能性分支上進行開發工作,多次commit,測試以後...

step 4: 把做好的功能合併到develop中

>>> git checkout develop

# 回到develop分支

>>> git merge --no-ff feature-discuss
# 把做好的功能合併到develop中

>>> git branch -d feature-discuss
# 刪除功能性分支

>>> git push origin develop
# 把develop提交到自己的遠程倉庫中

這樣,就完成一次功能的開發和提交。
這是用終端操作,使用xcode自帶功能會更方便。

4、合併遠程master和develop分支

前提條件是本地代碼已經全部提交到遠程develop分支;
首先在本地的develop分支pull遠程develop代碼;
切換到master分支,從遠程pull代碼,將develop分支合併到本地master分支(此時本地master分支是與遠程同步的),有衝突解決,沒有則罷。
最後push到遠程master倉庫。



文/王小賓(簡書作者)
原文鏈接:http://www.jianshu.com/p/819354c035a4

發佈了35 篇原創文章 · 獲贊 25 · 訪問量 47萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章