gitlab多人協同工作
本文為亨利向《Git權威指南》的作者蔣鑫老師的答疑郵件寫成。
這里特別感謝蔣鑫老師對我詢問gitlab的協同工作流程問題的詳細解答。
蔣鑫老師的細致專業的解答讓我非常感動。
gitlab----新穎的git服務器托管網站,開源免費。你可以在自己的公司或者開發團隊搭建好一個。
gitlab的工作流程是
gitlab help中建議的工作流程是這樣。如下圖。
(1).開發成員拷貝管理員建立好的項目到自己本地。
(2).創建自己的分支。
(3).在自己的分支上寫代碼,並提交。
(4).推送到遠程服務器,分支是自己的分支。
(分支的命名規則使用小駝峰式命名法。比如我是員工孫悟空,我就推送到孫悟空分支。分支的命名規則為開發人員姓名+所開發的功能。命名中不要使用特殊字符,不要使用點。
例如孫悟空開發的分支,命名為swkFeature1)
(5).在Commit頁面上瀏覽分支。
(6).創建一個合並請求。
(7).團隊的管理員或者領導者審查並且決定是否合並員工提交的分支到主分支上。
管理員在建好的項目中加入開發人員。
開發人員有相應的權限級別,分為Guest,Reporter,Developer,Master,等這幾個角色,這幾個角色的權限從低到高排列。
Developer能夠推送和刪除沒有保護的分支,Master可以對沒有保護和有保護的分支進行操作。如圖1所示。
Git 的開發者都喜歡以這種方式來開展工作,在master 分支中保留完全穩定的代碼,即已經發布或即將發布的代碼。
與此同時,他們還有一個名為develop 專門用於后續的開發,或僅用於穩定性測試。當然並不是說一定要絕對穩定,不過一旦進入某種穩定狀態,
便可以把它合並到master 里。還有在工作中,把開發任務分解為各個功能或者模塊,
用topic(topic branch主題分支,有又成為feature branch特性分支),實現之后並測試穩定之后,可以合並到其他分支。
Git 的開發者都喜歡以這種方式來開展工作,在master 分支中保留完全穩定的代碼,即已經發布或即將發布的代碼。
與此同時,他們還有一個名為develop分支 專門用於后續的開發,或僅用於穩定性測試。當然並不是說一定要絕對穩定,
不過一旦進入某種穩定狀態,便可以把它合並到master 里。
還有在工作中,把開發任務分解為各個功能或者模塊,用topic分支(topic branch主題分支,有又稱為feature branch特性分支),
比如實現功能1,在develop分支的基礎上產生分支feature1,實現功能2,有分支feature2。
feature1和feature2實現了要求的功能之后,合並到develop分支上去。develop分支測試穩定之后,可以合並到master分支上去。 
情景(以下的模擬場景沒有把develop分支考慮進去,直接在master分支上分解功能分支。)
1.管理員唐僧建好了一個項目,把孫悟空加入,並授予Developer角色權限,唐僧本身就是比孫悟空高一級的Master角色。唐僧在自己的電腦上設定好了master分支為受保護分支。 
2.員工孫悟空在自己電腦上工作,並推送已經寫好的代碼到遠程服務器的孫悟空分支上,即swkFeature1上 
孫悟空做了如下操作
git clone git@mygitlabold.sytes.net:root/testc01.git //從管理員唐僧那里克隆項目
cd testc01 //進入項目工作
git checkout -b swkFeature1 //創建自己的分支,並切換到此分支上,分支的命名規則為開發人員名字+所開發的功能名字。本例中命名為swkfeature1
vim aa.html //寫了一個名為aa的html文件
git add aa.html //加入跟蹤
ggit commit -am "swkFeature1 is ready" //提交
git push origin swkFeature1 //推送到遠程服務器孫悟空分支上,git提示推送成功
git push origin swkFeature1:master //孫悟空想嘗試直接推送到受保護的分支上,孫悟空是沒有這個權限的,git會提示為推送失敗
圖為孫悟空鍵入的命令
孫悟空在Commit頁面上瀏覽分支swkFeature1,然后向項目領導唐僧創建一個合並請求。 
3.這個合並請求除了唐僧可以登錄gitlab上看到之外,還可以通過郵件方式看到。唐僧即使沒有登錄gitlab,只要他的郵箱支持手機郵箱等方式,
手機郵箱可以通過短信的方式通知唐僧,唐僧可以實時看到合並要求。
管理員唐僧對要求合並的分支代碼進行審核。
管理員唐僧從服務器上獲取孫悟空提交的分支。
git fetch
然后孫悟空推送的遠程新分支被管理員唐僧拉拽到本地,但是不是以本地分支存在,
而是保存在 .git/refs/heads 之外(.git/refs/remotes/origin/之中)的遠程分支。
管理員唐僧可以如下方法對孫悟空的分支進行審核。
執行
git log master..origin/swkFeature1 //可以看到孫悟空推送了幾個提交。
管理員唐僧可以合並孫悟空的分支:
git merge origin/swkFeature1
管理員唐僧可以逐一對孫悟空的提交審核。如果發現有問題,管理員唐僧可以本地回滾。
git reset --hard HEAD^ # 或 master@{1}
幾個反復后,當孫悟空的分支審核無誤,管理員唐僧將合並后的本地 master 分支推送到遠程服務器:
git push # 缺省 remote 為 origin
圖 唐僧在自己的電腦上工作,審核孫悟空提交的分支代碼,決定是否合並。 
圖 唐僧鍵入的命令
這個時候,唐僧打開gitlab相應的項目,查看master分支的內容。發現服務器上面有了孫悟空提交的源代碼了。 
唐僧可以在那個請求頁面下關閉合並請求。gitlab合並請求有自動的功能,但是還是需要管理員唐僧獲取下來,合並,測試是否有問題。不建議使用gitlab的自動合並功能。 
合並請求就被關閉了。 
4.孫悟空那邊。
孫悟空看到請求已經接受。
執行 git fetch 會獲取到更新的 master 分支。然后
git checkout master
git merge --ff origin/master
swkFeature1分支完成使命,刪掉吧: git branch -d swkFeature1
圖孫悟空后來鍵入的命令,圖中因為沒有切換到master分支上,所以又重新執行了一遍上述命令。 

