3.3 版本控制 Git 基础


3.3 版本控制 Git 基础

本节摘要:Git 给项目装上"时间机器":每次提交是一张代码快照,任何时刻都能回看、对比、回退。本节讲 Git 的心智模型——工作区、暂存区、仓库三棵树,练熟提交四连与历史三查,再用分支把"加功能"隔离在平行世界里。从本节起,轻记账的每次演进都有存档;第 6 章部署上服务器、未来与他人协作,都建立在今天的 Git 地基上。

本节要解决什么

阅读完本节,你应当能够:

  1. 说清工作区、暂存区、仓库三者之间的关系
  2. 完成一次完整提交:查看状态、暂存、提交、写规范的信息
  3. 用查看历史与对比命令回答"我改过什么"
  4. 创建分支、在分支上开发、合并回主线,理解分支的隔离价值
  5. 给轻记账初始化仓库,写好忽略清单

问题:备份文件的无限套娃

没接触 Git 的人管理版本的方式是复制文件:轻记账、轻记账2、轻记账最终版、轻记账真最终版……文件名成了灾难现场,想回三天前的版本?赌运气。Git 的思路完全不同:版本不再是一份份文件拷贝,而是一串快照。仓库记住每一次提交的完整状态,回退、对比、分支全都轻巧精确。

图 3-3 三棵树与一条提交历史

图 3-3 三棵树与一条提交历史

提交四连:日常最重要的动作

git init # 只做一次:把当前文件夹变成 Git 仓库 git status # 随时看:哪些文件改了、哪些已暂存 git add ledger.py # 指定文件进暂存区;git add . 全部 git commit -m "重构:账目操作收编进 Ledger 类" git log --oneline # 看历史,每行一条提交 git diff # 看工作区相对上次提交改了哪些行

提交信息是写给三个月后的自己的:一行说清"这次改了什么、为什么"。"修改了一些文件"这种信息等于没写;"修复月度统计的日期方向;补 records_above 测试"才是好信息。提交的粒度也有讲究:一个提交做一件事,像写文章分段——把"类化重构"和"修 bug"混在一个提交里,将来回溯时两头都查不清。

忽略清单:.gitignore

不是所有文件都该进历史。虚拟环境文件夹体积巨大且可随时重建,测试产生的临时账本、编辑器配置各有各的本地差异,它们进了 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 确认它没被影响,再合并——亲手体会一次"平行世界合流"。变式三:注册一个代码托管平台账号,把轻记账推上去,确认网页里能看到提交历史与每个文件的各版本内容。

易错点清单

  • 只在 commit 前不看 status:把无关文件一股脑提交,历史越来越浑
  • 提交信息空洞:回溯时每条都要打开 diff 逐一侦查,白费 Git 的好意
  • 忘了 .gitignore 就 init:.venv 被跟踪后即便补写清单也还在历史里,初始化前先写忽略清单
  • 把 Git 当备份盘:攒一大堆改动才提交一次,回退粒度粗到没意义——小步快跑勤提交

本节要点回顾

  • 三棵树模型:工作区改动,add 进暂存区,commit 定格进历史
  • 提交信息与粒度:一事一提交,信息说清改动与理由
  • .gitignore 守住大门:环境、缓存、临时数据不进历史
  • 分支是平行世界:大改动隔离开发,做完合回主线
  • 轻记账已有完整档案,后续每章的演进都会留下一串快照

工程"三件套"配齐:类、测试、Git。下一章项目正式上路——从 HTTP 原理开始,把轻记账搬进浏览器。


作者与出处
原作者: 灏天文库
来源:灏天文库
整理: 灏天文库整理
由灏天文库平台收录,内容或由平台用户上传,仅供学习交流
发布者: 作者: 灏天文库 转发
评论区 (0)
U