Git工作流的最佳實(shí)踐總結(jié)

Git作為一個(gè)目前非常流行的版本管理工具,深受開(kāi)發(fā)者的喜愛(ài)。那么怎樣才能將Git的作用發(fā)揮的更好呢?我根據(jù)實(shí)際的項(xiàng)目經(jīng)驗(yàn),歸納總結(jié)了以下Git工作流的最佳實(shí)踐。這里所謂的最佳,是經(jīng)過(guò)多次項(xiàng)目經(jīng)驗(yàn)后,根據(jù)自身的情況總結(jié)出來(lái)的我認(rèn)為最為合理的方案。如果您有不同的見(jiàn)解,歡迎留言討論,我們共同進(jìn)步:)

Git工作流的最佳實(shí)踐方案包括如下四個(gè)步驟:

1. 根據(jù)task創(chuàng)建對(duì)應(yīng)的branch


當(dāng)我們開(kāi)始針對(duì)一個(gè)task編碼之前,首先第一步應(yīng)該要?jiǎng)?chuàng)建一個(gè)新的branch,然后checkout到這個(gè)新的branch上開(kāi)始編碼。我們不應(yīng)該直接在master上進(jìn)行新的task的編碼工作,尤其是在團(tuán)隊(duì)成員較多的情況下。團(tuán)隊(duì)的每個(gè)成員都應(yīng)工作于自己新創(chuàng)建的branch上,而不會(huì)操作master分支,這樣做的好處在于master始終處于一種“干凈”的狀態(tài),不會(huì)因?yàn)槎嗳说耐瑫r(shí)操作而造成過(guò)多的沖突,同時(shí)也降低了master被誤操作的可能性。具體的操作如下:

//切換到master分支;
git checkout master
//拉取master遠(yuǎn)程分支的代碼;
git pull origin master
//創(chuàng)建新的分支并切換到新的分支上。
git checkout -b <my branch name>

2. 在新建的分支上編碼,push代碼到遠(yuǎn)程分支上


分支創(chuàng)建完畢之后,我們就可以開(kāi)始在branch上進(jìn)行編碼了。這是我們完成task的最主要的階段,絕大部分的工作在此階段完成,同時(shí)它應(yīng)該也是持續(xù)時(shí)間最長(zhǎng)的階段。它的主要任務(wù)就是完成task的編碼工作,并最終將代碼push到當(dāng)前分支對(duì)應(yīng)的遠(yuǎn)程分支上去。

首先看一下這個(gè)階段Git工作的命令流,示例如下:

//創(chuàng)建新的branch后的第一天工作結(jié)束時(shí),首先將改動(dòng)的代碼放入index區(qū);
git add .
//然后提交代碼到本地倉(cāng)庫(kù);
git commit? -m "The first commit message"

//第二天開(kāi)始工作前,切換到master分支;
git checkout master
//從master的遠(yuǎn)程分支拉取代碼;
git pull origin master
//切換到task所在的本地分支;
git checkout <my branch name>
//將master上的最新的代碼合并到當(dāng)前分支上,這里的-i的作用是將我們 當(dāng)前分支之前的commit壓縮成為一個(gè)commit,這樣做的好處在于當(dāng)我們之后創(chuàng)建pull request并進(jìn)行相應(yīng)的code review的時(shí)候,代碼的改動(dòng)會(huì)集中在一個(gè)commit,使得code review更直觀方便;
git rebase -i master?

//第二天工作結(jié)束之后,將第二天的改動(dòng)放入index區(qū);
git add .
//提交代碼到當(dāng)前branch的本地倉(cāng)庫(kù);
git commit? -m "The second commit message"

//第三天開(kāi)始工作前,
git checkout master //同上第二天
git pull origin master //同上第二天
git checkout //同上第二天
git rebase -i master? //同上第二天

//第三天工作結(jié)束之后,
git add . //同上第二天
git commit? -m "The third commit message" //同上第二天

..........

//最后,當(dāng)task的所有編碼完成之后,將代碼push到遠(yuǎn)程分支。
git push --set-upstream origin <my branch name>

