用了一段時間github,一直想用時間來對git的使用來作一段筆記,前段時間比較忙,如今沉下心來學習也是極好的。git
不少項目開發會採用git這一優秀的分佈式版本管理工具來進行項目版本管理。由於git的使用很是靈活,因此在實際操做中會有許多不一樣的工做流程。不一樣團隊對於不一樣項目會有不一樣的協做方式。掌握git版本管理開發,對之後的學習和開發都有不少好處。github
首先基本名詞要懂:分佈式
倉庫(Repository)、分支(branch)、工做流(workflow)工具
1. 倉庫(Repository)學習
在項目的開始到結束,咱們會有兩種倉庫。一種是源倉庫(origin),一種是開發者倉庫。測試
源倉庫(origin)的有兩個做用:網站
彙總參與該項目的各個開發者的代碼編碼
存放趨於穩定和可發佈的代碼項目管理
源倉庫應該是受保護的,開發者不該該直接對其進行開發工做。只有項目管理者(一般是項目發起人)能對其進行較高權限的操做。開發
開發者倉庫:
任何開發者都不會對源倉庫進行直接的操做,源倉庫創建之後,每一個開發者須要作的事情就是把源倉庫的「複製」一份,做爲本身平常開發的倉庫。這個複製,也就是github上面的fork。
每一個開發者所fork的倉庫是徹底獨立的,互不干擾,甚至與源倉庫都無關。 每一個開發者倉庫至關於一個源倉庫實體的影像, 開發者在這個影像中進行編碼, 提交到本身的倉庫中,這樣就能夠輕易地實現團隊成員之間的並行開發工做。 而開發工做完成之後, 開發者能夠向源倉庫發送pull request,請求管理員把本身的代碼合併到源倉庫中,這樣就實現了分佈式開發工做,和最後的集中式的管理。
2. 分支(branch)
在git中,分支操做則是每一個開發人員平常工做流。利用git的分支,能夠很是方便地進行開發和測試。
咱們爲git定下一種分支模型,在這種模型中,分支有兩類,五種:
永久性分支
master branch:主分支
develop branch:開發分支
臨時性分支
feature branch:功能分支
release branch:預發佈分支
hotfix branch:bug修復分支
master:主分支從項目一開始便存在,它用於存放通過測試,已經徹底穩定代碼;在項目開發之後的任什麼時候刻當中,master存放的代碼應該是可做爲產品供用戶使用的代碼。每一次master更新的時候都應該用git打上tag,說明你的產品有新版本發佈了。
develop:開發分支,一開始從master分支中分離出來,用於開發者存放基本穩定代碼。開發者把功能作好之後,是存放到本身的develop中,當測試完之後,能夠向管理者發起一個pull request,請求把本身倉庫的develop分支合併到源倉庫的develop中。
概括:全部開發者開發好的功能會在源倉庫的develop分支中進行彙總,當develop中的代碼通過不斷的測試,已經逐漸趨於穩定了,接近產品目標了。這時候,咱們就能夠把develop分支合併到master分支中,發佈一個新版本。
feature:功能性分支,是用於開發項目的功能的分支,是開發者主要戰鬥陣地。開發者在本地倉庫從develop分支分出功能分支,在該分支上進行功能的開發,開發完成之後再合併到develop分支上,這時候功能性分支已經完成任務,能夠刪除。功能性分支的命名通常爲feature-*,*爲須要開發的功能的名稱。
release:預發佈分支,當產品即將發佈的時候,要進行最後的調整和測試,這時候就能夠分出一個預發佈分支,進行最後的bug fix。測試徹底之後,發佈新版本,就能夠把預發佈分支刪除。預發佈分支通常命名爲release-*。
hotfix:修復bug分支,當產品已經發布了,忽然出現了重大的bug。這時候就要新建一個hotfix分支,繼續緊急的bug修復工做,當bug修復完之後,把該分支合併到master和develop之後,就能夠把該分支刪除。修復bug分支命名通常爲hotfix-*。
示範:舉一個例子,A正在作一個團隊項目,已經把源倉庫fork了,而且clone到了本地。如今要開發網站的某個功能。A在本地倉庫中能夠這樣作:
切換到develop分支 :>>> git checkout develop
分出一個功能性分支: >>> git checkout -b feature-discuss
在功能性分支上進行開發工做,屢次commit,測試之後...
把作好的功能合併到develop中:
>>> git checkout develop # 回到develop分支
>>> git merge--no-ff feature-discuss# 把作好的功能合併到develop中
>>> git branch -d feature-discuss # 刪除功能性分支
>>> git push origin develop # 把develop提交到本身的遠程倉庫中
3. 工做流(workflow)
1) 源倉庫的構建,建立一個項目,初始化了兩個永久性分支master和develop.
2) 開發者fork源倉庫
3) 把本身開發者倉庫clone到本地,命令:git clone
4) 構建功能分支進行開發,完成後合併到本身的develop分支。
進入倉庫中,按照前面說所的構建功能分支的步驟,構建功能分支進行開發、合併,假設我如今要開發一個「討論」功能:
>>> git checkout develop # 切換到`develop`分支
>>> git checkout -b feature-discuss # 分出一個功能性分支
>> touch discuss.js # 僞裝discuss.js就是咱們要開發的功能
>> git add .
>> git commit -m 'finish discuss feature'# 提交更改
>>> git checkout develop # 回到develop分支
>>> git merge--no-ff feature-discuss# 把作好的功能合併到develop中
>>> git branch -d feature-discuss # 刪除功能性分支
>>> git push origin develop # 把develop提交到本身的遠程倉庫中
5) 向管理員提交pull request。通過測試之後,以爲沒問題,就能夠請求管理員把本身倉庫的develop分支合併到源倉庫的develop分支中,這就是傳說中的pull request。
6) 管理員測試、合併
1) 對代碼進行review,github提供很是強大的代碼review功能
2) 在本地測試新建一個測試分支,測試pull request的代碼
>> git checkout develop # 進入本地的develop分支
>> git checkout -b livoras-develop
# 從develop分支中分出一個叫livoras-develop的測試分支測試pull request代碼
>> git pull https://github.com/livoras/git-demo.git develop
# 把pull request的代碼pull到測試分支中,進行測試
3) 判斷是否贊成合併到源倉庫的develop中,若是通過測試沒問題,能夠把個人代碼合併到源倉庫的develop中:
>> git checkout develop
>> git merge--no-ff livoras-develop
>> git push origin develop