本文轉(zhuǎn)載自:https://segmentfault.com/a/1190000004963641[1] 在 2005 年的某一天,Linux 之父 Linus Torvalds 發(fā)布了他的又一個里程碑作品——Git。它的出現(xiàn)改變了軟件開發(fā)流程,大大地提高了開發(fā)流暢度!直到現(xiàn)在仍十分流行,完全沒有衰退的跡象。 本文不是一篇 Git 入門教程,這樣的文章一搜一大把,我是要從具體實踐角度,尤其是在團隊協(xié)作中,闡述如何去好好地應(yīng)用 Git。既然是講在團隊中的應(yīng)用實踐,我就盡可能地結(jié)合實際場景來講述。 習(xí)慣養(yǎng)成如果一個團隊在使用 Git 時沒有一些規(guī)范,那么將是一場難以醒來的噩夢!然而,規(guī)范固然重要,但更重要的是個人素質(zhì),在使用 Git 時需要自己養(yǎng)成良好的習(xí)慣。 提交如何去寫一個提交信息,《Git: 教你如何在Commit時有話可說》[2]中做了很好的說明。在具體開發(fā)工作中主要需要遵守的原則就是「使每次提交都有質(zhì)量」,只要堅持做到以下幾點就 OK 了: ·提交時的粒度是一個小功能點或者一個 bug fix,這樣進行恢復(fù)等的操作時能夠?qū)ⅰ刚`傷」減到最低;·用一句簡練的話寫在第一行,然后空一行稍微詳細闡述該提交所增加或修改的地方;·不要每提交一次就推送一次,多積攢幾個提交后一次性推送,這樣可以避免在進行一次提交后發(fā)現(xiàn)代碼中還有小錯誤。 假如已經(jīng)把代碼提交了,對這次提交的內(nèi)容進行檢查時發(fā)現(xiàn)里面有個變量單詞拼錯了或者其他失誤,只要還沒有推送到遠程,就有一個不被他人發(fā)覺你的疏忽的補救方法—— 首先,把失誤修正之后提交,可以用與上次提交同樣的信息。 然后,終端中執(zhí)行命令 最后,這樣就將兩次提交的節(jié)點合并成一個,甚至能夠修改提交信息! 誰說歷史不可篡改了?前提是,想要合并的那幾次提交還沒有推送到遠程! 推送當自己一個人進行開發(fā)時,在功能完成之前不要急著創(chuàng)建遠程分支。 拉取請讀張文鈿所寫的《使用 git rebase 避免無謂的 merge》:https:///blog/archives/3843。[3] 合并在將其他分支的代碼合并到當前分支時,如果那個分支是當前分支的父分支,為了保持圖表的可讀性和可追蹤性,可以考慮用 分支管理Git 的一大特點就是可以創(chuàng)建很多分支并行開發(fā)。正因為它的靈活性,團隊中如果沒有一個成熟的分支模型的話,那將會是一團糟。 要是誰真把這么亂的提交圖表擺在我面前,就給他一個上勾拳! 分支模型有個很成熟的叫 Git Flow 的分支模型,它能夠應(yīng)對 99% 的場景,剩下的那 1% 留給幾乎不存在的極度變態(tài)的場景。 需要注意的是,它只是一個模型,而不是一個工具;你可以用工具去應(yīng)用這個模型,也可以用最樸實的命令行。所以,重要的是理解概念,不要執(zhí)著于實行的手段。 簡單說來,Git Flow 就是給原本普普通通的分支賦予了不同的「職責(zé)」: ·master——最為穩(wěn)定功能最為完整的隨時可發(fā)布的代碼;·hotfix——修復(fù)線上代碼的 bug;·develop——永遠是功能最新最全的分支;·feature——某個功能點正在開發(fā)階段;·release——發(fā)布定期要上線的功能。 看到上面的「master」和「develop」加粗了吧?代表它們是「主要分支」,其他的分支是基于它們派生出來的。主要分支每種類型只能有一個,派生分支每個類型可以同時存在多個。各類型分支之間的關(guān)系用一張圖來體現(xiàn)就是: 更多信息可參考 xirong[4] 所整理的《Git工作流指南》:https://github.com/xirong/my-git/blob/master/git-workflow-tutorial.md。[5] 工具選擇一直不喜歡「**最好用」這種命題,主觀性太強,不會有一個結(jié)論。對于工具的選擇,我一直都是秉承「哪個能更好地解決問題就用哪個」這個原則。所以,只要不影響到團隊,用什么工具都是可以接受的。但根據(jù)多數(shù)開發(fā)人員的素質(zhì)情況來看,建議使用圖形化工具,例如 SourceTree(https://www./[6])。如果想用命令行,可以??!先在心里問下自己:「我 Git 牛逼不?會不會惹麻煩給別人?」 在團隊中應(yīng)用 Git Flow 時,推薦使用 SourceTree 與 GitLab (https:///[7])配合的形式: ·用 SourceTree 創(chuàng)建 feature 等分支以及本地的分支合并、刪除;·用 GitLab 做代碼審核和遠程的分支合并、刪除。 SourceTree 和 GitLab 應(yīng)該是相輔相成的存在,而不是互相取代。 事前準備為了將一些規(guī)范性的東西和 Git Flow 的部分操作自動化處理,要對 SourceTree 和 GitLab 進行一下配置。 SourceTree按下 這樣設(shè)置之后,在點「Pull」按鈕拉取代碼時會自動執(zhí)行 接下來,點擊工具欄中的「Git Flow」按鈕將相關(guān)的流程自動化。如果沒有特殊需求,直接按下對話框中的「OK」就好了。初始化完成后會自動切換到 develop 分支。 這下再點「Git Flow」按鈕所彈出的對話框就是選擇創(chuàng)建分支類型的了。 GitLab在創(chuàng)建項目倉庫后一定要把主要分支,也就是 master 和 develop 給保護起來。為它們設(shè)置權(quán)限,只有項目負責(zé)人可以進行推送和刪除等操作。 被保護的分支在列表中會有特殊的標記進行區(qū)分。 開發(fā)流程在引入 Git Flow 之后,所有工作都要圍繞著它來展開,將原本的流程與之結(jié)合形成「基于 Git Flow 的開發(fā)流程」。 開發(fā)功能在確定發(fā)布日期之后,將需要完成的內(nèi)容細分一下分配出去,負責(zé)某個功能的開發(fā)人員利用 SourceTree 所提供的 Git Flow 工具創(chuàng)建一個對應(yīng)的 feature 分支。如果是多人配合的話,創(chuàng)建分支并做一些初始化工作之后就推送創(chuàng)建遠程分支;否則,直到功能開發(fā)完畢要合并進 develop 前,不要創(chuàng)建遠程分支。 功能開發(fā)完并自測之后,先切換到 develop 分支將最新的代碼拉取下來,再切換回自己負責(zé)的 feature 分支把 develop 分支的代碼合并進來。合并方式參照上文中的「合并」,如果有沖突則自己和配合的人一起解決。 然后,到 GitLab 上的項目首頁創(chuàng)建合并請求(merge request)。 「來源分支」選擇要被合并的 feature 分支且「目標分支」選擇 develop 分支后點擊「比較分支」按鈕,在出現(xiàn)的表單中將處理人指派為項目負責(zé)人。 項目負責(zé)人在收到合并請求時,應(yīng)該先做下代碼審核看看有沒有明顯的嚴重的錯誤;有問題就找負責(zé)開發(fā)的人去修改,沒有就接受請求并刪除對應(yīng)的 feature 分支。 在將某次發(fā)布的所需功能全部開發(fā)完成時,就可以交付測試了。 測試功能負責(zé)測試的人創(chuàng)建一個 release 分支部署到測試環(huán)境進行測試;若發(fā)現(xiàn)了 bug,相應(yīng)的開發(fā)人員就在 release 分支上或者基于 release 分支創(chuàng)建一個分支進行修復(fù)。 發(fā)布上線當確保某次發(fā)布的功能可以發(fā)布時,負責(zé)發(fā)布的人將 release 分支合并進 master 和 develop 并打上 tag,然后打包發(fā)布到線上環(huán)境。 建議打 tag 時在信息中詳細描述這次發(fā)布的內(nèi)容,如:添加了哪些功能,修復(fù)了什么問題。 修復(fù)問題當發(fā)現(xiàn)線上環(huán)境的代碼有小問題或者做些文案修改時,相關(guān)開發(fā)人員就在本地創(chuàng)建 hotfix 分支進行修改,具體操作參考「開發(fā)功能」。 如果是相當嚴重的問題,可能就得回滾到上一個 tag 的版本了。 額外說明這里所提到的事情,雖非必需,但知道之后卻會如虎添翼。 分支命名除了主要分支的名字是固定的之外,派生分支是需要自己命名的,這里就要有個命名規(guī)范了。強烈推薦用如下形式: ·feature——按照功能點(而不是需求)命名;·release——用發(fā)布時間命名,可以加上適當?shù)那熬Y;·hotfix——GitLab 的 issue 編號或 bug 性質(zhì)等。 另外還有 tag,用語義化的版本號(http:///lang/zh-CN/)命名。[8] 發(fā)布日期發(fā)布頻率是影響開發(fā)人員與測試人員的新陳代謝和心情的重要因素之一,頻繁無規(guī)律的發(fā)布會導(dǎo)致內(nèi)分泌失調(diào)、情緒暴躁,致使爆粗口、砸電腦等狀況出現(xiàn)。所以,確保一個固定的發(fā)布周期至關(guān)重要! 在有一波或幾波需求來臨之時,想擋掉是不太可能的,但可以在評審時將它(們)分期,在某個發(fā)布日之前只做一部分。這是必須要控制住的!不然任由著需求方說「這個今天一定要上」「那個明天急著用」的話,技術(shù)人員就等著進醫(yī)院吧! |
|