目錄
2.3.2 Merge Request(MR)/ Pull Request(PR)
一、概念
1.1 概念
一個(gè)功能強(qiáng)大的就是GitLab DevOps 平臺(tái),它遠(yuǎn)不止于一個(gè)簡(jiǎn)單的代碼托管工具,旨在為軟件開(kāi)發(fā)團(tuán)隊(duì)提供從項(xiàng)目規(guī)劃、代碼管理到構(gòu)建、測(cè)試、部署和監(jiān)控的全流程支持。本文主要講的是它的代碼托管功能。
下面展示了 GitLab 與另一個(gè)流行的代碼托管平臺(tái) GitHub 的核心區(qū)別:
| 特性對(duì)比 | GitLab | GitHub |
|---|---|---|
| 核心定位 | 一體化的 DevOps 平臺(tái) | 側(cè)重于代碼托管和開(kāi)源社區(qū) |
| 私有倉(cāng)庫(kù) | 免費(fèi)支持私有項(xiàng)目,適合企業(yè)內(nèi)部啟用 | 私有項(xiàng)目通常得付費(fèi)計(jì)劃 |
| 部署方式 | 支持 SaaS (GitLab.com) 和 自行部署,靈活性高 | 主要以 SaaS 服務(wù)為主 |
| CI/CD 功能 | 內(nèi)置強(qiáng)大的持續(xù)集成/持續(xù)部署 (CI/CD) 應(yīng)用 | 主要通過(guò) GitHub Actions(需額外配置)或第三方程序?qū)崿F(xiàn) |
| 文化側(cè)重 | 更注重企業(yè)內(nèi)部的開(kāi)發(fā)流程和權(quán)限管控 | 擁有強(qiáng)大的開(kāi)源社區(qū)文化和協(xié)作生態(tài) |
1.2 核心功能
代碼管理與版本控制:基于 Git,提供完整的代碼倉(cāng)庫(kù)管理,包括分支管理、合并請(qǐng)求(Merge Request)、代碼審查等,確保代碼變更清晰可控。
CI/CD(持續(xù)集成與持續(xù)部署):這是 GitLab 的王牌功能。通過(guò)項(xiàng)目根目錄下的一個(gè)
.gitlab-ci.yml配置文件,即可自動(dòng)化完成軟件的構(gòu)建、測(cè)試和部署流程,實(shí)現(xiàn)快速、可靠的交付。項(xiàng)目管理與協(xié)作:內(nèi)置了問(wèn)題(Issue)跟蹤、Wiki 文檔、看板(Kanban)等工具,幫助團(tuán)隊(duì)高效管理任務(wù)和知識(shí)。
安全與權(quán)限管理:提供精細(xì)化的權(quán)限控制(從訪客到維護(hù)者多個(gè)角色),并集成了安全掃描應(yīng)用(如 SAST、DAST),能在開(kāi)發(fā)早期發(fā)現(xiàn)漏洞。
二、代碼管理
2.1 基礎(chǔ)Git命令
clone:克隆遠(yuǎn)程倉(cāng)庫(kù)。add/commit:提交更改到本地倉(cāng)庫(kù)。push/pull/fetch:與遠(yuǎn)程倉(cāng)庫(kù)同步。branch/checkout:分支管理。merge/rebase:合并代碼(理解兩者的區(qū)別和適用場(chǎng)景)。status/log/diff:查看狀態(tài)、歷史和差異。
2.2 Git倉(cāng)庫(kù)管理
倉(cāng)庫(kù)類型:
私有倉(cāng)庫(kù):GitLab 的顯著優(yōu)勢(shì)。免費(fèi)版即可創(chuàng)建無(wú)限量的私有倉(cāng)庫(kù),非常適合企業(yè)內(nèi)部項(xiàng)目。
內(nèi)部倉(cāng)庫(kù):對(duì)登錄用戶可見(jiàn),適合跨部門(mén)協(xié)作。
公開(kāi)倉(cāng)庫(kù):對(duì)外部世界完全可見(jiàn),適合開(kāi)源項(xiàng)目。
分支保護(hù):
這是保證主分支(如
main或master)代碼質(zhì)量的關(guān)鍵。保護(hù)規(guī)則:可以設(shè)置哪些角色(如
Maintainer,Developer)擁有推送(Push)、合并(Merge)到特定分支的權(quán)限。合并前要求:
至少 X 個(gè)批準(zhǔn):要求合并請(qǐng)求必須獲得指定數(shù)量的核心成員批準(zhǔn)。
流水線必須成功:要求關(guān)聯(lián)的 CI/CD 流水線必須運(yùn)行成功,否則無(wú)法合并。
討論必須解決:要求合并請(qǐng)求中的所有評(píng)論和線程都必須被標(biāo)記為“已解決”。
文件鎖:
對(duì)于二進(jìn)制文件(如圖片、文檔)或關(guān)鍵配置文件,可以將其鎖定,防止多人同時(shí)編輯導(dǎo)致沖突。
2.3 GitLab核心工作流
2.3.1 分支策略
主分支:
main或master,保持穩(wěn)定,隨時(shí)可部署。功能分支:從
main拉取,用于新功能開(kāi)發(fā),命名如feature/user-authentication。發(fā)布分支:從
main拉取,用于準(zhǔn)備發(fā)布,命名如release/1.2.0,只做Bug修復(fù)。熱修復(fù)分支:從
main拉取,用于生產(chǎn)環(huán)境緊急修復(fù),命名如hotfix/critical-bug。GitFlow:一個(gè)經(jīng)典的分支模型,GitLab有很好的幫助。了解其流程。
2.3.2 Merge Request(MR)/ Pull Request(PR)
核心價(jià)值:代碼審查、知識(shí)共享、質(zhì)量保證。
流程:
在功能分支上開(kāi)發(fā)完成。
在GitLab上創(chuàng)建一個(gè)MR,請(qǐng)求將你的分支合并到
main分支。指定審查者:讓你的同事或Tech Lead審查代碼。
討論和修改:根據(jù)審查意見(jiàn)在本地修改,隨后推送到同一個(gè)功能分支,MR會(huì)自動(dòng)更新。
CI/CD流水線通過(guò):確保你的代碼通過(guò)所有自動(dòng)化測(cè)試和檢查。
合并:由代碼審查者或你自己(如果允許)完成合并。
最佳實(shí)踐:
寫(xiě)清晰的MR標(biāo)題和描述,說(shuō)明改了什么,為什么改。
鏈接相關(guān)的問(wèn)題。
應(yīng)用“Squash commits”選項(xiàng)保持提交歷史整潔。
2.4 .gitignore文件
這是 Java 工程的必備文件。它告訴 Git 忽略哪些文件(如編譯生成的 target/ 目錄、IDE 配置文件 .idea/、.class 文件等)。一個(gè)配置正確的 .gitignore 可以保持倉(cāng)庫(kù)的清潔。
三、Git常用命令
3.1 倉(cāng)庫(kù)初始化與克隆
這些命令用于開(kāi)始一個(gè)方案,要么在本地創(chuàng)建新倉(cāng)庫(kù),要么獲取現(xiàn)有的遠(yuǎn)程倉(cāng)庫(kù)。
| 命令 | 說(shuō)明 | 常用選項(xiàng)與示例 | 應(yīng)用場(chǎng)景 |
|---|---|---|---|
git init | 將當(dāng)前目錄初始化為一個(gè)新的 Git 倉(cāng)庫(kù)。 | git init | 在本地創(chuàng)建一個(gè)全新的項(xiàng)目。 |
git clone | 克?。ㄏ螺d)一個(gè)遠(yuǎn)程倉(cāng)庫(kù)到本地。 | git clone <repo_url>git clone <repo_url> <目錄名> | 從 GitLab/GitHub 上獲取項(xiàng)目代碼,開(kāi)始工作。 |
3.2 基礎(chǔ)工作流(最常用)
日常制作中使用最頻繁的命令,對(duì)應(yīng)著 Git 的基本工作流程:修改 -> 暫存 -> 提交。就是這
| 命令 | 說(shuō)明 | 常用選項(xiàng)與示例 | 應(yīng)用場(chǎng)景 |
|---|---|---|---|
git status | 查看工作區(qū)和暫存區(qū)的狀態(tài)(哪些文件被修改、哪些已暫存)。 | git statusgit status -s (簡(jiǎn)潔模式) | 隨時(shí)使用,查看當(dāng)前更改狀態(tài)。 |
git add | 將工作區(qū)的修改添加到暫存區(qū)。 | git add <文件名>git add . (添加所有更改)git add -p (交互式暫存,推薦) | 準(zhǔn)備提交前,將相關(guān)的更改打包。 |
git commit | 將暫存區(qū)的內(nèi)容提交到本地倉(cāng)庫(kù),創(chuàng)建一個(gè)新的版本記錄。 | git commit -m "提交信息"git commit -am "提交信息" (跳過(guò)git add,只對(duì)已跟蹤文件有效) | 完成一個(gè)小的功能點(diǎn)或修復(fù)后,保存工作進(jìn)度。 |
git restore(或 git checkout --) | 撤銷工作區(qū)的修改,恢復(fù)到最近一次 git commit 或 git add 時(shí)的狀態(tài)。 | git restore <文件名>git restore . (撤銷所有未暫存的修改) | 危險(xiǎn)!丟棄尚未暫存的本地修改。 |
git restore --staged(或 git reset HEAD) | 將文件從暫存區(qū)移回工作區(qū),取消暫存。 | git restore --staged <文件名> | 誤將不需要的文件git add了,可以將其移出暫存區(qū)。 |
git add -p(交互式暫存):這是一個(gè)高級(jí)但極其有用的功能。它允許檢查每個(gè)代碼塊(hunk),并決定是否將其暫存。這可以協(xié)助創(chuàng)建邏輯清晰、小而專注的提交,而不是一個(gè)大的“各種修改”的提交。
3.3 分支操作
| 命令 | 說(shuō)明 | 常用選項(xiàng)與示例 | 應(yīng)用場(chǎng)景 |
|---|---|---|---|
git branch | 查看、創(chuàng)建、刪除分支。 | git branch (列出所有本地分支)git branch <分支名> (創(chuàng)建新分支)git branch -d <分支名> (刪除已合并的分支) | 分支管理。 |
git checkout | 切換分支或恢復(fù)工作區(qū)文件。 | git checkout <分支名> (切換分支)git checkout -b <新分支名> (創(chuàng)建并切換到新分支) | 切換工作上下文,開(kāi)始新功能開(kāi)發(fā)。 |
git switch(較新版本) | 專門(mén)用于切換分支,比 git checkout 意圖更清晰。 | git switch <分支名>git switch -c <新分支名> (創(chuàng)建并切換) | 推薦用它來(lái)替代 git checkout <分支名>。 |
git merge | 將指定分支的修改合并到當(dāng)前分支。 | git merge <分支名> | 通常用于將功能分支合并到主分支(如 main)。 |
git rebase | 將當(dāng)前分支的提交“重新播放”到目標(biāo)分支上,形成線性的提交歷史。 | git rebase <目標(biāo)分支> | 整理提交歷史,使歷史更清晰。注意:不要在公共分支上使用! |
3.4 查看歷史與比較差異
| 命令 | 說(shuō)明 | 常用選項(xiàng)與示例 | 應(yīng)用場(chǎng)景 |
|---|---|---|---|
git log | 查看提交歷史。 | git loggit log --oneline (簡(jiǎn)潔模式)git log --graph (圖形化顯示) | 查看誰(shuí)在什么時(shí)候做了什么。 |
git diff | 顯示差異。 | git diff (工作區(qū) vs 暫存區(qū))git diff --staged (暫存區(qū) vs 最新提交)git diff <分支A> <分支B> | 查看代碼的具體改動(dòng)內(nèi)容。 |
3.5 遠(yuǎn)程協(xié)作
與遠(yuǎn)程倉(cāng)庫(kù)(如 GitLab)交互的命令。
| 命令 | 說(shuō)明 | 常用選項(xiàng)與示例 | 應(yīng)用場(chǎng)景 |
|---|---|---|---|
git remote | 管理遠(yuǎn)程倉(cāng)庫(kù)地址。 | git remote -v (查看遠(yuǎn)程地址)git remote add origin <url> (添加遠(yuǎn)程倉(cāng)庫(kù)) | 通常克隆后自動(dòng)設(shè)置好 origin。 |
git fetch | 從遠(yuǎn)程倉(cāng)庫(kù)下載最新數(shù)據(jù),但不合并到工作區(qū)。 | git fetch | 安全地查看同事是否有新提交。 |
git pull | 從遠(yuǎn)程倉(cāng)庫(kù)下載并合并到當(dāng)前分支。 | git pull (相當(dāng)于 git fetch + git merge)git pull --rebase (相當(dāng)于 git fetch + git rebase) | 更新本地代碼,獲取團(tuán)隊(duì)最新進(jìn)展。 |
git push | 將本地提交推送到遠(yuǎn)程倉(cāng)庫(kù)。 | git push -u origin <分支名> (首次推送分支,建立關(guān)聯(lián))git push (后續(xù)推送) | 分享你的代碼,將本地提交推送到 GitLab。 |
3.6 撤銷與回退
| 命令 | 說(shuō)明 | 常用選項(xiàng)與示例 | 應(yīng)用場(chǎng)景 |
|---|---|---|---|
git commit --amend | 修補(bǔ)最新提交??梢孕薷奶峤恍畔⒒蚣尤肼┑舻奈臋n。 | git commit --amend -m "新信息" | 剛提交完發(fā)現(xiàn)少了個(gè)文件或提交信息寫(xiě)錯(cuò)了。 |
git reset | 回退到指定的提交,有三種模式。 | git reset --soft <commit_id> (移動(dòng)HEAD,保留暫存區(qū)和工作區(qū))git reset --mixed <commit_id> (默認(rèn),移動(dòng)HEAD,保留工作區(qū))git reset --hard <commit_id> (危險(xiǎn)!徹底回退,丟棄所有更改) | 撤銷本地提交。謹(jǐn)慎使用 --hard! |
git revert | 創(chuàng)建一個(gè)新的提交來(lái)撤銷指定提交的更改。 | git revert <commit_id> | 安全地撤銷公共提交(如已推送到GitLab的提交),因?yàn)樗恢貙?xiě)歷史。 |
浙公網(wǎng)安備 33010602011771號(hào)