Git 提交竟然還能這么用?
大家好,我是魚(yú)皮。
Git 是主流的代碼版本控制系統(tǒng),是團(tuán)隊(duì)協(xié)作開(kāi)發(fā)中必不可少的工具。
之前已經(jīng)給大家分享過(guò) Git / GitHub 的學(xué)習(xí)指南,感興趣的同學(xué)可以先看視頻了解:https://www.bilibili.com/video/BV1KZ4y1e7cG。
這篇文章,主要是給大家分享 Git 的核心功能 提交(Commit)的作用,幫助大家更好地利用 Git 這一工具來(lái)提高自己的開(kāi)發(fā)工作效率。
什么是 Git 提交?
Git 提交是指將你的代碼保存到 Git 本地存儲(chǔ)庫(kù),就像用 Word 寫(xiě)長(zhǎng)篇論文時(shí)進(jìn)行保存文件一樣。每次 Git 提交時(shí)都會(huì)創(chuàng)建一個(gè)唯一的版本,除了記錄本次新增或發(fā)生修改的代碼外,還可以包含提交信息,來(lái)概括自己這次提交的改動(dòng)內(nèi)容。
如下圖,就是一次 Git 提交:
Git 提交的作用
Git 提交有很多作用,我將它分為 基礎(chǔ)用法 和 其他妙用 。
基本作用
歷史記錄
Git 提交最基本的作用就是維護(hù)項(xiàng)目的歷史記錄。每次提交都會(huì)記錄代碼庫(kù)的狀態(tài),包括文件的添加、修改和刪除;還包括一些提交信息,比如提交時(shí)間、描述等。這使得我們可以通過(guò)查看所有的歷史提交來(lái)追溯項(xiàng)目的開(kāi)發(fā)進(jìn)度和歷程,了解每個(gè)提交中都發(fā)生了什么變化。
比如查看我們編程導(dǎo)航文檔網(wǎng)站項(xiàng)目的提交記錄,能看到我是怎么一步一步構(gòu)建出這個(gè)文檔網(wǎng)站的:
開(kāi)源地址:https://github.com/liyupi/code-xingqiu
在企業(yè)開(kāi)發(fā)中,如果一個(gè)人寫(xiě)了 Bug,還死不承認(rèn),那么就可以搬出 Git 提交記錄,每一行代碼是誰(shuí)提交的都能很快地查出來(lái),謹(jǐn)防甩鍋!
版本控制
另一個(gè) Git 提交的基本作用是版本控制。每個(gè)提交都代表了代碼庫(kù)的一個(gè)版本,這意味著開(kāi)發(fā)者可以隨時(shí)切換代碼版本進(jìn)行開(kāi)發(fā),恢復(fù)舊版本的代碼、或者撤銷(xiāo)某次提交的代碼改動(dòng)。
推薦新手使用可視化工具而不是 Git 命令進(jìn)行版本的切換和撤銷(xiāo)提交,在不了解 Git 工作機(jī)制的情況下使用命令操作很容易出現(xiàn)問(wèn)題。
如下圖,在 JetBrains 系列開(kāi)發(fā)工具中,右鍵某個(gè)提交,就可以切換版本或撤銷(xiāo)提交了:
代碼對(duì)比
你可以輕松地查看兩個(gè)提交之間的所有代碼更改,便于快速了解哪些部分發(fā)生了變化。這對(duì)于解決代碼沖突、查找錯(cuò)誤或?qū)彶榇a非常有幫助。
在 JetBrains 系列開(kāi)發(fā)工具中,只需要選中 2 個(gè)提交,然后點(diǎn)右鍵,選擇 Compare Versions 就能實(shí)現(xiàn)代碼對(duì)比了:
改動(dòng)了哪些代碼一目了然:
一般情況下,如果我們因?yàn)槟炒未a改動(dòng)導(dǎo)致項(xiàng)目出現(xiàn)了新的 Bug。通過(guò)這種方式對(duì)比本次改動(dòng)的所有代碼,很快就能發(fā)現(xiàn) Bug 出現(xiàn)的原因了。
其他妙用
除了基本作用外,Git 提交還有一些妙用~
記錄信息
像上面提到的,Git 提交不僅能用于記錄代碼更改,我們還可以在提交信息中包含有關(guān)這次更改的重要信息。比如本次改動(dòng)代碼的介紹、代碼更改的原因、相關(guān)的任務(wù)(需求單)或功能等??梢院?jiǎn)單理解為給本次工作寫(xiě)總結(jié)和描述。
如果提交信息編寫(xiě)得非常清晰完善,那么項(xiàng)目的團(tuán)隊(duì)成員可以更容易地理解每個(gè)提交,甚至能做到 “提交即文檔”,提高協(xié)作和項(xiàng)目維護(hù)效率。
正因如此,很多團(tuán)隊(duì)會(huì)定制自己的提交信息規(guī)范,比如之前我在鵝廠的時(shí)候,每次提交都建議帶上需求單的地址,便于了解這次提交是為了完成什么需求。
這里給大家推薦一種很常用的提交信息規(guī)范 —— 約定式提交,每次提交信息都需要遵循以下的結(jié)構(gòu):
《約定式提交》文檔:https://www.conventionalcommits.org/zh-hans/v1.0.0/
<類(lèi)型>[可選 范圍]: <描述>
[可選 正文]
[可選 腳注]
當(dāng)然,這種方式有利有弊,可能有同學(xué)會(huì)覺(jué)得 “我注釋都懶得寫(xiě),你還讓我寫(xiě)提交信息?” 這取決于你們項(xiàng)目的規(guī)模和緊急程度等因素,反正團(tuán)隊(duì)內(nèi)部保持一致就好。
像我在用 Git 開(kāi)發(fā)個(gè)人項(xiàng)目時(shí),也不是每次都寫(xiě)很詳細(xì)的提交信息的。但是帶 編程導(dǎo)航 的同學(xué)從 0 開(kāi)發(fā)項(xiàng)目時(shí),每場(chǎng)直播寫(xiě)的代碼都會(huì)單獨(dú)作為一次提交,如下圖:
是不是很清晰呢?這樣做的好處是,大家想獲取某場(chǎng)直播對(duì)應(yīng)的中間代碼(而不是最終的成品代碼)時(shí),只需要點(diǎn)擊某次提交記錄就可以獲取到了,很方便。
如果你的提交信息寫(xiě)得非常標(biāo)準(zhǔn)、統(tǒng)一結(jié)構(gòu),那么甚至還可以用程序自動(dòng)讀取所有的提交信息,生成日志、或者輸出提交報(bào)告。
自動(dòng)化構(gòu)建部署
大廠研發(fā)流程中,一般都是使用 CI / CD(持續(xù)集成和持續(xù)部署)平臺(tái),以流水線的形式自動(dòng)構(gòu)建部署項(xiàng)目的。
Git 提交可以和 CI / CD 平臺(tái)進(jìn)行集成,比如自動(dòng)監(jiān)視代碼庫(kù)中的提交,并在每次提交后自動(dòng)觸發(fā)構(gòu)建和部署任務(wù)。一個(gè)典型的使用場(chǎng)景是,每次代碼開(kāi)發(fā)完成后,先提交代碼到測(cè)試分支,然后 CI / CD 平臺(tái)監(jiān)測(cè)到本次提交,并立即在測(cè)試環(huán)境中構(gòu)建和部署,而不需要人工操作,從而提交效率。
GitHub Actions 和 GitHub Webhooks 都可以實(shí)現(xiàn)上述功能,感興趣的同學(xué)可以嘗試下。
GitHub Actions 文檔教程:https://docs.github.com/zh/actions/quickstart
檢驗(yàn)項(xiàng)目真假
最后這個(gè)點(diǎn)就比較獨(dú)特了,那就是面試官可以通過(guò)查看 Git 的提交記錄來(lái)判斷你的項(xiàng)目真假、是不是自己做的。
比如我收到一些同學(xué)的簡(jiǎn)歷中,有的開(kāi)源項(xiàng)目看起來(lái)感覺(jué)很厲害,但是點(diǎn)進(jìn)倉(cāng)庫(kù)看了下提交記錄,發(fā)現(xiàn)寥寥無(wú)幾,甚至有的只有 1 次!像下圖這樣:
那么這個(gè)項(xiàng)目真的是他自己從 0 開(kāi)始做的么?答案就顯而易見(jiàn)了。
如果真的是你自己用心做的項(xiàng)目,提交記錄絕對(duì)不止 1 次,而且面試官能夠通過(guò)提交記錄很清晰地了解到你的項(xiàng)目開(kāi)發(fā)周期。
像我的 yuindex Web 終端項(xiàng)目一樣,這才是比較真實(shí)、有說(shuō)服力的:
其他人也能從你的提交記錄中,感受到你對(duì)項(xiàng)目的用心程度。
講到這里,是不是有些同學(xué)恍然大悟,知道為啥自己的項(xiàng)目明明開(kāi)源了,但是沒(méi)有收到面試邀請(qǐng)、或者被面試官覺(jué)得項(xiàng)目不真實(shí)了?
實(shí)踐
以上就是本次分享,Git 提交的實(shí)踐其實(shí)非常簡(jiǎn)單,我建議大家每次做新項(xiàng)目時(shí),無(wú)論大小,都用 Git 來(lái)托管你的項(xiàng)目,并且每開(kāi)發(fā)完一個(gè)功能或解決 Bug,都進(jìn)行一次提交。等項(xiàng)目完成后回過(guò)頭來(lái)看這些提交記錄,都是自己寶貴的財(cái)富。
???? 點(diǎn)擊下方閱讀原文,獲取魚(yú)皮往期編程干貨
往期推薦
