1. 為什么要多人協作
一個項目可能有多個人同時開發,每個人負責自己的模塊。比如開發一個問答系統,A開發分詞和NER模塊,B開發ElasticSearch數據庫模塊,C開發數據清洗模塊,D開發精排模塊,E開發問答模塊。這種情況下,若大家都在master分支上開發,那么隨時都會有人修改master分支、造成master分支混亂。此時正確的做法,就是讓A~E每個人從master分支新建一個自己的開發分支,例如A_devel,然后自行開發,在開發時將自己的改動更新到自己的A_devel分支,在確保代碼無誤的情況下,再將自己的A_devel合並到master分支上去,完成git的多人協作。
2. 說說以上一套流程的具體操作
首先,對於A~E五個小小伙伴而言,此時應該有一個共同的初始代碼,這份代碼目前只有master分支。第一件事,就是拉取master分支到本地,然后在本地新建自己的個人分支(A_devel),再將個人分支推送到遠程倉庫。
1.首先,拉取代碼到本地(默認的就是master'分支)
git clone http:/xxx.xxx.xxx.xxx:xxxx/contract.git
2.其次,在本地新建一個新個人分支A_devel,並且保證遠程倉庫也有這個分支:
git checkout -b A_devel
git push origin A_devel:A_devel
# A_devel是新建的本地分支名,origin/A_devel是同名的遠程分支名。當然你也可以將二者設置為不同名字,但這樣未免太精神分裂了😁
現在用命令“git branch -a”查看一下,發現自己已經處於本地分支A_devel下,且遠程也存在這個分支,此時就可以在這個分支上進行自己的開發了。
3.經過一系列開發后,你在本地分支A_devel有了一些改動,此時你可以將這些改動push到你自己的遠程分支A_devel
git push origin A_devel
如果你已經確定你的改動無誤並且打算合並到主項目中(即master分支),你此時就可以進行以下操作:
4.首先,在本地切換到master分支
git checkout master
5.其次,確保在多人協作下不會錯過別人推送到master分支上的改動,要先pull一下master分支
git pull origin master
6.然后,將你自己的分支A_devel與master分支合並
git merge A_devel
此時,你可通過git status查看得知你當前合並到master分支的A_devel分支有多少次commit要被推送到master上。大概就是下面這個樣子:
$ git status
On branch master
Your branch is ahead of 'origin/master' by 2 commits.
(use "git push" to publish your local commits)
nothing to commit, working tree clean
7.下一步就是將這些commit推送到master分支
git push origin master
從而完成A_devel個人開發分支和master分支的合並
***注意:當然對於大多數情況而言,master分支都是受保護的分支,如果你直接去向master分支進行push,是不會成功的。所以若以gitlab為例,你在操作第7步之前,還需要在gitlab上提交merge request:
****1. 切換到gitlab項目主頁,按下圖所示,在頁面左邊欄找到“Branches”

圖1
****2.來到Branches頁面后,你可以清楚地看到,你自己和一同開發本項目的人員當前分支的情況。以第三行為例,假設該分支就是A_devel分支,那么后面的“5|32”的含義,是該分支落后於master分支5個commit(可能來自於第二行所示的分支之前合並到master的內容)、領先於master分支32個commit(這個就是A_devel分支自己開發完后還未push到master上的內容,這個commit數應該和第6步操作后git status所展示的commit數一致)。
了解這些之后,我們就可以直接點擊Merge request,去向項目主管申請push到master的權利、也是提醒他對你提交的代碼進行審查。

圖2
****3.下一步,就是填寫一些此次merge request的具體信息了。如下圖所示,從上到下按順序填寫即可。提交后就需要等待“Assignee”去審查並通過你的merge request。一旦通過后,你就可以完成“git push origin master”的操作了。

圖3
8.此時,雖然你將你個人的開發分支A_devel merge到master上了,但你可能還想繼續在A_devel上開發,而此時項目的其他開發人員的分支,如B_devel可能有些更新也同樣merge到了master(即如圖2所示,A_devel落后當前master5個commit),那么你如何確保你自己的A_devel分支和此時master分支完全一致呢?
首先,是要切換到master分支下,然后拉取master分支的最新代碼。這兩步我們上文已經提到了,就是步驟4、5;
切換回自己的A_devel分支,並將A_devel分支和剛剛拉取過的master合並。操作為:
$ git checkout A_devel
$ git merge master
Updating e5b4ad0..17a6e81
Fast-forward
假如這次合並沒有沖突,那么會顯示下面的“Fast-forward”內容,證明你已經成功將自己的A_devel和master的最新改動合並。
