零基础入门Python11|Git实战:为任务管理器建立版本历史
本篇图解:程序执行顺序

这张图对应代码的执行顺序。先说清输入、处理和输出,再解释语法细节,初学时不容易迷路。
一、上一篇课后练习讲解
任务优先级适合定义为字符串,排序时再映射成数字:
python
from dataclasses import dataclass
from datetime import date
@dataclass
class Task:
id: int
title: str
priority: str = "medium"
due_date: str | None = None
done: bool = False
排序规则:
python
PRIORITY_ORDER = {"high": 0, "medium": 1, "low": 2}
def sorted_tasks(tasks):
return sorted(
tasks,
key=lambda task: (
task.done,
PRIORITY_ORDER.get(task.priority, 99),
task.id,
),
)
Python依次比较元组中的值。False排在True前面,因此未完成任务优先;同一完成状态下再按优先级和编号排序。未知优先级映射为99,排在最后。
可执行验收答案
把代码保存为 priority_check.py 后直接运行:
python
from dataclasses import dataclass
@dataclass
class Task:
id: int
title: str
priority: str = "medium"
done: bool = False
ORDER = {"high": 0, "medium": 1, "low": 2}
def sorted_tasks(tasks: list[Task]) -> list[Task]:
return sorted(tasks, key=lambda t: (t.done, ORDER.get(t.priority, 99), t.id))
tasks = [Task(3, "写文档", "low"), Task(1, "修复登录", "high"),
Task(2, "运行测试", "medium", True)]
assert [task.id for task in sorted_tasks(tasks)] == [1, 3, 2]
assert [task.id for task in tasks] == [3, 1, 2]
print([(task.id, task.priority, task.done) for task in sorted_tasks(tasks)])
预期输出未完成的 high、low 依次在前,已完成任务最后;原列表顺序仍是 3、1、2。若 priority 为未知字符串,ORDER.get(..., 99) 会将它放到最后并保留任务,不会让排序抛 KeyError。
二、本篇成果
为任务管理器建立Git仓库,完成初始化、忽略文件、三次有意义的提交、功能分支、差异查看和故障恢复。Git不是网盘,而是能够解释"谁在什么时候为什么修改了什么"的版本历史。
三、仓库、工作区、暂存区和提交
- 工作区:正在编辑的文件;
- 暂存区:准备进入下一次提交的改动;
- 提交:带说明的项目快照;
- 仓库:保存全部提交和分支。
进入任务管理器根目录:
powershell
git init
git status
初始化不会自动提交文件。先创建.gitignore:
gitignore
.venv/
__pycache__/
*.pyc
.pytest_cache/
tasks.json
.env
虚拟环境、缓存、用户数据和密钥不能提交。源码和依赖清单应提交。
四、完成第一次提交
powershell
git add .gitignore task_manager main.py tests
git status
git commit -m "feat: add command line task manager"
add只放入暂存区;commit才形成历史。提交信息使用"类型: 具体变化",不要只写"修改""完成"。
查看历史:
powershell
git log --oneline --decorate
五、用小提交记录开发过程
增加优先级模型后:
powershell
git diff
git add task_manager/models.py task_manager/service.py
git commit -m "feat: support task priority"
增加对应测试后:
powershell
git add tests
git commit -m "test: cover task priority ordering"
代码与测试分开提交并非强制,但每次提交应聚焦一个能够说明的变化。
六、分支隔离新功能
powershell
git switch -c feature/due-date
git branch
在分支上实现截止日期,然后提交:
powershell
git add .
git commit -m "feat: add task due date"
回到主分支并合并:
powershell
git switch main
git merge feature/due-date
如果初始分支名是master,可先执行:
powershell
git branch -M main
七、恢复错误改动
只修改了文件但尚未暂存,可查看差异:
powershell
git diff
如果确定不要这次改动,使用:
powershell
git restore task_manager/models.py
已经暂存但未提交:
powershell
git restore --staged task_manager/models.py
不要随意使用会丢失所有改动的强制重置命令。恢复前先用status和diff确认范围。
查看某次提交内容:
powershell
git show HEAD
git show HEAD~1
八、真实开发流程
每完成一个小功能:
- git status确认改动文件;
- git diff逐行检查;
- 运行pytest;
- git add只加入相关文件;
- git commit写清变化;
- git log确认历史。
Git不会替代测试。它只能保存"当时的代码",不能证明代码正确。
九、本篇验收
在新目录复制任务管理器源码,执行:
powershell
git init
git branch -M main
git add .
git commit -m "feat: initialize task manager"
git switch -c feature/priority
git status
验收要求:
- .venv、tasks.json和.env不出现在提交中;
- 主分支至少有一次提交;
- feature/priority分支能够独立修改;
- git diff能看到未提交变化;
- pytest通过后才能提交。
十、课后练习
在feature/priority分支修改任务优先级并提交;故意修改一行标题但不提交,使用git diff观察,再用git restore恢复。最后把该分支合并到main,并画出"工作区→暂存区→提交"的数据流。
实战补充:提交前检查清单
每次 Git 提交前执行 status、diff 和测试。提交应描述一个可运行增量,例如 feat: persist tasks,而不是把密钥、虚拟环境和临时数据库一起提交。
powershell
git status --short
git diff --check
python -m pytest -q
git add app tests
git commit -m "feat: add task persistence"
验收:从干净目录 clone 后,按照 README 创建环境并通过测试;故意制造一个错误提交,再用 git revert 恢复。课后练习:给任务项目建立 feature 分支和发布 tag。
本篇结束:完整模块文件
本节不是代码片段,而是本篇结束时该模块的完整版本。请先备份旧文件,再整体替换;替换后重新运行本篇命令和测试。阅读时重点看本篇新增的函数、事务边界和错误处理,未涉及的代码先不要自行删减。
本篇完整示例
text
git init
git add .
git commit -m "feat: initialize project"
git switch -c feature/login
git status