Git 核心概念与安装
理解 Git 分布式版本控制模型与四区流转,完成本机安装与首次身份配置
- 来源
- 补充
- 更新
标记说明:【来源】来自上传资料 · 【补充】课程新编 · 【纠错】按勘误表修正 · 【更新】过时内容已现代化 · 【待确认】无法可靠还原
完成标准(本章)
- 📖 已阅读:滚动 ≥ 80% 且有效阅读 ≥ 120 秒
- ✏️ 已练习:小练习正确率 ≥ 60%
- 📝 已通过测验:分数 ≥ 60 分
- 🛠️ 已掌握还需完成实践任务
0.3.1 Git 核心概念与安装
本章来源:版本控制意义、分布式模型、四区与快照、SHA-1 来自《第一阶段讲义》1.1/1.3 节【来源】,经重新组织表述;默认分支名与 SHA-256 迁移为【更新】说明;安装验证命令、本机实验、通俗解释与全部练习为新编【补充】。平台适用性 universal。
① 学习目标
- 说出版本控制解决什么问题,以及 Git 与"网盘备份"的本质区别;
- 画出 工作区 → 暂存区 → 版本库 → 远程仓库 的四区流转图;
- 说明快照与 SHA-1 哈希的作用,并知道 Git 正在向 SHA-256 过渡;
- 独立完成本机安装(或确认已安装)与首次提交身份配置;
- 用
git init建立自己的练习目录并完成第一次提交(实践任务)。
② 前置知识
- 建议:0.2.4(命令行基本操作:目录切换、运行程序);无硬性前置。
③ 核心概念【来源】
| 概念 | 说明 |
|---|---|
| 版本控制 | 记录每次修改的历史,可回退、可对比、可协作;解决"改坏了回不去/多人改同一文件"问题 |
| 分布式 | 每个克隆都是完整仓库(含全部历史),离线可提交;集中式(如 SVN)提交必须联网到中央服务器 |
| 四区模型 | 工作区(你的目录)→ git add → 暂存区(index)→ git commit → 版本库(.git)→ git push → 远程仓库 |
| 快照 | Git 记录的是每次提交时整棵目录树的快照,未改动的文件只存一个引用,不重复存储 |
| SHA-1 | 对象内容经 SHA-1 哈希命名(如 4c979c7...),内容寻址 + 防篡改;【更新】git 2.29+ 已提供试验性的 SHA-256 仓库格式,官方在推进迁移,学习时知道即可 |
| 默认分支 | **【更新】**新版 git 的 git init 默认分支名为 main(老版本为 master),可用 git init -b 名字 指定 |
④ 通俗解释【补充】
把 Git 想象成一家快递仓库:
- 工作区是你的办公桌——文件随便改;
- 暂存区是打包台——
git add就是把要发货的文件放上打包台,你决定哪些改动进入这次提交; - 版本库是仓库货架——
git commit把打包台的东西装箱上架,每箱都贴一张"全店照片"(快照)和编号(哈希),随时可以按编号找回任何一次状态; - 远程仓库是异地总仓——
git push把货架同步过去,换台电脑git clone把整个货架搬回来。
这就是为什么误删文件不用怕:货架上有每一次的"全店照片"。
⑤ 示例代码
代码示例与验证记录
- examples/git-basics-commands.txtGit 最小命令清单(安装验证→身份配置→init→首次提交)✓ 已实测(git 2.53.0.windows.2 / Windows 11, 2026-08-15)编译:
按文件内顺序在终端逐行执行适用环境:LinuxWindows(MinGW)macOS展开预期输出(实测)
git version 2.53.0.windows.2 Initialized empty Git repository in <你的目录>/.git/ ?? notes.txt (add 前:未跟踪) A notes.txt (add 后:已暂存) [main (root-commit) 4c979c7] init: 学习笔记目录 4c979c7 init: 学习笔记目录
差异说明:哈希值(4c979c7)每次不同;默认分支名 main(老版本 git 可能显示 master);本输出为 git 2.53.0 / Windows 11 本机实测
完整源码见 /code 代码示例页
⑥ 编译与运行方法
本章无编译步骤:命令在终端逐行执行(Windows PowerShell/CMD 与 Linux bash 命令相同)。建议先看 ⑦ 常见错误再动手——第一次 commit 大概率会遇到身份配置报错。
⑦ 常见错误
| 症状 | 原因 | 解决 |
|---|---|---|
Please tell me who you are(commit 时报错) | 未配置提交身份 user.name/user.email | git config user.name "你的名字" 与 git config user.email "you@example.com"(本机实验已复现并解决) |
| 提示"不是 git 仓库"(not a git repository) | 当前目录不是仓库,或 init 建错了目录 | cd 到仓库目录;确认 .git 子目录存在 |
| 默认分支显示 master 而资料说 main | 旧版本 git 的默认值 | 用 git init -b main,或设置 git config --global init.defaultBranch main |
警告 LF will be replaced by CRLF | Windows 换行符与仓库内换行符的自动转换提示 | 无碍提交,属正常警告;细节在 0.3.5 展开 |
| 中文文件名/路径显示乱码 | 终端代码页与文件名编码不一致 | 路径尽量用英文;终端 chcp 65001(了解即可) |
⑧ 小练习
小练习
学习自测:提交后才显示答案与解析(前端判分,不作为正式考试)ex-0-3-1-1.执行 git add 后,文件改动进入了哪个区域?(单选)
◌ 未作答ex-0-3-1-2.想把刚修改的文件记录成一次提交,正确顺序是?(单选)
◌ 未作答ex-0-3-1-3.首次 git commit 报错 Please tell me who you are,原因是?(单选)
◌ 未作答
⑨ 章节测验
章节测验
⑩ 实战任务
实践任务
建立自己的练习仓库并画出四区流转图
用 git init 建立"学习笔记"练习仓库,配置提交身份并完成第一次提交; 同时画出工作区→暂存区→版本库→远程仓库的四区流转图(标注 add/commit/push 三条流转命令)。
输入与输出
无程序输入输出。交付物:① 本地练习仓库(git log 至少 1 条提交);② 四区流转图(手绘或电子版均可)。
功能要求
- 在专用目录执行 git init 建立仓库
- 配置本地提交身份(user.name / user.email,本项目级即可)
- 放入至少 1 个文件(如环境笔记),git add 后 git commit
- 画出四区流转图并标注 git add / git commit / git push 所在箭头
限制条件
- 实验只用本地仓库,不创建任何远程仓库
- 路径与文件名尽量使用英文,避免中文编码干扰
验收步骤(自检清单 0/4)
验收标准
- git log --oneline 至少输出 1 条提交(验收步骤 3)
- git config --local --list 能看到 user.name 与 user.email(验收步骤 1)
- 四区流转图包含四个区域且 add/commit/push 标注正确(验收步骤 4)
常见失败原因
- 忘记配置身份就 commit(报 Please tell me who you are)
- 在仓库目录之外运行 git 命令(提示 not a git repository)
- 四区流转图漏掉暂存区
可选扩展
- 用 git diff 观察 add 前后的差异
- 用 git log --stat 查看每次提交改动了哪些文件
完成必要清单后才能计入"已完成实践"(学习状态自动推导,不提供一键完成)
⑪ 面试问题
面试问题
项目里为什么要用版本控制工具?它解决了什么问题?高频C/C++ · easy
要点:记录每次修改的历史,支持回退、对比、协作与发布,避免"改坏了回不去"和多人互相覆盖。
核心是"可追溯、可回退、可协作":每次提交都有快照和编号,任何历史版本都能找回与对比 (谁、何时、改了什么);多人并行开发时按分支隔离、合并冲突显式化,而不是互相覆盖文件; 配合远程仓库还能异地备份与代码评审。对比"网盘备份":网盘只能存"某一时刻的整份文件", 无法回答"第 3 天改了什么、为什么改",也没有分支/合并/评审这些工程语义。
追问:- 追问:没有版本控制的团队一般会遇到什么典型事故?
评分要点:- 可追溯/可回退/可协作三点
- 与网盘备份的本质区别
工作区、暂存区、版本库有什么区别?git add 和 git commit 各自做了什么?高频C/C++ · medium
要点:工作区是磁盘上的目录;暂存区是下一次提交的候选清单;版本库保存全部历史提交。add 把改动放入暂存区,commit 把暂存区内容固化为一版快照。
工作区(working tree)是正在编辑的目录;暂存区(index/staging area)记录"下一次提交将包含哪些改动"; 版本库(repository,.git 目录)保存所有历史提交对象与引用。git add 把文件改动登记进暂存区 (可以先 add 一部分),git commit 把暂存区的内容固化为一次带哈希编号的快照提交。 正因为有暂存区,才能做到"只提交改动的一部分、拆成多个语义清晰的提交"。
追问:- 追问:git commit 之后暂存区会变空吗?(不会,提交的就是暂存区内容本身)
- 追问:如何跳过暂存区直接提交已跟踪文件的改动?(git commit -am)
评分要点:- 三区定义准确
- add/commit 职责区分
- 提到"部分提交"能力
Git 是分布式版本控制,这对实际开发意味着什么?和 SVN 相比有什么优势?高频C/C++ · medium
要点:每个克隆都是完整仓库:离线可提交、可看全部历史;操作快、不怕中央服务器故障;协作靠推拉而不是唯一中央库。
分布式意味着每个开发者的克隆都包含完整历史,断网时依然可以提交、建分支、看日志, 联网后再 push 同步;日常操作(log/diff/commit)不依赖服务器,速度快;中央服务器故障 不阻塞本地开发,任何完整克隆都能恢复仓库。SVN 等集中式工具提交必须联网,历史在服务器上。 代价:模型多一个"推/拉"环节,概念稍多(这正是 0.3.1 要学的四区模型)。
追问:- 追问:分布式是否意味着不需要服务器?(不,远程仓库承担备份与协作枢纽角色)
评分要点:- 离线可提交/完整历史
- 速度与容灾
- 与集中式的区别
⑫ 延伸阅读
- 《Pro Git》(官方免费书,git-scm.com/book,只引名称不复制内容);
- Git 官方文档:git-scm.com/doc;
- 本地手册:
git help <命令>(如git help commit); - 下一章预告:0.3.2 基础命令 init/add/commit——把本章的"一次提交"变成日常流水线。
迁移训练(migration training)
把本章技能迁移到 Linux 与 Mac:
| 环节 | Windows | Linux | Mac |
|---|---|---|---|
| 安装 | git-scm.com 安装器(本机 2.53.0) | sudo apt install git | Homebrew:brew install git 或 Xcode 命令行工具 |
| 命令 | 一致 | 一致 | 一致 |
| 差异 | 换行符 CRLF、路径 \ | 换行符 LF、路径 / | 同 Linux |
不变的:四区模型、全部 git 命令、.git 目录结构;要改的:安装方式与换行符行为。
内容来源映射
| 内容部分 | 资料 | 位置 | 标记 | 说明 |
|---|---|---|---|---|
| 版本控制意义、Git 分布式模型、四区模型、快照与 SHA-1 | 第一阶段讲义 | 1.1/1.3 节 | 【来源】 | 正文在原资料基础上重新组织表述,未大段复制原文 |
| 默认分支名 main 与 SHA-256 迁移说明 | 第一阶段讲义 | 1.1/1.3 节 | 【更新】 | 原资料按当时 git 版本讲解(默认 master、仅 SHA-1);正文补充"新版默认 main、git 2.29+ 试验性 SHA-256 仓库格式",核心原理表述不变 |
| 安装验证命令清单、本机实验、通俗解释(快递仓库类比) | 无 | 【补充】 | 原资料无三平台安装验证清单;命令清单与全部输出为本机实测(git 2.53.0 / Windows 11) | |
| 小练习 / 章节测验 / 实践任务 / 面试问题 / 延伸阅读 | 无 | 【补充】 | 原资料该章无成体系练习,全部新编 |