撤销错误更改并保留后续工作

GitBeginner
立即练习

介绍

Fieldnotes 举办小型工作坊和花园漫步活动。一次已发布的更新意外暂停了 Clay & Coffee 的报名。之后的一次有效更新又加入了 Sunset Walk。团队希望恢复报名,同时保留这个新活动和所有现有预约。

你将先在正常的工作坊中体验预约和票据交付。然后检查实际 Git 历史,通过一个新的修正提交撤销较早的错误更改,发布它,并测试一次真实预约。回退整个网站会丢失有用的工作。

你应了解基本的终端目录切换、提交、分支和简单的日志/差异查看;建议先完成上一门团队合并课程。准备好的 Workspace 和 Event Desk 标签页是所需的全部入口。这些是真实的 Git 仓库和 HTTP 应用,运行在一台教学机器上。本场景的网站直接读取共享 main,不讲授托管部署流水线。所有身份和活动均为合成数据。45 分钟的时长为作者估计。

体验预约服务并定位错误更新

本步骤中,你将体验正常预约,观察故障工作坊,并辨认历史中哪次更新造成了故障、哪些后续工作值得保留。

打开 Event Desk 标签页。在工作坊列表中找到 Postcard Studio,点击它的 View workshop 链接。这个正常的工作坊会显示 Save your seat、Full name 字段和 Reserve a place。输入 Alex Morgan 或另一个示例姓名,然后点击一次 Reserve a place。

确认页应显示 **You're on the list.**,以及 Postcard Studio、Studio Two 和 EUR 10.00。点击 Download ticket。通过浏览器的下载列表打开 .txt 文件。其中必须包含相同的工作坊、姓名、会合地点和总价。预约编号根据你的真实预约生成,因此会有所不同。这就是受影响的工作坊也应提供的正常、可用结果。

点击页面顶部的 All workshops。通过 View workshop 链接打开 Clay & Coffee。预期的初始问题是显示 Registration is paused,且没有预约表单。现有预约仍然有效;不要为了修复报名设置而删除它们。

再次使用顶部的 All workshops,打开 Sunset Walk。该活动必须仍然可用,信息为 15 Nov 2026、16:00、East Gate 和 EUR 6.00。这个较新的页面是应保留的有效工作,不属于故障。

切换到 Workspace 标签页。首先进入编辑仓库:

cd /home/labex/project/event-desk/editor

cd 改变当前终端的目录。如果路径拼错,可使用 pwd 打印当前目录、使用 ls 列出内容,然后重新执行上面的完整 cd 命令。普通的目录切换错误不需要重置 VM。

设置仅适用于此仓库的作者身份。--local 将设置保存在本地;引号将含空格的姓名作为一个整体。以下是合成的示例值,你也可以自行选择:

git config --local user.name "Event Editor"
git config --local user.email "events@example.com"

应用将预约保存在编辑仓库之外。其 JSON 文件使用带引号的字段名,后面跟冒号和值;姓名和工作坊标识符是文本,价格则以整数分存储。.. 表示父目录,因此下面的只读命令可以在不离开编辑目录的情况下,打印旁边的预约文件:

cat ../bookings.json

找到原有的 Casey Lane 和 Sam Rivera 记录,以及你新建的 Postcard Studio 预约。保持这些记录不变。Git 将修正受版本控制的活动设置,不会回退预约集合。

读取提交历史。--no-pager 直接打印输出,而不打开可滚动的查看器;--oneline 为每个提交显示一行简短信息;--decorate 标记分支指针和标签:

git --no-pager log --oneline --decorate

最新条目为 Add the Sunset Walk event,之后依次是 Pause Clay and Coffee registrations 和 Open the Fieldnotes event desk。具体提交 ID 会不同。预先准备的标签 incident-start 是标记你接手版本的固定书签。与 main 不同,它不会在创建新提交时移动。请保持该书签不变。

查看书签所指的最新提交更改了什么。show 显示选定提交的信息和补丁:

git --no-pager show incident-start

它加入了 events/sunset-walk.json。这是需要保留的新活动。应撤销的是较早的暂停报名更改,而不是这次新增。检查点会确认你实际新建的参考预约和票据,不会将现有示例预约当作你的新成果。

添加修正并保留后续工作

本步骤中,你将识别错误的增量更改,并在接手的末端提交之后新建一个提交,仅逆转这一更改。

留在 Workspace 中,目录为 /home/labex/project/event-desk/editor。版本表达式可以指定祖先,而无需检出它或移动分支。incident-start~1 表示固定书签之前的一个父提交;incident-start~2 表示往前两个父提交。读取中间的提交:

git --no-pager show incident-start~1

其补丁将 registration_open 从 true 改为 false,所在文件为 events/clay-and-coffee.json。这个布尔设置允许或暂停新报名。capacity 是工作坊的正数名额上限,也应保持可用。未改变的 price_cents 值 1800 表示 EUR 18.00。

读取原来的活动快照。冒号连接版本与文件路径,因此以下表达式选择书签之前两个父提交中的文件:

git --no-pager show incident-start~2:events/clay-and-coffee.json

