基础命令 init/add/commit 等
掌握日常提交流程 init/add/commit/status/log 与回退
- 来源
- 补充
标记说明:【来源】来自上传资料 · 【补充】课程新编 · 【纠错】按勘误表修正 · 【更新】过时内容已现代化 · 【待确认】无法可靠还原
完成标准(本章)
- 📖 已阅读:滚动 ≥ 80% 且有效阅读 ≥ 120 秒
- ✏️ 已练习:小练习正确率 ≥ 60%
- 📝 已通过测验:分数 ≥ 60 分
- 🛠️ 已掌握还需完成实践任务
0.3.2 基础命令 init/add/commit 等
本章来源:init/add/commit/config/status/log/diff 命令语义、checkout -- 文件回退与 reset 三模式概述、提交消息规范预告来自《第一阶段讲义》1.4 节【来源】,经重新组织表述;命令清单与全部练习为新编【补充】。平台适用性 universal。
① 学习目标
- 按 init → status → add → commit → log 完成一次标准提交循环,并说出每一步的作用;
- 用
git status读懂"未跟踪 / 已暂存 / 已修改未暂存"三种状态; - 用
git log --oneline与git log -1 -p查看提交历史与某次提交的补丁; - 用
git diff查看工作区与暂存区的差异,理解 add 前后 diff 的不同; - 区分
git checkout -- <文件>(丢弃工作区改动)与git reset --soft/--mixed/--hard(回退提交)的适用场景与危险等级; - 按"类型: 描述"的格式预告写好提交消息(0.3.5 完整展开)。
② 前置知识
- 必选:0.3.1(git init 与提交身份配置);本章假设身份已配置好,否则 commit 会报 Please tell me who you are。
③ 核心概念【来源】
| 命令 | 作用 | 要点 |
|---|---|---|
git init | 初始化仓库(一生一次) | 生成 .git 目录;0.3.1 已建好练习仓库 |
git status | 查看工作区与暂存区状态 | 三种状态:未跟踪(Untracked files)/ 已暂存(Changes to be committed)/ 已修改未暂存(Changes not staged for commit) |
git add <文件> | 把改动登记进暂存区 | 登记的是那一刻的内容快照,之后再改需重新 add |
git commit -m "消息" | 把暂存区固化为一次提交 | 只提交已暂存内容;-am 可跳过 add 直接提交已跟踪文件的改动(新文件仍需 add) |
git config | 仓库/全局配置 | user.name/user.email 提交身份(0.3.1 已配);--global 全局生效 |
git log | 查看提交历史 | --oneline 每条一行;-p 显示补丁;--graph 图形化;-n 限制条数 |
git diff | 对比差异 | 无参数:工作区 vs 暂存区;--cached:暂存区 vs 上次提交 |
git checkout -- <文件> | 丢弃工作区未暂存改动 | 恢复为暂存区/上次提交内容,不可恢复;新版等价命令 git restore <文件> |
git reset --soft/--mixed/--hard | 移动分支指针回退提交 | soft 保留暂存区与工作区;mixed(默认)保留工作区;hard 全部丢弃,最危险 |
④ 通俗解释【补充】
延续 0.3.1 的快递仓库类比,把日常提交看成一条流水线:
- status 是清点台账——哪些货还没打包(未跟踪)、哪些在打包台上(已暂存)、哪些改了但没上打包台(已修改未暂存);
- add 是上打包台——只登记这一瞬间的货样,之后又改的文件要重新上;
- commit 是装箱上架——打包台上的货全部封箱,贴上编号(哈希)上货架,账本(log)多一条记录;
- diff 是对账——对比"桌面上的货"和"打包台上的货"差在哪;
- reset 是从货架取回箱子——
--soft拆箱放回打包台,--mixed拆开摊回桌面,--hard连货一起扔进垃圾桶。
记不住时就问自己三个问题:货在哪?要不要上打包台?要不要封箱上架?
⑤ 示例代码
代码示例与验证记录
- examples/git-daily-commands.txtGit 日常提交流程命令清单(init→status→add→commit→log→修改→再提交)✓ 已实测(git 2.53.0.windows.2 / Windows 11, 2026-08-15)编译:
按文件内顺序在终端逐行执行(在 $env:TEMP 临时目录实验)适用环境:LinuxWindows(MinGW)macOS展开预期输出(实测)
Initialized empty Git repository in <你的目录>/.git/ On branch main Untracked files: notes.txt (add 前:未跟踪) Changes to be committed: new file: notes.txt (add 后:已暂存) [main (root-commit) 68d73f4] init: add notes.txt 68d73f4 init: add notes.txt (git log --oneline) modified: notes.txt (修改后 status:已修改未暂存) +git 学习第 2 天 (git diff 显示的新增行) [main 5527101] docs: append day2 line 5527101 docs: append day2 line 68d73f4 init: add notes.txt
差异说明:哈希值(68d73f4/5527101)与目录名每次不同;Windows PowerShell 5.1 的 Set-Content -Encoding UTF8 会写 BOM(diff 首行可见一个 BOM 字符),PowerShell 7 无 BOM,不影响提交;本输出为 git 2.53.0 / Windows 11 本机实测
完整源码见 /code 代码示例页
⑥ 编译与运行方法
本章无编译步骤:命令在终端逐行执行。请把实验放在 $env:TEMP 下的临时目录(实验后可直接删除),不要在任何远程仓库或重要目录里做回退类实验。命令三平台一致(Windows PowerShell / Linux bash / Mac zsh),仅文件创建方式不同(见迁移训练)。
⑦ 常见错误
| 症状 | 原因 | 解决 |
|---|---|---|
改了文件但 git commit -m x 提示 nothing to commit | 没有 git add,暂存区为空 | 先 git add 再 commit;已跟踪文件可用 git commit -am |
git status 显示 modified 但 git log 没有新记录 | 改动只在工作区,未提交 | 完成 add + commit 循环 |
git checkout -- <文件> 后改动找不回来 | 该命令直接丢弃未暂存改动,不可恢复 | 丢弃前先 git diff 确认;拿不准就先 commit 再回退 |
git reset --hard 执行后想反悔 | hard 模式连工作区与暂存区一起丢弃 | 只对确认不要的改动使用;不确定用 --soft;误操作可尝试 git reflog 找回 |
| commit 消息中文乱码或引号报错 | 终端编码或引号嵌套问题 | 消息用 UTF-8;PowerShell 中单双引号按需切换 |
警告 LF will be replaced by CRLF | Windows 换行符自动转换提示 | 正常提示,不影响提交;0.3.5 展开 |
⑧ 小练习
小练习
学习自测:提交后才显示答案与解析(前端判分,不作为正式考试)ex-0-3-2-1.git status 显示 Changes not staged for commit: modified: notes.txt,含义是?(单选)
◌ 未作答ex-0-3-2-2.已跟踪文件 notes.txt 的改动尚未暂存,想直接放弃这些改动、恢复成上次提交的内容,用哪个命令?(单选)
◌ 未作答ex-0-3-2-3.修改了文件后直接 git commit -m x,提示 nothing to commit,最可能的原因是?(单选)
◌ 未作答
⑨ 章节测验
章节测验
⑩ 实战任务
实践任务
给环境笔记仓库完成 10 次提交
沿用 0.2 阶段的环境笔记仓库(或新建一个本地练习仓库),用标准提交流程 (改文件 → status/diff 检查 → add → commit → log 确认)完成 10 次提交, 形成"动手前先 status、提交后看 log"的肌肉记忆。
输入与输出
无程序输入输出。交付物:本地仓库中 git log --oneline 输出至少 10 条提交。
功能要求
- 使用已有环境笔记仓库;没有则在本机专用目录 git init 新建(不创建任何远程仓库)
- 10 次提交逐次使用"类型: 描述"格式的提交消息(如 docs: 记录 MinGW 安装步骤)
- 每次提交前用 git status(或 git diff)检查将要提交的内容
- 每次提交后用 git log --oneline 确认提交成功
- 至少实验一次"改了文件不 add 直接 commit",观察并记录 nothing to commit 提示
限制条件
- 实验只用本地仓库,不创建任何远程仓库
- 提交内容可以是真实笔记/命令记录,也可以是练习用的占位文件
验收步骤(自检清单 0/4)
验收标准
- git log --oneline 输出至少 10 条提交(验收步骤 3)
- 提交消息均符合"类型: 描述"格式(抽查 10 条中的 5 条)
- 能说出 nothing to commit 的含义与解决办法(验收步骤 4)
常见失败原因
- 提交数不足 10 次就验收
- 一次 commit 塞进多个无关改动(应拆成多个语义清晰的提交)
- 忘 add 直接 commit 后误以为 git 坏了
可选扩展
- 用 git log --stat 统计 10 次提交各自改动了哪些文件
- 用 git reset --soft HEAD~1 撤销最后一次提交再重新 commit(体验回退)
完成必要清单后才能计入"已完成实践"(学习状态自动推导,不提供一键完成)
⑪ 面试问题
面试问题
git add 和 git commit 有什么区别?为什么要有暂存区?高频C/C++ · easy
要点:add 把改动登记进暂存区(下一次提交的候选清单),commit 把暂存区内容固化为一次带哈希的快照提交;暂存区让"提交什么"由开发者精细控制。
git add 把工作区文件改动的当前内容快照登记进暂存区(index);git commit 把暂存区的 内容固化为一次提交对象并移动分支指针。暂存区的价值:① 一次提交可以只包含部分改动, 把一次编辑拆成多个语义清晰的提交(改了两个 bug 就拆两次提交);② 提交前有检查点, git diff --cached 可以复核"即将提交什么";③ 配合 git diff 构成 "工作区→暂存区→版本库"的对比体系。注意 add 登记的是那一刻的内容, 之后继续修改同一文件需要重新 add。
追问:- 追问:git commit -am 是怎么回事?它等价于哪些操作?
评分要点:- add/commit 职责区分
- 暂存区的部分提交与提交前复核两个价值
- add 后继续改需重新 add
本地仓库刚 commit 了一次错误提交,如何回退?不同需求分别用什么命令?高频C/C++ · medium
要点:按需求分级:撤销提交但保留改动用 reset --soft;连暂存也撤销用 reset --mixed;提交和改动都不要用 reset --hard;只丢弃未提交的工作区改动用 restore/checkout --。
场景一:只想撤销最近一次提交、改动保留 → git reset --soft HEAD~1(分支指针回退一步, 改动留在暂存区与工作区,重新 commit 即可)。场景二:撤销提交且回到"未 add"状态 → git reset --mixed HEAD~1(默认模式,改动留在工作区)。场景三:提交连同改动都不要 → git reset --hard HEAD~1(不可恢复,最危险)。如果只是改了文件还没 add,直接 git restore 文件(旧写法 git checkout -- 文件)丢弃工作区改动。回答时务必强调: ① reset --hard 不可恢复;② 已推送的提交不要用 reset 改历史,要用 revert 生成反向提交 (revert 在 0.3.4 展开)。
追问:- 追问:git reset 和 git revert 的本质区别是什么?
- 追问:--soft/--mixed/--hard 三者分别动了哪三个区域?
评分要点:- 三级 reset 模式与影响区域
- restore/checkout -- 的适用场景
- 已推送提交用 revert 的意识
git log 有哪些常用参数?怎么查"某次提交改了哪些文件、文件改了什么"?C/C++ · easy
要点:常用:--oneline(一行摘要)、-p/--patch(补丁)、--stat(文件级统计)、--graph(分支图)、-n 数量限制、--author 过滤;查单次提交用 git show <哈希>。
最常用的组合:git log --oneline 快速浏览;git log -p 查看每次提交的完整补丁; git log --stat 查看每次提交改动的文件与增删行数;git log --graph --oneline --all 查看分支合并结构;git log -5 只看最近 5 条;git log --author=名字 过滤作者。 针对某一次提交:git show <短哈希> 一次性给出提交信息、文件列表与补丁。 延伸:git reflog 记录 HEAD 的移动轨迹,误操作(如 reset --hard 过头)时可据此找回 提交哈希;git blame 文件可逐行追溯每行的最后一次修改(1.4.x 阶段展开)。
追问:- 追问:git log 和 git reflog 的区别?
评分要点:- oneline/p/stat/graph 四参数
- git show 查单次提交
- reflog 意识
⑫ 延伸阅读
- 《Pro Git》第 2 章(记录每次更新到仓库)——只引书名不复制内容;
- 本地手册:
git help status/git help log/git help reset; - 下一章预告:0.3.3 分支与合并——提交是"点",分支把"点"连成团队协作的"线"。
迁移训练(migration training)
把本章技能迁移到 Linux 与 Mac:
| 环节 | Windows | Linux | Mac |
|---|---|---|---|
| 全部 git 命令 | 一致 | 一致 | 一致 |
| 创建/追加文件 | Set-Content -Encoding UTF8 / Add-Content | echo "..." > 文件 / >> 文件 | 同 Linux |
| 引号习惯 | PowerShell 单双引号语义不同 | bash 双引号内可展开变量 | 同 Linux |
| 换行符 | CRLF(git 提交时按配置转换) | LF | LF |
不变的:四区模型、提交流程、log/diff/reset 全部语义;要改的:文件创建命令与引号写法。
内容来源映射
| 内容部分 | 资料 | 位置 | 标记 | 说明 |
|---|---|---|---|---|
| init/add/commit/config/status/log/diff 命令语义、checkout -- 文件回退与 reset --soft/mixed/hard 概述、提交消息规范预告 | 第一阶段讲义 | 1.4 节 | 【来源】 | 正文在原资料基础上重新组织表述,未大段复制原文 |
| 日常提交流程命令清单与本机实验输出 | 无 | 【补充】 | 命令清单在 $env:TEMP 临时仓库真实执行(git 2.53.0 / Windows 11),expected_output 为实测值 | |
| 小练习 / 章节测验 / 实践任务 / 面试问题 / 延伸阅读 | 无 | 【补充】 | 原资料该章无成体系练习,全部新编 |