Git 不只是“保存代码”的工具。对 Python 项目来说,提交记录、暂存区、分支、合并和远程仓库共同组成了一套可回溯的协作流程。理解这些概念后,你不仅能找回误删的代码,也能更有把握地开发功能、修复问题并提交 Pull Request。
一次提交到底保存了什么
Git 通常涉及三个区域:
- 工作区:你正在编辑的项目文件。
- 暂存区:下一次提交准备包含的改动。
- 本地仓库:已经提交并由 Git 记录的版本。
git add 不会提交文件,它只是把改动放入暂存区;git commit 才会创建一个新的版本记录。这个分离很有价值:你可以在一个文件中只提交已经完成的部分,而把仍在修改的内容留在工作区。
可以用下面的命令初始化一个简单的 Python 项目:
mkdir git-python-demo
cd git-python-demo
python -m venv .venv
printf ".venv/\n__pycache__/\n*.pyc\n" > .gitignore
printf 'def greet(name):\n return f"Hello, {name}!"\n' > app.py
git init
git status
git add app.py .gitignore
git commit -m "Add initial Python project"
这里的 git status 是日常操作的入口。提交前,建议确认三件事:文件是否被正确暂存、是否误把虚拟环境加入提交,以及提交信息是否清楚描述了这次变化。
分支让不同任务并行进行
分支可以理解为一条独立的提交历史。开发新功能时,可以从主分支创建功能分支;修复线上问题时,也可以创建单独的修复分支。这样做能减少未完成代码对稳定分支的影响。
# 查看当前分支和工作区状态
git status
# 从当前提交创建并切换到功能分支
git switch -c add-greeting-test
# 修改代码后检查差异
git diff
# 暂存、提交功能改动
git add app.py
git commit -m "Add greeting behavior"
# 回到主分支并合并功能分支
git switch main
git merge --no-ff add-greeting-test
实际使用中,主分支名称可能是 main,也可能是仓库既有的其他名称。执行命令前可以通过 git branch --show-current 确认当前分支。
合并冲突并不表示 Git 失败,而是 Git 无法替你判断两组改动应该如何组合。发生冲突时,处理顺序可以是:
- 执行
git status,定位冲突文件。 - 打开文件,处理
<<<<<<<、=======和>>>>>>>标记。 - 运行测试,确认合并后的 Python 代码仍然有效。
- 执行
git add <文件>标记冲突已解决。 - 执行
git commit完成合并。
不要只为了让合并结束而机械保留一侧内容。合并后的行为和测试结果才是判断依据。
GitHub 负责远程协作
本地仓库记录的是当前机器上的历史,GitHub 等远程仓库则用于备份、共享和团队协作。配置远程仓库后,可以用 push 上传本地提交,用 pull 获取远程分支的更新。
下面是一个可以改造的典型流程。将远程地址替换为你在 GitHub 上创建的仓库地址:
# 查看已有远程仓库
git remote -v
# 首次添加远程仓库
# git remote add origin git@github.com:YOUR_NAME/git-python-demo.git
git branch -M main
git push -u origin main
# 开始新任务
git switch -c fix-input-validation
# 编辑代码并运行测试后提交
git add .
git commit -m "Validate greeting input"
git push -u origin fix-input-validation
在团队项目中,推送功能分支后通常通过 GitHub Pull Request 合并到主分支。Pull Request 不只是审批界面,也是讨论设计、查看差异和运行自动化检查的地方。提交应当尽量小而集中,例如把“输入校验”和“无关的格式化”拆成不同提交,评审和回滚都会更容易。
获取远程更新时,可以先同步远程引用,再决定如何整合:
git fetch origin
git log --oneline --decorate --graph --all
# 确认变更后,将远程主分支合并到当前分支
git merge origin/main
如果项目团队约定使用变基或特定分支策略,应遵循项目规则。不要在多人共享的分支上随意重写已经推送的历史。
给 Python 项目的实用检查清单
可以把下面的习惯加入日常开发:
- 使用
.gitignore排除.venv/、__pycache__/、.pyc、密钥和本地配置。 - 提交前运行项目已有的测试和代码检查命令。
- 用
git diff --staged检查暂存区,而不是只看工作区差异。 - 一个提交只解决一个清晰的问题。
- 提交信息使用动词开头,例如
Add、Fix或Update。 - 合并前先同步目标分支,尽早发现冲突。
- 不要把密码、访问令牌或生产配置提交到远程仓库。
Git 的核心能力不在于记住大量命令,而在于建立清晰的变更边界:哪些修改已经准备好,哪些修改属于另一个任务,哪些版本已经共享给团队。对 Python 开发者而言,掌握工作区、暂存区、本地提交、分支和远程仓库之间的关系,就足以支撑大多数日常项目协作。