零基础入门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
相关推荐
Python私教1 小时前
多个项目怎么安全合并?先适配,再切换
后端·python·架构
牢姐与蒯3 小时前
Linux基础开发工具之版本控制器git
git
余额瞒着我当琳3 小时前
C++--深拷贝三件套 + swap + 写时拷贝 + vector 扩容 + reserve
java·开发语言·c++
坐吃山猪3 小时前
WebClient内存配置解析
开发语言·springboot·webflux
北斗落凡尘3 小时前
LangGraph 入门实战(12)--使用MCP
后端·python·langchain
jdksjw4 小时前
同步与异步、阻塞与非阻塞、多线程、协程超详细讲解(Python并发编程从入门到精通)
开发语言·python
Zach_菠萝侠4 小时前
【DeepSeek Harness 研究】进化方向4:安全加固 思考、设计与实现
开发语言·安全·deepseek
Mike_Zhang4 小时前
使用python统计FreeSWITCH呼叫并发
python·freeswitch
SL-staff4 小时前
技术实践:HR如何用JVS-Logic可视化编排实现考勤数据同步(含节点配置与异常处理)
开发语言·python·低代码·钉钉·可视化编排·jvs-logic·hr技术