零基础入门Python11|Git实战:为任务管理器建立版本历史

零基础入门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

八、真实开发流程

每完成一个小功能:

  1. git status确认改动文件;
  2. git diff逐行检查;
  3. 运行pytest;
  4. git add只加入相关文件;
  5. git commit写清变化;
  6. 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
相关推荐
hhzz5 小时前
【OpenCV 入门到精通 03】图像入门:读取、显示、保存完全指南
人工智能·python·opencv·计算机视觉
金融小师妹6 小时前
AI趋势识别:黄仁勋宣布“AGI时代”到来,Astra能力跃迁背后的AI安全边界
大数据·python·深度学习·重构·逻辑回归
2501_941875288 小时前
从配置中心到动态管理的互联网工程语法演进与多语言实践分享
开发语言·python
hfywmsj9 小时前
广州餐饮铺位招租决策模型:多因子选址系统设计
开发语言·人工智能·python·广州餐饮铺位招租
努力的lpp11 小时前
php反序列化一(大白话版)
开发语言·web安全·php·ctf·反序列化
菜鸟~noob23311 小时前
【电子战】第03篇:CFAR(恒虚警)处理【含matlab代码】
开发语言·matlab
泡海椒12 小时前
内置SPI函数库详解:JQuick-Java Builtin工具类实战用法
java·开发语言·python
hqyjzsb12 小时前
零 AI 项目经验,学 Python 转型 AI 的正确顺序是什么?
开发语言·人工智能·python·算法·职场和发展·数据挖掘·数据分析
云泽80812 小时前
Git 版本控制系统(下):从 .git 目录结构到冲突解决机制详解
大数据·git·elasticsearch
sanjiaomao33313 小时前
从论文公式到Python实现:用单元测试校验滑动平均算法
python·算法·单元测试