團隊中的 Git 實踐

LatanyaWatr 9年前發布 | 42K 次閱讀 Git 版本控制系統

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

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

習慣養成

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

提交

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

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

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

首先,把失誤修正之后提交,可以用與上次提交同樣的信息。

團隊中的 Git 實踐

修改前的提交記錄

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

團隊中的 Git 實踐

修改提交節點

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

團隊中的 Git 實踐

修改后的提交記錄

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

推送

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

拉取

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

合并

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

分支管理

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

團隊中的 Git 實踐

混亂的分支

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

分支模型

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

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

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

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

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

團隊中的 Git 實踐

Git Flow 模型

更多信息可參考 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」。

團隊中的 Git 實踐

「Preferences」界面的「Git」標簽

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

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

團隊中的 Git 實踐

初始化 git-flow 工具

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

GitLab

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

團隊中的 Git 實踐

設置保護分支

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

開發流程

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

團隊中的 Git 實踐

基于 Git Flow 的開發流程

開發功能

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

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

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

團隊中的 Git 實踐

創建合并請求

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

團隊中的 Git 實踐

選擇分支

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

團隊中的 Git 實踐

接受合并請求

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

測試功能

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

發布上線

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

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

修復問題

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

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

額外說明

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

分支命名

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

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

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

發布日期

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

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

來自:https://ourai.ws/posts/working-with-git-in-team/

 本文由用戶 LatanyaWatr 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!