原来的设置开放报名,容量为 12。将整个网站恢复到那个较旧版本,也会移除 Sunset Walk。revert 则计算某个选定提交更改的逆向更改,并在当前分支上记录新的修正。原来的错误提交仍保留在历史中,之后的有效提交也会保留。

修正前检查工作区状态。--short 提供简洁的已更改文件列表;准备好的仓库应没有输出:

git status --short

现在撤销已识别的错误提交。--no-edit 接受 Git 生成的修正信息,避免打开编辑器。即使分支向前推进,固定书签也能保持这个目标稳定:

git revert --no-edit incident-start~1

预期会产生以 Revert "Pause Clay and Coffee registrations" 开头的新提交,且只更改一个文件。你的作者身份和提交 ID 可以不同。

通过再次运行同一条固定书签命令,练习辨认已经完成的操作。此次重复预期会返回非零状态,并显示 nothing to commit, working tree clean。 单独运行,随后继续:

git revert --no-edit incident-start~1

在这个预先准备的、已应用更改的场景中,没有待解决的未完成 revert。应检查历史和状态,而不是人为创建一个空的修正提交:

git --no-pager log --oneline --decorate
git status --short

在原来的 Sunset Walk、暂停报名和初始提交之上,应恰好只有一个新的修正,且没有工作区更改。incident-start 书签仍指向接手的版本。这也避免了将会移动的 HEAD 与固定的事件参考点混淆。

审阅确切的修正。diff 对比两个指定快照。HEAD 是当前检出的提交;-- 将版本与后面的文件路径分开:

git --no-pager diff incident-start HEAD -- events/clay-and-coffee.json

预期只有逆向更改,即从 false 变为 true。确认较新的活动与接手版本之间没有差异:

git --no-pager diff incident-start HEAD -- events/sunset-walk.json

Sunset Walk 的对比预期没有输出。现在,你已完成一个范围集中的本地修正,同时保留了后续工作。

切换到 Event Desk,点击顶部的 All workshops,再次打开 Clay & Coffee。它仍显示 Registration is paused。这是预期情况:编辑仓库中的提交在本地,而网站读取的是共享仓库。下一步会发布它。此处的检查点评估本地修正提交及文件保留情况。

发布并测试修复后的报名

本步骤中,你将把修正交付到共享 main,在恢复的工作坊中创建真实预约,并检查较新的活动和现有预约是否完整保留。

切换到 Workspace,仍位于 /home/labex/project/event-desk/editor。origin 是预先配置的远程仓库名称,指向 /home/labex/project/event-desk/shared.git。这是一个保存共享历史、不含可编辑工作副本的本地裸仓库。push origin main 将本地 main 发送到该目标:

git push origin main

预期会看到 main -> main,且没有拒绝信息。新提交接在接手的末端提交之后,因此这次正常推送会保留每个已发布提交。场景中没有后台贡献者。如果尝试操作时被拒绝,请检查实际历史;通过强制替换而丢失原始工作,不符合任务要求。

查看交付后的指针:

git --no-pager log --oneline --decorate

本地 main 和 origin/main 现在都指向新的修正提交。原来的事件书签和所有较早的信息仍保留在它下方。

切换到 Event Desk。点击页面顶部的 All workshops,然后打开 Clay & Coffee。现在会显示 Save your seat、Full name 和 Reserve a place。输入姓名前,检查未更改的日期、会合地点和 EUR 18.00 价格。

恢复后的工作坊显示真实的预约表单。

请查看工作坊标题和右侧表单;窄屏中,表单位于活动详情下方。剩余名额反映实际预约情况,因此数量可能与示例不同。

输入 Jamie Chen 或另一个示例全名,点击一次 Reserve a place。确认页应显示 **You're on the list.**,以及 Clay & Coffee、14 Nov 2026、14:00、The Pottery Room、一个名额和 EUR 18.00。

真实预约确认页提供可下载的票据。

点击 Download ticket,从浏览器下载列表中打开生成的 .txt 文件,将其中的预约编号、工作坊、日期、时间、会合地点、姓名、名额数量和总价与确认页对比。编号是为你的预约生成的,不是要从截图中复制的值。

使用顶部的 All workshops 重新打开 Sunset Walk。完整页面必须仍显示 15 Nov 2026、16:00、East Gate 和 EUR 6.00。Postcard Studio 在实际剩余容量允许的情况下也必须仍可使用。

切换到 Workspace,再次读取预约集合:

cat ../bookings.json

两条原始记录和之前的 Postcard Studio 预约仍保留,新的 Clay & Coffee 预约已添加。你修正了受版本控制的活动,而没有回退预约数据。

最后检查工作区状态:

git status --short

不应再有已跟踪的更改。如果你创建了未跟踪的个人笔记,可以保留;不要在网站中加入额外的已跟踪文件。检查点核验实际历史、共享发布、完整的在线页面、保留的记录及真实票据内容。

总结

你通过一次正常预约确定了预期的业务结果,将报名故障追溯到较早的提交,并使用 git revert 添加了范围集中的修正。新活动、原始历史和现有预约均完整保留。

正常推送后,共享网站接受了新预约,并交付了包含正确活动和价格的真实票据。独立挑战将更换错误设置,并包含两个较晚的有效提交,因此选择修正目标前应先检查接手的历史。