介绍
DAYLIGHT CAFE 正在更正馥芮白的价格。价格更新及配套的外带菜单下载文件已拟好,但同一个菜单文件中还混有一则未完成的季节饮品公告。私人的试饮笔记也不能进入公开提交。
你将准确选择哪些内容进入一次 Git 提交,同时保留其余工作。你需要具备基本的终端目录切换能力,并熟悉简单的文本文件。本实验会解释 Git 的工作区、暂存区和提交快照;不需要网站编程经验或 GitHub 账号。
在 Workspace 中执行命令,在 Working Copy 中查看正在编辑的文件,在 Committed Menu 中查看当前提交实际保存的文件。这两个页面读取真实内容,不会补齐缺失文件。咖啡馆、插图和菜单均为原创教学素材。界面标签和运行输出保留英文。
查看两个菜单版本
本步骤中,你将对比公开菜单与准备好的工作文件,然后设置仅对当前仓库生效的作者身份。
打开 Committed Menu。馥芮白的价格为 EUR 3.80,季节饮品公告栏说明饮品仍在筹划中。点击 Download takeaway menu,打开实际的文本下载文件。该文件中列出的价格也是 EUR 3.80。
切换到 Working Copy。馥芮白的价格已变为 EUR 4.20,但季节饮品公告栏中还出现了一则私人试饮公告。获准发布的只有价格更正。两个公开菜单文件都必须使用 EUR 4.20;季节饮品草稿和 tasting-notes.txt 必须保留在你的机器上,不能进入提交。
Working Copy 中仍能看到未完成的季节饮品公告:

