09.23 團隊開發中 Git 最佳實踐,不給隊友拖後腿

作者:歐雷
來源:https://segmentfault.com/a/1190000004963641

在 2005 年的某一天,Linux 之父 Linus Torvalds 發佈了他的又一個里程碑作品——Git。它的出現改變了軟件開發流程,大大地提高了開發流暢度!直到現在仍十分流行,完全沒有衰退的跡象。

本文不是一篇Git入門教程,本文要從具體實踐角度,尤其是在團隊協作中,闡述如何去好好地應用 Git。既然是講在團隊中的應用實踐,我就儘可能地結合實際場景來講述。

1、習慣養成

如果一個團隊在使用 Git 時沒有一些規範,那麼將是一場難以醒來的噩夢!然而,規範固然重要,但更重要的是個人素質,在使用 Git 時需要自己養成良好的習慣。

(1) 提交

如何去寫一個提交信息,在具體開發工作中主要需要遵守的原則就是「使每次提交都有質量」,只要堅持做到以下幾點就 OK 了:

  • 提交時的粒度是一個小功能點或者一個 bug fix,這樣進行恢復等的操作時能夠將「誤傷」減到最低;
  • 用一句簡練的話寫在第一行,然後空一行稍微詳細闡述該提交所增加或修改的地方;
  • 不要每提交一次就推送一次,多積攢幾個提交後一次性推送,這樣可以避免在進行一次提交後發現代碼中還有小錯誤。

假如已經把代碼提交了,對這次提交的內容進行檢查時發現裡面有個變量單詞拼錯了或者其他失誤,只要還沒有推送到遠程,就有一個不被他人發覺你的疏忽的補救方法——首先,把失誤修正之後提交,可以用與上次提交同樣的信息。

團隊開發中 Git 最佳實踐,不給隊友拖後腿

然後,終端中執行命令 git rebase -i [SHA],其中 SHA 是上一次提交之前的那次提交的,在這裡是 3b22372。

團隊開發中 Git 最佳實踐,不給隊友拖後腿

最後,這樣就將兩次提交的節點合併成一個,甚至能夠修改提交信息!

團隊開發中 Git 最佳實踐,不給隊友拖後腿

誰說歷史不可篡改了?前提是,想要合併的那幾次提交還沒有推送到遠程!

(2) 推送

當自己一個人進行開發時,在功能完成之前不要急著創建遠程分支。

(3) 拉取

請讀張文鈿所寫的《使用 git rebase 避免無謂的 merge》:https://ihower.tw/blog/archives/3843。

(4) 合併

在將其他分支的代碼合併到當前分支時,如果那個分支是當前分支的父分支,為了保持圖表的可讀性和可追蹤性,可以考慮用 git rebase 來代替 git merge;反過來或者不是父子關係的兩個分支以及互相已經 git merge 過的分支,就不要採用 git rebase 了,避免出現重複的衝突和提交節點。

2、分支管理

Git的一大特點就是可以創建很多分支並行開發。正因為它的靈活性,團隊中如果沒有一個成熟的分支模型的話,那將會是一團糟。

團隊開發中 Git 最佳實踐,不給隊友拖後腿

要是誰真把這麼亂的提交圖表擺在我面前,就給他一個上勾拳!

(1) 分支模型

有個很成熟的叫 Git Flow 的分支模型,它能夠應對 99% 的場景,剩下的那 1% 留給幾乎不存在的極度變態的場景。

需要注意的是,它只是一個模型,而不是一個工具;你可以用工具去應用這個模型,也可以用最樸實的命令行。所以,重要的是理解概念,不要執著於實行的手段。

簡單說來,Git Flow 就是給原本普普通通的分支賦予了不同的「職責」:

  • master——最為穩定功能最為完整的隨時可發佈的代碼;
  • hotfix——修復線上代碼的 bug;
  • develop——永遠是功能最新最全的分支;
  • feature——某個功能點正在開發階段;
  • release——發佈定期要上線的功能。

看到上面的「master」和「develop」加粗了吧?代表它們是「主要分支」,其他的分支是基於它們派生出來的。主要分支每種類型只能有一個,派生分支每個類型可以同時存在多個。各類型分支之間的關係用一張圖來體現就是:

團隊開發中 Git 最佳實踐,不給隊友拖後腿

更多信息可參考 xirong 所整理的《Git工作流指南》:https://github.com/xirong/my-git/blob/master/git-workflow-tutorial.md

(2) 工具選擇

