目录
[1.1 概念](#1.1 概念)
[1.2 核心功能](#1.2 核心功能)
[2.1 基础Git命令](#2.1 基础Git命令)
[2.2 Git仓库管理](#2.2 Git仓库管理)
[2.3 GitLab核心工作流](#2.3 GitLab核心工作流)
[2.3.1 分支策略](#2.3.1 分支策略)
[2.3.2 Merge Request(MR)/ Pull Request(PR)](#2.3.2 Merge Request(MR)/ Pull Request(PR))
[2.4 .gitignore文件](#2.4 .gitignore文件)
[3.1 仓库初始化与克隆](#3.1 仓库初始化与克隆)
[3.2 基础工作流(最常用)](#3.2 基础工作流(最常用))
[3.3 分支操作](#3.3 分支操作)
[3.4 查看历史与比较差异](#3.4 查看历史与比较差异)
[3.5 远程协作](#3.5 远程协作)
[3.6 撤销与回退](#3.6 撤销与回退)
一、概念
1.1 概念
GitLab 是一个功能强大的 DevOps 平台,它远不止于一个简单的代码托管工具,旨在为软件开发团队提供从项目规划、代码管理到构建、测试、部署和监控的全流程支持。本文主要讲的是它的代码托管功能。
下面展示了 GitLab 与另一个流行的代码托管平台 GitHub 的核心区别:
特性对比 | GitLab | GitHub |
---|---|---|
核心定位 | 一体化的 DevOps 平台 | 侧重于代码托管 和开源社区 |
私有仓库 | 免费支持私有项目,适合企业内部使用 | 私有项目通常需要付费计划 |
部署方式 | 支持 SaaS (GitLab.com) 和 自行部署,灵活性高 | 主要以 SaaS 服务为主 |
CI/CD 功能 | 内置强大的持续集成/持续部署 (CI/CD) 工具 | 主要通过 GitHub Actions(需额外配置)或第三方工具实现 |
文化侧重 | 更注重企业内部 的开发流程 和权限管控 | 拥有强大的开源社区文化和协作生态 |
1.2 核心功能
-
代码管理与版本控制:基于 Git,提供完整的代码仓库管理,包括分支管理、合并请求(Merge Request)、代码审查等,确保代码变更清晰可控。
-
CI/CD(持续集成与持续部署) :这是 GitLab 的王牌功能。通过项目根目录下的一个
.gitlab-ci.yml
配置文件,即可自动化完成软件的构建、测试和部署流程,实现快速、可靠的交付。 -
项目管理与协作:内置了问题(Issue)跟踪、Wiki 文档、看板(Kanban)等工具,帮助团队高效管理任务和知识。
-
安全与权限管理:提供精细化的权限控制(从访客到维护者多个角色),并集成了安全扫描工具(如 SAST、DAST),能在开发早期发现漏洞。
二、代码管理
2.1 基础Git命令
-
clone
:克隆远程仓库。 -
add
/commit
:提交更改到本地仓库。 -
push
/pull
/fetch
:与远程仓库同步。 -
branch
/checkout
:分支管理。 -
merge
/rebase
:合并代码(理解两者的区别和适用场景)。 -
status
/log
/diff
:查看状态、历史和差异。
2.2 Git仓库管理
-
仓库类型:
-
私有仓库 :GitLab 的显著优势。免费版即可创建无限量的私有仓库,非常适合企业内部项目。
-
内部仓库:对登录用户可见,适合跨部门协作。
-
公开仓库:对外部世界完全可见,适合开源项目。
-
-
分支保护:
这是保证主分支(如
main
或master
)代码质量的关键。-
保护规则 :可以设置哪些角色(如
Maintainer
,Developer
)拥有推送(Push)、合并(Merge)到特定分支的权限。 -
合并前要求:
-
至少 X 个批准:要求合并请求必须获得指定数量的核心成员批准。
-
流水线必须成功:要求关联的 CI/CD 流水线必须运行成功,否则无法合并。
-
讨论必须解决:要求合并请求中的所有评论和线程都必须被标记为"已解决"。
-
-
-
文件锁:
对于二进制文件(如图片、文档)或关键配置文件,可以将其锁定,防止多人同时编辑导致冲突。
2.3 GitLab核心工作流
2.3.1 分支策略
-
主分支 :
main
或master
,保持稳定,随时可部署。 -
功能分支 :从
main
拉取,用于新功能开发,命名如feature/user-authentication
。 -
发布分支 :从
main
拉取,用于准备发布,命名如release/1.2.0
,只做Bug修复。 -
热修复分支 :从
main
拉取,用于生产环境紧急修复,命名如hotfix/critical-bug
。 -
GitFlow:一个经典的分支模型,GitLab有很好的支持。了解其流程。
2.3.2 Merge Request(MR)/ Pull Request(PR)
-
核心价值:代码审查、知识共享、质量保证。
-
流程:
-
在功能分支上开发完成。
-
在GitLab上创建一个MR,请求将你的分支合并到
main
分支。 -
指定审查者:让你的同事或Tech Lead审查代码。
-
讨论和修改:根据审查意见在本地修改,然后推送到同一个功能分支,MR会自动更新。
-
CI/CD流水线通过:确保你的代码通过所有自动化测试和检查。
-
合并:由代码审查者或你自己(如果允许)完成合并。
-
-
最佳实践:
-
写清晰的MR标题和描述,说明改了什么,为什么改。
-
链接相关的问题。
-
使用"Squash commits"选项保持提交历史整洁。
-
2.4 .gitignore文件
这是 Java 项目的必备文件 。它告诉 Git 忽略哪些文件(如编译生成的 target/
目录、IDE 配置文件 .idea/
、.class
文件等)。一个配置正确的 .gitignore
可以保持仓库的清洁。
三、Git常用命令
3.1 仓库初始化与克隆
这些命令用于开始一个项目,要么在本地创建新仓库,要么获取现有的远程仓库。
命令 | 说明 | 常用选项与示例 | 应用场景 |
---|---|---|---|
git init |
将当前目录初始化为一个新的 Git 仓库。 | git init |
在本地创建一个全新的项目。 |
git clone |
克隆(下载)一个远程仓库到本地。 | git clone <repo_url> git clone <repo_url> <目录名> |
从 GitLab/GitHub 上获取项目代码,开始工作。 |
3.2 基础工作流(最常用)
这是日常开发中使用最频繁的命令,对应着 Git 的基本工作流程:修改 -> 暂存 -> 提交。
命令 | 说明 | 常用选项与示例 | 应用场景 |
---|---|---|---|
git status |
查看工作区和暂存区的状态(哪些文件被修改、哪些已暂存)。 | git status git status -s (简洁模式) |
随时使用,查看当前更改状态。 |
git add |
将工作区的修改添加到暂存区。 | git add <文件名> git add . (添加所有更改) git add -p (交互式暂存,推荐) |
准备提交前,将相关的更改打包。 |
git commit |
将暂存区的内容提交到本地仓库,创建一个新的版本记录。 | git commit -m "提交信息" git commit -am "提交信息" (跳过git add ,只对已跟踪文件有效) |
完成一个小的功能点或修复后,保存工作进度。 |
git restore (或 git checkout -- ) |
撤销工作区的修改 ,恢复到最近一次 git commit 或 git add 时的状态。 |
git restore <文件名> git restore . (撤销所有未暂存的修改) |
危险! 丢弃尚未暂存的本地修改。 |
git restore --staged (或 git reset HEAD ) |
将文件从暂存区移回工作区,取消暂存。 | git restore --staged <文件名> |
误将不需要的文件git add 了,可以将其移出暂存区。 |
git add -p
(交互式暂存) :这是一个高级但极其有用的功能。它允许检查每个代码块(hunk),并决定是否将其暂存。这可以帮助创建逻辑清晰、小而专注的提交,而不是一个大的"各种修改"的提交。
3.3 分支操作
命令 | 说明 | 常用选项与示例 | 应用场景 |
---|---|---|---|
git branch |
查看、创建、删除分支。 | git branch (列出所有本地分支) git branch <分支名> (创建新分支) git branch -d <分支名> (删除已合并的分支) |
分支管理。 |
git checkout |
切换分支或恢复工作区文件。 | git checkout <分支名> (切换分支) git checkout -b <新分支名> (创建并切换到新分支) |
切换工作上下文,开始新功能开发。 |
git switch (较新版本) |
专门用于切换分支 ,比 git checkout 意图更清晰。 |
git switch <分支名> git switch -c <新分支名> (创建并切换) |
推荐用它来替代 git checkout <分支名> 。 |
git merge |
将指定分支的修改合并到当前分支。 | git merge <分支名> |
通常用于将功能分支合并到主分支(如 main )。 |
git rebase |
将当前分支的提交"重新播放"到目标分支上,形成线性的提交历史。 | git rebase <目标分支> |
整理提交历史 ,使历史更清晰。注意:不要在公共分支上使用! |
3.4 查看历史与比较差异
命令 | 说明 | 常用选项与示例 | 应用场景 |
---|---|---|---|
git log |
查看提交历史。 | git log git log --oneline (简洁模式) git log --graph (图形化显示) |
查看谁在什么时候做了什么。 |
git diff |
显示差异。 | git diff (工作区 vs 暂存区) git diff --staged (暂存区 vs 最新提交) git diff <分支A> <分支B> |
查看代码的具体改动内容。 |
3.5 远程协作
与远程仓库(如 GitLab)交互的命令。
命令 | 说明 | 常用选项与示例 | 应用场景 |
---|---|---|---|
git remote |
管理远程仓库地址。 | git remote -v (查看远程地址) git remote add origin <url> (添加远程仓库) |
通常克隆后自动设置好 origin 。 |
git fetch |
从远程仓库下载最新数据 ,但不合并到工作区。 | git fetch |
安全地查看同事是否有新提交。 |
git pull |
从远程仓库下载并合并到当前分支。 | git pull (相当于 git fetch + git merge ) git pull --rebase (相当于 git fetch + git rebase ) |
更新本地代码,获取团队最新进展。 |
git push |
将本地提交推送到远程仓库。 | git push -u origin <分支名> (首次推送分支,建立关联) git push (后续推送) |
分享你的代码,将本地提交推送到 GitLab。 |
3.6 撤销与回退
命令 | 说明 | 常用选项与示例 | 应用场景 |
---|---|---|---|
git commit --amend |
修补最新提交。可以修改提交信息或加入漏掉的文件。 | git commit --amend -m "新信息" |
刚提交完发现少了个文件或提交信息写错了。 |
git reset |
回退到指定的提交,有三种模式。 | git reset --soft <commit_id> (移动HEAD,保留暂存区和工作区) git reset --mixed <commit_id> (默认 ,移动HEAD,保留工作区) git reset --hard <commit_id> (危险! 彻底回退,丢弃所有更改) |
撤销本地提交 。谨慎使用 --hard ! |
git revert |
创建一个新的提交来撤销指定提交的更改。 | git revert <commit_id> |
安全地撤销公共提交(如已推送到GitLab的提交),因为它不重写历史。 |