跳到主要内容
🔍
0.3.2已发布beginner · 约 2 课时 · P0

基础命令 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。

① 学习目标

  1. 按 init → status → add → commit → log 完成一次标准提交循环,并说出每一步的作用;
  2. git status 读懂"未跟踪 / 已暂存 / 已修改未暂存"三种状态;
  3. git log --onelinegit log -1 -p 查看提交历史与某次提交的补丁;
  4. git diff 查看工作区与暂存区的差异,理解 add 前后 diff 的不同;
  5. 区分 git checkout -- <文件>(丢弃工作区改动)与 git reset --soft/--mixed/--hard(回退提交)的适用场景与危险等级;
  6. 按"类型: 描述"的格式预告写好提交消息(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 CRLFWindows 换行符自动转换提示正常提示,不影响提交;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,最可能的原因是?(单选)

    ◌ 未作答

⑨ 章节测验

章节测验

5 题题库 · 随机抽 5 题 · 及格线 60 分 · 前端判分(学习自测)
开始测验 →

⑩ 实战任务

实践任务

给环境笔记仓库完成 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)

把本章技能迁移到 LinuxMac

环节WindowsLinuxMac
全部 git 命令一致一致一致
创建/追加文件Set-Content -Encoding UTF8 / Add-Contentecho "..." > 文件 / >> 文件同 Linux
引号习惯PowerShell 单双引号语义不同bash 双引号内可展开变量同 Linux
换行符CRLF(git 提交时按配置转换)LFLF

不变的:四区模型、提交流程、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 为实测值
小练习 / 章节测验 / 实践任务 / 面试问题 / 延伸阅读补充原资料该章无成体系练习,全部新编