Git 与 DevOps/CI/CD 核心知识整理
一、基础核心概念
1. 版本控制
版本控制是用于记录文件内容变更、追溯历史版本、支撑多人协同开发的系统,是软件工程中代码管理的基础底座。核心价值:版本回退、历史追溯、多人协作、并行开发。
2. DevOps
DevOps 是 开发(Development)+ 运维(Operations) 的组合,是一套融合了文化理念、流程规范、工具链的协作模式,核心是打破开发与运维的部门壁垒,实现软件从开发、测试、部署到运维的全生命周期高效交付,兼顾交付速度与生产稳定性。
3. CI/CD
CI/CD 是 DevOps 的核心落地流程,是基于版本控制系统实现的自动化流水线:
- CI(持续集成 Continuous Integration):开发人员频繁将代码合并到主干分支,系统自动触发编译、单元测试、代码检查,尽早暴露合并冲突与代码缺陷。
- CD(持续交付 Continuous Delivery):在持续集成的基础上,自动将代码部署到测试 / 预发布环境,确保代码随时处于可安全发布的状态。
- CD(持续部署 Continuous Deployment):持续交付的进阶形态,代码通过所有自动化校验后,自动部署到生产环境,全程无需人工干预。
版本控制仓库是 CI/CD 的触发入口与唯一代码源,整个 DevOps 流程都围绕版本仓库流转。
二、主流版本控制系统对比
目前行业主流分为集中式 和分布式两类,代表产品分别为 SVN 和 Git。
表格
| 对比维度 | Git(分布式) | SVN(集中式) |
|---|---|---|
| 核心架构 | 每个开发者本地都拥有完整的版本仓库,所有提交、查历史都可本地完成 | 所有版本数据仅存放在中央服务器,所有操作都依赖网络访问服务端 |
| 离线能力 | 断网也可提交代码、查看历史、切换分支,联网后再同步到远程 | 断网无法提交、无法查看历史、无法创建分支,完全无法工作 |
| 分支特性 | 分支是轻量级指针,创建、切换速度极快,成本几乎为 0 | 分支是完整的文件拷贝,创建慢、切换成本高,不适合频繁并行开发 |
| 数据安全 | 分布式多副本,单节点故障不影响整体,数据丢失风险低 | 中央服务器单点故障则全团队停工,数据丢失风险高 |
| 适用场景 | 大型团队、开源项目、复杂并行开发、DevOps 流水线 | 小型团队、对文件权限管控要求极细的传统项目 |
面试重点:Git 分布式架构、轻量分支、离线工作是其取代 SVN 的核心优势。
三、常见 Git 代码托管平台
1. 公有托管平台(第三方运营,无需自建)
- GitHub:全球最大的开源代码托管平台,生态最完善,海外服务器,是开源项目的首选。
- Gitee(码云):国内主流公有托管平台,访问速度快,适合国内中小团队与个人开发者。
2. 私有托管平台(企业内网自建,数据自主可控)
- GitLab:企业级私有代码托管的行业标准,功能完整,自带 CI/CD 流水线、权限管控、Issue 管理、代码评审等能力,是 DevOps 工具链的核心组件。
- 其他轻量化选项:Gitea、Bitbucket 等。
四、Git 核心工作模型(四区流转)
Git 的所有操作都围绕四个区域的文件流转展开,是理解所有 Git 命令的底层逻辑:
- 工作区(Working Directory):本地电脑上的项目文件夹,我们直接编辑、修改的代码文件都处于工作区。
- 暂存区(Stage / Index):本地内存中的临时存储区,用于临时存放即将提交的文件修改,是工作区与本地仓库的过渡层。
- 本地仓库(Local Repository):本地硬盘上的 Git 版本库,永久存储所有提交的版本记录,每个提交对应唯一的 hash 值。
- 远程仓库(Remote Repository):部署在服务器上的共享仓库(GitHub/Gitee/GitLab),用于多人协作时代码的同步与共享。
标准正向提交流程:
工作区 →(git add)→ 暂存区 →(git commit)→ 本地仓库 →(git push)→ 远程仓库
反向拉取流程:
远程仓库 →(git clone / pull / fetch)→ 本地仓库 →(git checkout)→ 工作区
面试重点:四区的定义与流转关系是必背基础,所有命令本质都是在操作这四个区域的数据。
五、Git 分支基础
1. 主分支命名
- 旧版 Git、早期 GitLab 默认主分支名为 master
- 新版 GitLab、GitHub 默认主分支名为 main(仅命名调整,技术上无任何差异)
- 企业内部可自定义分支规范,常见主干分支命名:main /master、develop
2. 分支的核心价值
分支是 Git 的核心能力,允许团队在不同分支上并行开发功能、修复 bug,互不干扰,开发完成后再合并到主干,是多人协作与版本迭代的核心手段。
六、Git 核心命令大全(附场景案例)
1. 仓库初始化与基础配置
表格
| 命令 | 作用 | 场景说明 |
|---|---|---|
git init |
在当前目录初始化一个普通 Git 仓库 | 本地新建项目,需要纳入版本控制时使用 |
git init --bare |
初始化一个裸仓库(无工作区,仅存储版本数据) | 搭建私有远程仓库服务器时使用,不用于直接编辑代码 |
git config --global user.name "用户名" |
全局配置提交者用户名 | 首次安装 Git 必须配置,用于标记提交人身份 |
git config --global user.email "邮箱地址" |
全局配置提交者邮箱 | 与用户名配套,作为提交者身份标识 |
git config --list |
查看所有 Git 配置信息 | 排查配置错误、确认身份信息时使用 |
实操案例:新电脑首次配置 Git
git config --global user.name "zhangsan" git config --global user.email "zhangsan@company.com"
2. 文件状态与暂存操作
表格
| 命令 | 作用 | 场景说明 |
|---|---|---|
git status |
查看当前仓库所有文件的状态(未跟踪、已修改、已暂存等) | 日常最高频命令,每次提交前必执行,确认修改范围 |
git add 文件名 |
将指定文件的修改添加到暂存区 | 只提交单个文件的修改 |
git add . / git add * |
将当前目录所有新增、修改的文件批量加入暂存区 | 批量提交修改时使用 |
git rm --cached 文件名 |
仅删除暂存区的文件,保留工作区的本地文件 | 误 add 了不该提交的文件,撤销暂存状态 |
git rm -f 文件名 |
同时删除暂存区和工作区的文件 | 彻底删除文件,并将删除操作纳入版本记录 |
git mv 旧文件名 新文件名 |
重命名文件,同时将操作记录到暂存区 | 比手动删除 + 新建更规范,可保留文件的历史提交记录 |
实操案例:代码修改后的暂存与撤销
git status # 查看修改了哪些文件 git add . # 全部加入暂存区 git rm --cached debug.log # 发现日志文件不该提交,撤销暂存
3. 提交与历史记录
表格
| 命令 | 作用 | 场景说明 |
|---|---|---|
git commit -m "提交说明" |
将暂存区的内容提交到本地仓库,生成唯一版本 hash | 核心提交命令,提交说明建议清晰描述修改内容 |
git diff |
对比工作区与暂存区之间的文件内容差异 | 修改后未 add 前,查看具体改动细节 |
git diff --cached |
对比暂存区与本地仓库的文件差异 | add 后 commit 前,确认暂存的修改是否正确 |
git log |
查看完整历史提交记录(含作者、时间、提交说明、版本 hash) | 追溯提交历史、查找版本号 |
git log --pretty=oneline |
一行简洁格式显示提交记录 | 快速定位版本 hash,版本回滚时常用 |
git reflog |
查看所有操作记录(提交、回滚、切换分支等全部历史) | 回滚后想恢复版本、找不到 hash 时的救命命令 |
面试重点:git log 只显示当前分支的提交历史,回滚掉的版本不会显示;git reflog 记录所有操作,即使版本被回滚也能找到 hash。
4. 版本回滚
表格
| 命令 | 作用 | 场景说明 |
|---|---|---|
git reset --hard 版本hash值 |
强制回滚到指定版本,工作区、暂存区、本地仓库全部同步重置 | 彻底放弃当前修改,回到指定历史版本,慎用,会丢失所有未提交的修改 |
面试高频补充:
git reset的三种模式
--soft:仅移动本地仓库 HEAD 指针,暂存区、工作区内容保持不变,相当于把提交撤回到暂存区
--mixed(默认模式):移动 HEAD 指针,重置暂存区,工作区不变,相当于把提交撤回到工作区
--hard:移动 HEAD 指针,同时重置暂存区和工作区,所有修改彻底丢失,最彻底也最危险
实操案例:版本回滚与恢复git log --pretty=oneline # 找到目标版本的 hash
git reset --hard a1b2c3d # 回滚到指定版本回滚后后悔,想恢复之前的版本
git reflog # 找到被回滚版本的 hash
git reset --hard xyz789 # 切回原来的版本
5. 分支操作
表格
| 命令 | 作用 | 场景说明 |
|---|---|---|
git branch |
查看所有本地分支,当前分支前有 * 标记 |
确认当前所在分支 |
git branch 分支名 |
创建一个新分支 | 基于当前分支创建新的功能分支 |
git checkout 分支名 |
切换到指定分支 | 切换到对应分支进行开发 |
git checkout -b 分支名 |
创建新分支并立即切换过去 | 高频简写命令,一步完成创建 + 切换 |
git merge 分支名 |
将指定分支合并到当前分支 | 功能开发完成后,合并到主干分支 |
git branch -d 分支名 |
删除已完成合并的分支 | 合并完成后,清理无用的功能分支 |
git branch -D 分支名 |
强制删除未合并的分支 | 放弃某个分支的开发,强制清理 |
实操案例:新功能开发的标准分支流程
# 1. 先切到主分支,拉取远程最新代码 git checkout main git pull # 2. 创建登录功能分支并切换 git checkout -b feature-login # 3. 开发完成后提交到本地仓库 git add . git commit -m "完成登录功能开发与联调" # 4. 切回主分支,合并功能分支 git checkout main git merge feature-login # 5. 合并完成,删除功能分支 git branch -d feature-login
6. 远程仓库交互
表格
| 命令 | 作用 | 场景说明 |
|---|---|---|
git clone 远程仓库地址 |
将远程仓库完整克隆到本地 | 首次接手项目,下载完整代码 |
git remote |
查看本地绑定的远程仓库别名 | 确认远程仓库配置 |
git remote -v |
查看远程仓库别名与对应的完整地址 | 详细查看远程仓库配置 |
git remote add 别名 远程地址 |
给本地仓库绑定远程仓库 | 本地 init 的项目,要关联远程仓库时使用 |
git push -u 远程别名 分支名 |
将本地分支推送到远程,-u 建立跟踪关联,后续可直接 git push |
首次推送新分支,建立本地与远程分支的关联 |
git push |
推送当前分支的提交到远程仓库 | 日常同步本地代码到远程 |
git pull |
拉取远程分支的最新代码并自动合并到当前分支 | 同步远程最新代码,等价于 git fetch + git merge |
git fetch |
拉取远程最新代码到本地仓库,不自动合并 | 想先查看远程改动、再决定是否合并时使用,更安全 |
面试重点:git pull 拉取后自动合并,可能产生冲突;git fetch 只拉取不合并,可人工审查后再操作。
7. 标签(版本号)操作
标签用于给某个提交打上固定的版本标识,通常用于正式发布版本(如 v1.0.0)。标签是静态只读的,永远指向固定的提交,不会像分支一样随新提交移动。
表格
| 命令 | 作用 | 场景说明 |
|---|---|---|
git tag |
查看所有本地标签 | 查看已有的版本号 |
git tag 版本号 |
创建轻量标签 | 快速打一个版本标记 |
git tag -a 版本号 -m "发布说明" |
创建带注解的标签 | 正式发布版本使用,记录发布说明与发布人 |
git checkout 版本号 |
切换到指定标签对应的代码版本 | 查看某个历史发布版本的代码 |
git push 远程别名 版本号 |
推送单个标签到远程仓库 | 发布版本后同步到远程 |
git push 远程别名 --tags |
推送所有本地标签到远程 | 批量同步所有标签 |
git tag -d 版本号 |
删除本地标签 | 删除打错的本地标签 |
git push 远程别名 :refs/tags/版本号 |
删除远程仓库的标签 | 同步删除远程的错误标签 |
实操案例:正式版本发布
git tag -a v1.0.0 -m "正式发布v1.0.0,包含登录、注册、首页核心功能" git push origin v1.0.0
七、高频面试题汇总
基础题
- Git 和 SVN 的核心区别是什么? 答:Git 是分布式版本控制系统,每个开发者本地都有完整的版本仓库,支持离线提交,分支轻量高效,性能与安全性更强;SVN 是集中式系统,所有数据依赖中央服务器,断网无法工作,分支创建成本高。目前行业主流已全面转向 Git。
- 简述 Git 工作区、暂存区、本地仓库、远程仓库的含义与流转关系。 答:工作区是本地直接编辑的项目文件夹;暂存区是待提交修改的临时过渡区;本地仓库是本地存储所有版本记录的地方;远程仓库是服务器上的共享仓库。文件通过
git add从工作区进入暂存区,通过git commit进入本地仓库,通过git push同步到远程仓库。 - 如何撤销已经执行的
git add操作? 答:可以使用git rm --cached 文件名撤销单个文件的暂存,也可以使用git reset HEAD 文件名,二者效果一致。 git log和git reflog有什么区别? 答:git log只能查看当前分支的提交历史,被回滚掉的版本不会显示;git reflog记录了所有操作(提交、回滚、切换分支等),即使版本被回滚也能找到对应的 hash,是找回丢失版本的核心命令。- Git 的标签和分支有什么区别? 答:分支是动态的,会随着新的提交不断向前移动;标签是静态的,永远指向某个固定的提交,不会移动。分支用于开发迭代,标签用于标记固定的发布版本。
进阶题
git reset的三种模式 soft、mixed、hard 有什么区别? 答:--soft:仅移动 HEAD 指针,暂存区和工作区都不受影响,相当于把提交撤回到暂存区--mixed(默认):移动 HEAD 指针,重置暂存区,工作区不变,相当于把提交撤回到工作区--hard:移动 HEAD 指针,同时重置暂存区和工作区,所有修改彻底丢失,风险最高
git pull和git fetch的区别是什么? 答:git fetch只会把远程仓库的最新代码拉取到本地仓库,不会自动合并到当前分支,可以先查看改动再决定是否合并,更安全;git pull等价于git fetch + git merge,拉取后自动合并到当前分支,可能会意外产生合并冲突。- 什么是合并冲突?如何解决? 答:当两个分支修改了同一个文件的同一行内容,Git 无法自动判断保留哪份代码,就会产生合并冲突。解决步骤:
- 执行
git status定位冲突文件 - 打开冲突文件,找到
<<<<<<<、=======、>>>>>>>标记的冲突区域 - 人工协商修改,保留正确的代码,删除所有冲突标记
- 重新执行
git add、git commit完成合并
- 执行
git merge和git rebase有什么区别? 答:merge:保留完整的提交历史,会生成一个新的合并提交,历史记录呈分叉网状,能清晰看到分支来源,不会改写历史rebase(变基):将当前分支的提交 "平移" 到目标分支的最新提交之后,历史记录是一条直线,更整洁,但会改写提交历史- 行业规范:公共主干分支禁止使用 rebase,个人功能分支可用于整理提交记录
- 说说你对 DevOps 和 CI/CD 的理解,以及 Git 在其中的作用。 答:DevOps 是打通开发与运维的协作理念,目标是提升软件交付效率,同时保障生产稳定性。CI/CD 是 DevOps 的核心落地流程,通过自动化流水线实现代码的集成、测试与部署。Git 是 CI/CD 的基础底座:代码提交到 Git 仓库后会自动触发流水线,执行构建、测试、部署;所有版本迭代、发布回滚都以 Git 仓库为唯一可信源。
八、核心重点划记
- 必背概念:Git 分布式特性、四区流转模型、DevOps 与 CI/CD 定义
- 高频命令 :
git status、git add、git commit、git log、git reset、git branch、git checkout、git merge、git push、git pull、git reflog - 面试必考点 :
- Git 与 SVN 的核心区别
git reset三种模式的差异git pull与git fetch的差异merge与rebase的差异与使用规范- 合并冲突的解决流程
- 标签与分支的区别