切换到 Workspace。它打开时位于准备好的 Git 仓库 /home/labex/project/daylight-menu 中。使用 pwd 打印当前目录:
pwd
如果你已切换到其他目录,请使用完整路径返回:
cd /home/labex/project/daylight-menu
仓库保存项目的快照和历史记录。工作区是你可以编辑的文件集合。git status --short 概括这些文件与上一次提交及暂存区之间的差异。--short 表示使用简洁的显示格式:
git status --short
你应看到已修改的 menu.txt 和 menu-download.txt,以及 ?? tasting-notes.txt。?? 表示笔记尚未被跟踪:Git 还没有将它加入快照。文件被修改,并不意味着它会自动进入提交。
Git 会在每次提交中记录作者姓名和邮箱。git config --local 仅在当前仓库中保存设置。引号将姓名中的两个单词作为一个整体。请使用以下虚构的教学身份:
git config --local user.name "Alex Morgan"
git config --local user.email "alex@example.test"
读取设置值以确认:
git config --local user.name
git config --local user.email
预期结果是 Alex Morgan 和 alex@example.test。全局 Git 身份和外部账号都不会改变。本实验后续所有命令都应在这个仓库中执行。
仅暂存获准发布的价格更改块
本步骤中,你将把获准发布的价格更正放入暂存区,同时排除季节饮品草稿。
留在 Workspace 中。提交是一份已保存的快照。HEAD 指向当前提交。暂存区也称为索引,保存着下一次提交将记录的确切快照。暂存会将选定内容复制到索引中,不会删除其他工作区更改。
--no-pager 是一个 Git 选项,用于直接打印输出,而不打开交互式查看器。下面的对比命令都使用该选项。如果之前的 Git 命令已打开显示 (END) 的查看器,请按 q 返回 shell;不要在查看器中输入下一条命令。
git --no-pager diff 对比工作区与索引。分隔符 -- 表示其后的参数是文件名,而不是 Git 选项:
git --no-pager diff -- menu.txt
找出两组更改,它们称为更改块(hunk)。以 - 开头的行是原来的内容,以 + 开头的行是拟采用的内容。第一个更改块将馥芮白价格从 3.80 改为 4.20,第二个更改块修改季节饮品公告。@@ 行标识每个更改块的位置,并不是菜单内容。
git add --patch 会询问你要将哪些更改块复制到索引中。它会改变暂存快照,而完整的工作文件保持原样:
git add --patch menu.txt
显示馥芮白价格更改块时,输入 y 并按 Enter 将其暂存。显示季节饮品公告栏的更改块时,输入 n 并按 Enter,使其保持未暂存状态。每次回答前都先阅读显示的内容;y 表示是,n 表示否。
现在检查实际已暂存的差异。--cached 表示对比 HEAD 与索引:
git --no-pager diff --cached -- menu.txt
这里只应出现价格更正。再对比仍未暂存的内容:
git --no-pager diff -- menu.txt
这里只应出现季节饮品公告。目前还没有提交任何内容。
如果选错了更改块,可使用 git restore --staged,从 HEAD 恢复这个文件的索引条目。--staged 只作用于索引,因此价格更正和草稿仍会保留在工作文件中:
git restore --staged menu.txt
然后重新执行 git add --patch menu.txt,选择价格更改块,再次检查两种差异。提交前使用这种恢复方式是安全的,因为它不会丢弃你的工作文件。
加入配套的外带菜单下载文件
本步骤中,你将加入配套的下载文件,使下一次提交包含完整的更正,并审阅每个已暂存的文件。
留在 Workspace 中。咖啡馆既提供菜单页面,也提供外带菜单。如果只发布其中一处更正,就会出现两个不同的价格。cat 用于打印一个小型文本文件:
cat menu-download.txt
其中已经包含 Flat white: EUR 4.20。这个文件只包含获准发布的更正,因此可以暂存整个文件:
git add menu-download.txt
普通的 git add 命令会暂存指定文件。不要暂存整个目录:其中还包含私人笔记和未完成的公告。
--name-only 只列出差异中的路径,不显示内容。查看已暂存的路径:
git --no-pager diff --cached --name-only
列表中必须只有 menu-download.txt 和 menu.txt。然后审阅这两个文件完整的暂存差异:
git --no-pager diff --cached
两个公开版本的价格都应为 4.20。季节饮品公告和试饮笔记不应出现。
若要读取完整的已暂存文件,而不只是差异,可以使用 git --no-pager show 并指定 :menu.txt。开头的冒号表示选择索引条目:
git --no-pager show :menu.txt
已暂存的菜单将 EUR 4.20 与原来的季节饮品文字 Seasonal drinks are being planned. 组合在一起。这个组合证明索引可以与工作区不同。
如果不小心暂存了私人笔记,可以取消暂存,而不删除文件:
git restore --staged tasting-notes.txt
只有笔记已被暂存时才执行这条恢复命令;否则,Git 可能会正确地报告无法识别这个未跟踪的路径。继续前,再次检查 git --no-pager diff --cached。文件名拼错不会改变任何内容:使用 git status --short 找到实际名称,然后重新执行原本要运行的命令。
提交并查看实际公开结果
本步骤中,你将记录一次内容集中的提交,并确认未完成的工作在提交后仍然保留。
留在 Workspace 中。git commit 会将整个索引记录为一份新快照。-m 提供简短的说明信息;引号将这条信息作为一个整体:
git commit -m "Correct the flat white price"
Git 会报告一个新提交和两个已更改的文件。提交哈希会有所不同。提交信息描述了所做的工作,但真正重要的是快照的实际内容。
git --no-pager show 可以直接读取提交中的文件。HEAD:menu.txt 表示当前提交中保存的、名为 menu.txt 的文件:
git --no-pager show HEAD:menu.txt
git --no-pager show HEAD:menu-download.txt
两者都显示获准发布的价格 4.20。提交中的季节饮品公告仍说明饮品正在筹划中。
检查剩余工作:
git status --short
预期会看到 M menu.txt 和 ?? tasting-notes.txt。状态的两列分别表示左侧的已暂存更改,以及右侧的未暂存工作区更改。第二列中的 M 表示季节饮品草稿仍未暂存。笔记仍未被跟踪。对于本任务,状态为空反而不正确:那意味着必须保留的未完成工作已消失,或进入了某次提交。
读取剩余差异和笔记:
git --no-pager diff -- menu.txt
cat tasting-notes.txt
切换到 Committed Menu 并刷新页面。确认馥芮白价格为 EUR 4.20,且季节饮品公告栏保留原来的公开文字。再次下载外带菜单,确认真实文件中的价格相同。切换到 Working Copy:私人试饮草稿在那里仍然可见。
提交后的菜单显示获准发布的价格和原来的公开季节饮品公告:

现在,你已经完成一次完整的公开价格更正,同时保留了其他尚未完成的工作。不需要推送;本项目讲解的是本地提交的内容边界。远程协作属于另一个项目。
总结
你区分了工作文件、索引和提交,选择了一个更改块,加入了配套的下载文件,并验证了实际提交的菜单。季节饮品草稿和私人笔记仍保留在提交之外。有用的提交应包含完整的预期更改,而不是所有碰巧被修改的文件。



