84·模块十六:工程化与部署入门

版本控制:Git 基础与 Python 项目

version-controlgitgithub

第84课 - 版本控制:Git 基础与 Python 项目

学习目标

完成本课学习后,你将能够:

  1. 理解版本控制(Git)在软件开发中的核心作用。
  2. 掌握 Git 最基本的操作流程(初始化、添加、提交、查看状态)。
  3. 学会为 Python 项目配置 .gitignore 文件,以忽略不必要的文件。
  4. 了解如何将本地 Git 仓库与远程仓库(如 GitHub)进行关联与同步。

核心概念

想象一下,你在写一篇很长的论文。如果每次修改都保存一个新版本(论文_v1, 论文_v2, 最终版_再改一版.doc),很快就会变得混乱不堪。版本控制系统(VCS) 就是专门解决这个问题的工具,它能像一台"时光机"一样,记录你代码的每一次变更。

Git 是目前世界上最流行的分布式版本控制系统。它的核心概念非常简单:

  1. 仓库(Repository):项目文件夹加上 Git 的"隐藏"管理文件夹(.git)。这是 Git 的"大脑",记录了所有的历史记录。
  2. 工作区(Working Directory):你当前正在编辑的项目文件所在的目录。
  3. 暂存区(Staging Area):一个准备区域。你修改的文件不会自动记录,需要先"放"进这里,然后再"打包"保存。
  4. 提交(Commit):对暂存区的文件打一个快照,并附上一段描述信息(commit message)。这就像给你的论文存了一个带标签的档。

基本的工作流程是:在工作区修改文件 → 将文件放入暂存区 → 将暂存区的内容提交到仓库

对于 Python 项目,我们通常不想把所有文件都纳入版本控制,例如:

  • Python 运行时生成的 __pycache__/ 字节码缓存。
  • 虚拟环境文件夹 venv/.venv/(因为依赖已在 requirements.txt 中管理)。
  • 集成开发环境(IDE)的配置文件,如 .idea/.vscode/
  • 包含敏感信息(如密码)的配置文件。

我们需要一个 .gitignore 文件来告诉 Git:"嘿,这些文件和目录你不用管。"

代码示例

让我们通过一个完整的示例来学习 Git 基础操作。

步骤1:创建一个Python项目并初始化Git

# 创建项目目录并进入
mkdir my_python_project
cd my_python_project

# 初始化一个Git仓库(会在目录下创建隐藏的.git文件夹)
git init

步骤2:创建一个Python文件 创建一个名为 hello.py 的文件,内容如下:

# hello.py
def say_hello(name):
    """打印问候语"""
    print(f"你好, {name}!")

if __name__ == "__main__":
    say_hello("Git学习者")

步骤3:创建 .gitignore 文件 创建一个名为 .gitignore 的文件(没有扩展名),内容如下:

# Python缓存文件
__pycache__/
*.pyc
*.pyo
*.pyd
.Python

# 虚拟环境
venv/
.venv/
env/
.env

# IDE配置
.vscode/
.idea/
*.swp
*.swo

# 操作系统生成的文件
.DS_Store
Thumbs.db

步骤4:执行基本的Git操作

# 查看当前仓库状态(会显示新增的文件:hello.py 和 .gitignore)
git status

# 将所有修改的文件(包括新文件)添加到暂存区
git add .

# 进行第一次提交,并附上描述信息
git commit -m "初始化项目:添加主程序和.gitignore文件"

步骤5:进行一次修改并再次提交 修改 hello.py

# hello.py (更新版本)
def say_hello(name):
    """打印问候语,并返回问候字符串"""
    greeting = f"你好, {name}!"
    print(greeting)
    return greeting # 新增:返回字符串

if __name__ == "__main__":
    say_hello("Git学习者")
    # 尝试调用函数并打印返回值
    result = say_hello("Python")
    print(f"函数返回了:{result}")

然后再次提交:

# 查看修改内容
git diff

# 添加修改到暂存区
git add hello.py

# 提交,描述这次改动
git commit -m "功能更新:say_hello函数现在返回问候字符串"

# 查看简洁的提交历史
git log --oneline

步骤6:(可选)关联远程GitHub仓库

  1. 在 GitHub.com 上创建一个新的空仓库(不要勾选初始化 README)。
  2. 将本地仓库关联到远程仓库:
# 关联远程仓库(替换URL为你自己的仓库地址)
git remote add origin https://github.com/你的用户名/my_python_project.git

# 将本地的main(或master)分支推送到远程仓库
git push -u origin main

实践练习

练习1:基础操作流水线

  1. 创建一个新的目录 calc_project
  2. 在其中初始化一个 Git 仓库。
  3. 创建一个简单的 calculator.py 文件,实现两个数相加的函数。
  4. 将它添加并提交到仓库,提交信息为"添加计算器加法功能"。
  5. 修改 calculator.py,增加一个相减的函数。
  6. 再次提交,提交信息为"添加减法功能"。

练习2:配置 .gitignore

  1. 在上一个练习的 calc_project 中,创建一个 test.txt 文件(内容随意)。
  2. 创建一个 .gitignore 文件,让 Git 忽略所有 .txt 文件。
  3. 执行 git status,验证 test.txt 是否被忽略。
  4. 提交 .gitignore 文件,提交信息为"配置忽略规则"。

练习3:模拟协作(高级)

  1. 基于练习1的最终代码,使用 git checkout -b feature-multiply 创建一个新分支。
  2. 在新分支上添加乘法功能并提交。
  3. 切换回 main 分支。
  4. 尝试合并 feature-multiply 分支到 main

常见错误

  1. 忘记创建 .gitignore:导致 .pyc 文件、虚拟环境或IDE配置被提交进仓库,污染代码历史。解决方案:项目初始化后,第一时间创建 .gitignore 文件。
  2. 提交信息过于随意:如 "update", "fix bug", "asdfgh"。这会让后续查看历史的人(包括未来的你)一头雾水。解决方案:使用明确的描述,如 "fix: 修复用户登录时的空指针错误""feat: 添加数据导出为CSV功能"
  3. 一次性提交过多、过大的改动:一个提交做了太多不相关的事情,难以回溯和复盘。解决方案:遵循"小步快跑"原则,一个逻辑功能修改完毕就提交一次。
  4. 在提交后才发现遗漏了文件:直接用 git add 再添加文件并提交是可以的,但会多一个提交记录。解决方案:使用 git commit --amend 来修改上一次的提交(注意,如果已经推送到远程,不要轻易修改历史)。

小结

  • Git 是"时光机":它通过提交记录你项目的每一次变更,允许你自由穿梭于各个版本之间,是团队协作和代码安全的基石。
  • 核心三区与流程:理解 工作区 → 暂存区 → 仓库 的流程,掌握 git addgit commit 的用法。
  • Python 项目的护城河:善用 .gitignore 文件,保持仓库的整洁,排除无关的运行时文件和本地配置。
  • 远程协作:通过 git remotegit push/git pull 可以与 GitHub 等平台同步代码,实现真正的协作开发。
  • 好的习惯:写清晰的提交信息,进行小而频繁的提交,从项目开始就配置好 .gitignore

掌握 Git 基础是成为一名合格开发者的必经之路。它不仅用于代码,还可以用于管理任何类型的文本文件变更(如文档、配置文件)。下一课,我们将学习如何将你的 Python 项目打包成 Docker 镜像,实现"一次构建,到处运行"!

练习编辑器

python
Loading...

继续学习

完成本课后,建议继续学习下一课「容器化入门:Docker 与 Python」 以巩固所学知识。