Git 与 DevOps/CI/CD 核心知识整理

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 命令的底层逻辑:

  1. 工作区(Working Directory):本地电脑上的项目文件夹,我们直接编辑、修改的代码文件都处于工作区。
  2. 暂存区(Stage / Index):本地内存中的临时存储区,用于临时存放即将提交的文件修改,是工作区与本地仓库的过渡层。
  3. 本地仓库(Local Repository):本地硬盘上的 Git 版本库,永久存储所有提交的版本记录,每个提交对应唯一的 hash 值。
  4. 远程仓库(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

七、高频面试题汇总

基础题

  1. Git 和 SVN 的核心区别是什么? 答:Git 是分布式版本控制系统,每个开发者本地都有完整的版本仓库,支持离线提交,分支轻量高效,性能与安全性更强;SVN 是集中式系统,所有数据依赖中央服务器,断网无法工作,分支创建成本高。目前行业主流已全面转向 Git。
  2. 简述 Git 工作区、暂存区、本地仓库、远程仓库的含义与流转关系。 答:工作区是本地直接编辑的项目文件夹;暂存区是待提交修改的临时过渡区;本地仓库是本地存储所有版本记录的地方;远程仓库是服务器上的共享仓库。文件通过 git add 从工作区进入暂存区,通过 git commit 进入本地仓库,通过 git push 同步到远程仓库。
  3. 如何撤销已经执行的 git add 操作? 答:可以使用 git rm --cached 文件名 撤销单个文件的暂存,也可以使用 git reset HEAD 文件名,二者效果一致。
  4. git loggit reflog 有什么区别? 答:git log 只能查看当前分支的提交历史,被回滚掉的版本不会显示;git reflog 记录了所有操作(提交、回滚、切换分支等),即使版本被回滚也能找到对应的 hash,是找回丢失版本的核心命令。
  5. Git 的标签和分支有什么区别? 答:分支是动态的,会随着新的提交不断向前移动;标签是静态的,永远指向某个固定的提交,不会移动。分支用于开发迭代,标签用于标记固定的发布版本。

进阶题

  1. git reset 的三种模式 soft、mixed、hard 有什么区别? 答:
    • --soft:仅移动 HEAD 指针,暂存区和工作区都不受影响,相当于把提交撤回到暂存区
    • --mixed(默认):移动 HEAD 指针,重置暂存区,工作区不变,相当于把提交撤回到工作区
    • --hard:移动 HEAD 指针,同时重置暂存区和工作区,所有修改彻底丢失,风险最高
  2. git pullgit fetch 的区别是什么? 答:git fetch 只会把远程仓库的最新代码拉取到本地仓库,不会自动合并到当前分支,可以先查看改动再决定是否合并,更安全;git pull 等价于 git fetch + git merge,拉取后自动合并到当前分支,可能会意外产生合并冲突。
  3. 什么是合并冲突?如何解决? 答:当两个分支修改了同一个文件的同一行内容,Git 无法自动判断保留哪份代码,就会产生合并冲突。解决步骤:
    1. 执行 git status 定位冲突文件
    2. 打开冲突文件,找到 <<<<<<<=======>>>>>>> 标记的冲突区域
    3. 人工协商修改,保留正确的代码,删除所有冲突标记
    4. 重新执行 git addgit commit 完成合并
  4. git mergegit rebase 有什么区别? 答:
    • merge:保留完整的提交历史,会生成一个新的合并提交,历史记录呈分叉网状,能清晰看到分支来源,不会改写历史
    • rebase(变基):将当前分支的提交 "平移" 到目标分支的最新提交之后,历史记录是一条直线,更整洁,但会改写提交历史
    • 行业规范:公共主干分支禁止使用 rebase,个人功能分支可用于整理提交记录
  5. 说说你对 DevOps 和 CI/CD 的理解,以及 Git 在其中的作用。 答:DevOps 是打通开发与运维的协作理念,目标是提升软件交付效率,同时保障生产稳定性。CI/CD 是 DevOps 的核心落地流程,通过自动化流水线实现代码的集成、测试与部署。Git 是 CI/CD 的基础底座:代码提交到 Git 仓库后会自动触发流水线,执行构建、测试、部署;所有版本迭代、发布回滚都以 Git 仓库为唯一可信源。

八、核心重点划记

  1. 必背概念:Git 分布式特性、四区流转模型、DevOps 与 CI/CD 定义
  2. 高频命令git statusgit addgit commitgit loggit resetgit branchgit checkoutgit mergegit pushgit pullgit reflog
  3. 面试必考点
    • Git 与 SVN 的核心区别
    • git reset 三种模式的差异
    • git pullgit fetch 的差异
    • mergerebase 的差异与使用规范
    • 合并冲突的解决流程
    • 标签与分支的区别
相关推荐
中科三方2 小时前
DNS解析中的“委派“是什么意思?如何正确配置NS记录?
git·github·dns解析
OPEN-F2 小时前
Python进阶教程:Git版本控制与团队协作
git·python·elasticsearch
深念Y4 小时前
Fork 仓库瘦身指南:从 90MB 到 11MB
git·github·仓库·历史·瘦身·fork·上游
叫我少年4 小时前
Git SSH 配置:从生成密钥到远程连接
git·后端
阿火~13 小时前
Git 项目配置与推送完整指南
git
j7~16 小时前
【Git】《Git 系列指南(二):Git基本操作与 reset 三种模式》
运维·git·git安装·git基本操作·git配置·创建git仓库·git reset三种模式
多加点辣也没关系16 小时前
Git - 的安装与使用
大数据·git
帅次16 小时前
Git 常用命令汇总
git·软件工程·开发工具·版本控制·git教程·代码管理·git命令
陈皮波比茶16 小时前
git学习
git·学习