團隊中的 Git 實踐

NO IMAGE
1 Star2 Stars3 Stars4 Stars5 Stars 給文章打分!
Loading...

本文首發於歐雷流。由於我會時不時對文章進行補充、修正和潤色,為了保證所看到的是最新版本,請閱讀原文

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

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

習慣養成

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

提交

如何去寫一個提交資訊,《Git: 教你如何在Commit時有話可說》中做了很好的說明。在具體開發工作中主要需要遵守的原則就是「使每次提交都有質量」,只要堅持做到以下幾點就 OK 了:

  1. 提交時的粒度是一個小功能點或者一個 bug fix,這樣進行恢復等的操作時能夠將「誤傷」減到最低;

  2. 用一句簡練的話寫在第一行,然後空一行稍微詳細闡述該提交所增加或修改的地方;

  3. 不要每提交一次就推送一次,多積攢幾個提交後一次性推送,這樣可以避免在進行一次提交後發現程式碼中還有小錯誤。

假如已經把程式碼提交了,對這次提交的內容進行檢查時發現裡面有個變數單詞拼錯了或者其他失誤,只要還沒有推送到遠端,就有一個不被他人發覺你的疏忽的補救方法——

首先,把失誤修正之後提交,可以用與上次提交同樣的資訊。

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

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

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

推送

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

拉取

請讀張文鈿所寫的《使用 git rebase 避免無謂的 merge》。

合併

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

分支管理

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

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

分支模型

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

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

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

  • master——最為穩定功能最為完整的隨時可釋出的程式碼;

  • hotfix——修復線上程式碼的 bug;

  • develop——永遠是功能最新最全的分支;

  • feature——某個功能點正在開發階段;

  • release——釋出定期要上線的功能。

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

更多資訊可參考 xirong 所整理的《Git工作流指南》。

工具選擇

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

在團隊中應用 Git Flow 時,推薦使用 SourceTree 與 GitLab 配合的形式:

  1. 用 SourceTree 建立 feature 等分支以及本地的分支合併、刪除;

  2. 用 GitLab 做程式碼稽核和遠端的分支合併、刪除。

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

事前準備

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

SourceTree

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

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

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

這下再點「Git Flow」按鈕所彈出的對話方塊就是選擇建立分支型別的了。

GitLab

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

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

開發流程

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

開發功能

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

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

然後,到 GitLab 上的專案首頁建立合併請求(merge request)。

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

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

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

測試功能

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

釋出上線

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

建議打 tag 時在資訊中詳細描述這次釋出的內容,如:新增了哪些功能,修復了什麼問題。

修復問題

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

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

額外說明

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

分支命名

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

  • feature——按照功能點(而不是需求)命名;

  • release——用釋出時間命名,可以加上適當的字首;

  • hotfix——GitLab 的 issue 編號或 bug 性質等。

另外還有 tag,用語義化的版本號命名。

釋出日期

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

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

相關文章

軟體開發工具 最新文章