通過(guò)以上的工作流可以看出,我們?cè)谕瓿蓆ask期間所有的代碼都始終存放在我們新創(chuàng)建的branch的本地倉(cāng)庫(kù)上。只有當(dāng)所有的編碼工作完成之后,才會(huì)將最終的代碼push到當(dāng)前分支的遠(yuǎn)程倉(cāng)庫(kù)。這樣做的好處在于,我們push到遠(yuǎn)程的代碼,也就是之后會(huì)通過(guò)pull request被code review的代碼,始終是針對(duì)一個(gè)單獨(dú)task的完整代碼,這將有利于之后code review的執(zhí)行。不過(guò)這樣做同時(shí)可能會(huì)存在一個(gè)缺點(diǎn),那就是最終一次push的代碼可能會(huì)非常龐大,這就要求我們對(duì)于task粒度的把握應(yīng)該更合適。我們不應(yīng)針對(duì)一個(gè)非常大的task創(chuàng)建branch,完成編碼,而是應(yīng)該盡可能的將task分解成一個(gè)個(gè)粒度較小的子task,進(jìn)而針對(duì)子task創(chuàng)建branch完成編碼的工作。這是一項(xiàng)非常有技巧的工作,需要豐富的實(shí)踐經(jīng)驗(yàn),它也不是本節(jié)要討論的內(nèi)容,不再贅述。

3. 創(chuàng)建pull request, 進(jìn)行code review


當(dāng)所有的代碼都已經(jīng)被push到遠(yuǎn)程分支后,這時(shí)我們還不可以將代碼合并到master上去,我們應(yīng)該要做的是創(chuàng)建pull request。pull request的作用在于它可以使得代碼在merge到master分支之前,能夠被團(tuán)隊(duì)成員code review,從而提高代碼的質(zhì)量以及降低出錯(cuò)的概率。實(shí)際項(xiàng)目中我們使用jira來(lái)幫助我們創(chuàng)建相應(yīng)的pull request,當(dāng)然Github本身就具備創(chuàng)建pull request的功能。創(chuàng)建pull request的操作非常簡(jiǎn)單,無(wú)非就是點(diǎn)擊創(chuàng)建pull request的按鈕,填寫comment信息,并輸入可以進(jìn)行code review的成員名稱。當(dāng)pull request創(chuàng)建完成之后,所有可以進(jìn)行code review的團(tuán)隊(duì)成員都會(huì)收到郵件通知,并通過(guò)相應(yīng)的pull request的鏈接查看代碼的改動(dòng),從而完成code review的工作。這個(gè)步驟沒(méi)有實(shí)際的Git指令的操作。

4. 合并代碼到master,并刪除之前創(chuàng)建的branch


當(dāng)所有的reviewer都結(jié)束了code review,且都已經(jīng)將pull request標(biāo)注為approved狀態(tài)的時(shí)候,我們就可以將branch合并到master上去,并最終push到遠(yuǎn)程master分支。示例如下:

git checkout master //切換到master分支;
git merge <my branch name>//合并之前創(chuàng)建的分支的代碼到master分支上;
git push origin master//將master的代碼push到master的遠(yuǎn)程分支;
git branch -d <my branch name>//刪除之前創(chuàng)建的分支。

經(jīng)過(guò)以上四個(gè)步驟之后,一個(gè)task的 Git的工作流就結(jié)束了。之后,我們可以愉快的開(kāi)始下一個(gè)task了~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 多種多樣的工作流使得在項(xiàng)目中實(shí)施Git時(shí)變得難以選擇。這份教程提供了一個(gè)出發(fā)點(diǎn),調(diào)查企業(yè)團(tuán)隊(duì)最常見(jiàn)的Git工作流。...
    JSErik閱讀 4,483評(píng)論 2 8
  • 投資P2P 6年有余,經(jīng)歷過(guò)多次倒閉潮。 身邊倒下的平臺(tái)和投資人不計(jì)其數(shù)。 5、6年前認(rèn)識(shí)的投友,現(xiàn)在還活躍的,幾...
    原溯原寶閱讀 352評(píng)論 0 0
  • 慢慢的,和你聯(lián)系的人也就那么幾個(gè),你知道留下來(lái)的都是真的。 慢慢的,你經(jīng)歷的事情越來(lái)越多,你知道大風(fēng)大浪在前面等著...
    穎穎趙閱讀 490評(píng)論 0 0
  • 剪了個(gè)頭發(fā),對(duì)生活真的是又愛(ài)又恨啊,一點(diǎn)也不覺(jué)得現(xiàn)在很溫柔,各類事情混在一起就很煩了,這么形形色色的人,還要咧著嘴...
    林深向晚閱讀 234評(píng)論 0 3
  • 我喜歡《離婚律師》,原因很簡(jiǎn)單:我喜歡《離婚律師》。 一般而言,我會(huì)在切入主題前寫一大堆看似與主題有關(guān)...
    ice_camel閱讀 1,697評(píng)論 0 2