本节摘要:Git 给项目装上"时间机器":每次提交是一张代码快照,任何时刻都能回看、对比、回退。本节讲 Git 的心智模型——工作区、暂存区、仓库三棵树,练熟提交四连与历史三查,再用分支把"加功能"隔离在平行世界里。从本节起,轻记账的每次演进都有存档;第 6 章部署上服务器、未来与他人协作,都建立在今天的 Git 地基上。
阅读完本节,你应当能够:
没接触 Git 的人管理版本的方式是复制文件:轻记账、轻记账2、轻记账最终版、轻记账真最终版……文件名成了灾难现场,想回三天前的版本?赌运气。Git 的思路完全不同:版本不再是一份份文件拷贝,而是一串快照。仓库记住每一次提交的完整状态,回退、对比、分支全都轻巧精确。

git init # 只做一次:把当前文件夹变成 Git 仓库 git status # 随时看:哪些文件改了、哪些已暂存 git add ledger.py # 指定文件进暂存区;git add . 全部 git commit -m "重构:账目操作收编进 Ledger 类" git log --oneline # 看历史,每行一条提交 git diff # 看工作区相对上次提交改了哪些行
提交信息是写给三个月后的自己的:一行说清"这次改了什么、为什么"。"修改了一些文件"这种信息等于没写;"修复月度统计的日期方向;补 records_above 测试"才是好信息。提交的粒度也有讲究:一个提交做一件事,像写文章分段——把"类化重构"和"修 bug"混在一个提交里,将来回溯时两头都查不清。
不是所有文件都该进历史。虚拟环境文件夹体积巨大且可随时重建,测试产生的临时账本、编辑器配置各有各的本地差异,它们进了 Git 只会添乱。仓库根目录建一个忽略清单文件:
.venv/ __pycache__/ test_ledger.json export.csv
上一节留的悬念在此揭晓:.venv 不进 Git,requirements.txt 进——环境可重建,清单是重建说明书。这正是"代码与清单是资产,环境是耗材"在版本控制里的落地。
主线是稳定版,新功能别直接在主线上动工——万一改到一半要发布,半成品代码全暴露。分支给改动一个平行空间:
git branch feature/csv-export # 创建分支 git switch feature/csv-export # 切换过去 # ……在分支上正常写代码、提交若干次…… git switch main # 切回主线 git merge feature/csv-export # 把分支的成果合并回来
分支上的任何折腾都不影响主线,做完合并、删掉分支,主线只看到一次干净的合流。团队协作时每人一个分支互不打架;单人开发时,分支同样是"大改动与稳定版隔离"的护栏。轻记账的 Web 化改造(第 4 章)就值得开一个 feature 分支来做。
到目前为止 Git 都只在你电脑里——硬盘坏了,历史跟着陪葬。把仓库推送到托管平台的远程副本(GitHub、Gitee 等均可),才算真正上了保险:
git remote add origin 远程仓库地址 # 关联远程,只做一次 git push -u origin main # 推送主线并建立跟踪 git pull # 之后每次开工先拉取同步
推送这个动作还顺带解锁了协作与部署:同伴克隆你的仓库即刻获得全部历史;第 6 章的云服务器直接从远程仓库拉代码部署。日常节奏由此固定成三拍——开工先 pull,改完就 commit,告一段落就 push。单人项目里 pull 多半" Already up to date",但习惯本身是给未来团队协作预装的。
回退操作也值得认识两个:git restore 文件名 丢弃工作区未提交的改动(慎用,不可找回);git revert 提交号 生成一个"反向提交"抵消某次改动——历史不被改写,团队协作里永远优先用它而非改写历史的危险命令。
完整走一遍:
git init # 写入 .gitignore(内容见上文) git add .gitignore ledger.py requirements.txt git commit -m "初始化:v0.3 类化版本入库" git log --oneline # 输出:a1b2c3d 初始化:v0.3 类化版本入库
变式一:改一行代码后依次运行 status、diff、add、commit,把四连变成肌肉记忆。变式二:开分支加 export_csv 功能,期间切回 main 确认它没被影响,再合并——亲手体会一次"平行世界合流"。变式三:注册一个代码托管平台账号,把轻记账推上去,确认网页里能看到提交历史与每个文件的各版本内容。
工程"三件套"配齐:类、测试、Git。下一章项目正式上路——从 HTTP 原理开始,把轻记账搬进浏览器。