一直不喜歡「**最好用」這種命題,主觀性太強,不會有一個結論。對於工具的選擇,我一直都是秉承「哪個能更好地解決問題就用哪個」這個原則。所以,只要不影響到團隊,用什麼工具都是可以接受的。但根據多數開發人員的素質情況來看,建議使用圖形化工具,例如 SourceTree(https://www.sourcetreeapp.com)。如果想用命令行,可以啊!先在心裡問下自己:「我 Git 牛逼不?會不會惹麻煩給別人?」

在團隊中應用 Git Flow 時,推薦使用 SourceTree 與 GitLab (https://gitlab.com/)配合的形式:

  • 用 SourceTree 創建 feature 等分支以及本地的分支合併、刪除;
  • 用 GitLab 做代碼審核和遠程的分支合併、刪除。

SourceTree 和 GitLab 應該是相輔相成的存在,而不是互相取代。

3、事前準備

為了將一些規範性的東西和 Git Flow 的部分操作自動化處理,要對 SourceTree 和 GitLab 進行一下配置。

(1) SourceTree

按下 command + , 調出「Preferences」界面並切換到「Git」標籤,勾選「Use rebase instead of merge by default for tracked branches」和「Do not fast-forward when merging, always create commit」。

團隊開發中 Git 最佳實踐,不給隊友拖後腿

這樣設置之後,在點「Pull」按鈕拉取代碼時會自動執行 git pull --rebase;並且,每次合併時會自動創建新的包含分支信息的提交節點。

接下來,點擊工具欄中的「Git Flow」按鈕將相關的流程自動化。如果沒有特殊需求,直接按下對話框中的「OK」就好了。初始化完成後會自動切換到 develop 分支。

團隊開發中 Git 最佳實踐,不給隊友拖後腿

這下再點「Git Flow」按鈕所彈出的對話框就是選擇創建分支類型的了。

(2) GitLab

在創建項目倉庫後一定要把主要分支,也就是 master 和 develop 給保護起來。為它們設置權限,只有項目負責人可以進行推送和刪除等操作。

團隊開發中 Git 最佳實踐,不給隊友拖後腿

被保護的分支在列表中會有特殊的標記進行區分。

4、開發流程

在引入GitFlow 之後,所有工作都要圍繞著它來展開,將原本的流程與之結合形成「基於 GitFlow 的開發流程」。

團隊開發中 Git 最佳實踐,不給隊友拖後腿

(1) 開發功能

在確定發佈日期之後,將需要完成的內容細分一下分配出去,負責某個功能的開發人員利用 SourceTree 所提供的 Git Flow 工具創建一個對應的 feature 分支。如果是多人配合的話,創建分支並做一些初始化工作之後就推送創建遠程分支;否則,直到功能開發完畢要合併進 develop 前,不要創建遠程分支。

功能開發完並自測之後,先切換到 develop 分支將最新的代碼拉取下來,再切換回自己負責的 feature 分支把 develop 分支的代碼合併進來。合併方式參照上文中的「合併」,如果有衝突則自己和配合的人一起解決。

然後,到 GitLab 上的項目首頁創建合併請求(merge request)。

團隊開發中 Git 最佳實踐,不給隊友拖後腿

「來源分支」選擇要被合併的 feature 分支且「目標分支」選擇 develop 分支後點擊「比較分支」按鈕,在出現的表單中將處理人指派為項目負責人。

團隊開發中 Git 最佳實踐,不給隊友拖後腿

項目負責人在收到合併請求時,應該先做下代碼審核看看有沒有明顯的嚴重的錯誤;有問題就找負責開發的人去修改,沒有就接受請求並刪除對應的 feature 分支。

團隊開發中 Git 最佳實踐,不給隊友拖後腿

在將某次發佈的所需功能全部開發完成時,就可以交付測試了。

(2) 測試功能

負責測試的人創建一個 release 分支部署到測試環境進行測試;若發現了 bug,相應的開發人員就在 release 分支上或者基於 release 分支創建一個分支進行修復。

(3) 發佈上線

當確保某次發佈的功能可以發佈時,負責發佈的人將 release 分支合併進 master 和 develop 並打上 tag,然後打包發佈到線上環境。

建議打 tag 時在信息中詳細描述這次發佈的內容,如:添加了哪些功能,修復了什麼問題。

(4) 修復問題

當發現線上環境的代碼有小問題或者做些文案修改時,相關開發人員就在本地創建 hotfix 分支進行修改,具體操作參考「開發功能」。

如果是相當嚴重的問題,可能就得回滾到上一個 tag 的版本了。

5、額外說明

這裡所提到的事情,雖非必需,但知道之後卻會如虎添翼。

(1) 分支命名

除了主要分支的名字是固定的之外,派生分支是需要自己命名的,這裡就要有個命名規範了。強烈推薦用如下形式:

  • feature——按照功能點(而不是需求)命名;
  • release——用發佈時間命名,可以加上適當的前綴;
  • hotfix——GitLab 的 issue 編號或 bug 性質等。

另外還有 tag,用語義化的版本號(http://semver.org/lang/zh-CN/)命名。

(2) 發佈日期

發佈頻率是影響開發人員與測試人員的新陳代謝和心情的重要因素之一,頻繁無規律的發佈會導致內分泌失調、情緒暴躁,致使爆粗口、砸電腦等狀況出現。所以,確保一個固定的發佈週期至關重要!

在有一波或幾波需求來臨之時,想擋掉是不太可能的,但可以在評審時將它(們)分期,在某個發佈日之前只做一部分。這是必須要控制住的!不然任由著需求方說「這個今天一定要上」「那個明天急著用」的話,技術人員就等著進醫院吧!


分享到:


相關文章: