文件夹里出现“最终版”“最终版2”“这次真的最终版”,说明你需要保存的其实是变化的历史。Git 可以记录每次修改、比较前后差异,并在需要时用一个新的提交撤销旧修改。本篇用一个独立练习仓库走完这个过程,不涉及远程账号或线上部署。
开始前:隔离练习目录
先确认电脑已经安装 Git。以下命令按 macOS、Linux 或 Windows Git Bash 的 shell 写法演示,需要支持 git init -b 的 Git 版本。请在一个新建的空目录练习,不要在已有项目或生产目录照搬初始化操作。
git --version
mkdir git-notebook-demo
cd git-notebook-demo
git init -b main如果 Git 提示缺少提交身份,请配置这个练习仓库的姓名和邮箱。下面邮箱是教学占位值;正式发布提交前应换成你愿意公开的身份信息。没有加 --global,因此只影响当前仓库。
git config user.name "学习者"
git config user.email "learner@example.com"
printf '# 学习记录\n' > README.md
git status
git add README.md
git diff --staged
git commit -m "docs: 创建学习记录"理解工作区、暂存区与提交
编辑文件发生在工作区;git add 将准备提交的内容放入暂存区;git commit 保存暂存区的快照。一个文件还可能在暂存后继续被修改,所以提交前既要看 git diff,也要看 git diff --staged。前者比较未暂存修改,后者显示这次提交将带走什么。
第一版先用明确的文件名添加内容,而不是无差别加入整个目录。账号密钥、访问令牌、真实客户资料和本地配置不应放入练习提交。误把文件加入暂存区时,可在已有首次提交后使用 git restore --staged 文件名 取消暂存,它不会删除工作区的改动。
在分支上完成一个小修改
分支适合把一项工作暂时独立出来。下面新增一条计划、查看差异并提交,再回到 main 合并。--no-ff 在这个练习中用于保留一个明确的合并提交;团队项目应遵守自己的合并约定。
git switch -c feature/weekly-plan
printf '\n本周计划:完成一个响应式页面。\n' >> README.md
git diff
git add README.md
git diff --staged
git commit -m "docs: 增加本周学习计划"
git switch main
git merge --no-ff feature/weekly-plan -m "merge: 合并学习计划"
git log --oneline --graph --all合并前先看 git status,确认没有未处理的工作区修改。如果练习中出现冲突,不要直接覆盖文件:打开冲突文件,理解双方内容,保留正确结果,再暂存并完成合并。不确定结果时,可先用 git merge --abort 退出尚未完成的合并。
写错了内容,怎样留下可追溯的撤销记录
先制造一个独立的错误提交,再使用 revert 生成反向提交。它会保留历史,让后来的人看见“做过什么,又撤销了什么”。这与把分支指针强行退回旧位置不同,也不需要强制推送。
printf '\n错误练习:这里不应该出现。\n' >> README.md
git add README.md
git commit -m "docs: 添加用于撤销的练习内容"
git revert --no-edit HEAD
git log --oneline -5
cat README.md此处 HEAD 必须仍指向刚刚新增的普通错误提交。不要把这条命令不加判断地套在合并提交上:撤销合并涉及父提交选择,需要单独理解。若 revert 发生冲突,可处理冲突后继续,或使用 git revert --abort 放弃当前撤销过程。
验收与下一步
- 最终 README 应包含标题和本周计划,不再含错误练习那一行。
git status应显示工作区干净。- 提交历史应同时保留错误提交与随后产生的撤销提交。
- 能说清楚一次提交只解决了哪个具体问题,而不是只有“修改一下”这样的说明。
熟悉本地流程后,再练习远程仓库、拉取与推送。先在自己的测试仓库操作,并理解远程分支与本地分支的关系;不要为了消除报错直接执行强制推送。
继续查阅
撤销提交的行为与限制参见 Git 官方文档:git revert;分支切换参见 Git 官方文档:git switch。本文采用可以复现的本地练习,不要求注册任何服务。