可以回溯的历史
Git 把项目的历史记录为一系列提交(commit):对所有被跟踪文件的快照,每个提交都有作者、时间和说明。有了它,你可以看到改了什么、为什么改,放心尝试新想法,并回到曾经可用的版本。受 Git 管理的文件夹叫仓库(repository)。量化工作非常依赖它:只有能准确说出结果由哪个版本的代码产生,结果才值得信赖。
# Start tracking a project (once)
git init
# See what changed, stage it, record it
git status
git add main.py README.md
git commit -m "Add the first backtest loop"
# Look back
git log --oneline
git diff # changes not yet staged改动所在的三个地方
改动会经过三个区域。你在工作区编辑文件;git add 把选中的改动复制到暂存区(正在准备的下一个快照);git commit 把暂存的快照记录进仓库历史。这样即使你改了很多文件,也能只把相关的改动一起提交。git status 会显示每个文件所处的区域:已修改、已暂存,或未跟踪(新文件,Git 还不认识)。
# git status --porcelain prints two status letters, a space, then the path
status = """ M main.py
A notes.md
?? scratch.txt
D old.py"""
for line in status.splitlines():
code, path = line[:2], line[3:]
print(repr(code), path)
# ' M' main.py (modified, not staged)
# 'A ' notes.md (new, staged)
# '??' scratch.txt (untracked)
# 'D ' old.py (deleted, staged)分支
分支(branch)是一条提交链上的可移动名字。为每个想法或修复建一个分支(git switch -c fee-model),随意提交,等它可用后用 git merge 合并回主线(通常在 main 分支上执行)。分支名可以包含字母、数字、-、_、/ 和 .,但不能有空格,也不能含 ~ ^ : ? * [ \ 中的任何字符,不能以 / 开头或结尾,也不能以 . 结尾。当两个分支修改了同样的行时,Git 会提示冲突,需要你手动解决。
# Try an idea on its own branch, then bring it back
git switch -c fee-model
git commit -am "Use tiered fees"
git switch main
git merge fee-model
# List branches (the current one has a star)
git branch哪些不该提交,以及如何撤销
.gitignore 文件列出 Git 不应跟踪的模式:.venv/(文件夹,末尾加斜杠)、*.log(匹配通配符的任何文件)、secrets.env。不要提交虚拟环境、缓存、大型数据文件,尤其是 API 密钥这类机密:一旦提交,即使以后删除也会留在历史中。撤销时,git restore 文件 会丢弃某个文件未提交的修改,git revert <commit> 会新增一个提交来抵消旧提交,在共享分支上很安全。git push 和 git pull 与远程副本(如 GitHub 上的仓库)交换提交。
# .gitignore
.venv/
__pycache__/
*.log
secrets.env
# Undo safely
git restore main.py # drop uncommitted edits to one file
git revert 3f2a9c1 # new commit that cancels an old one
# Share
git push origin main
git pullgit log --oneline 一目了然。如果密钥或密码曾进入提交,要当作已泄露处理:先作废,再从历史中清除。git init、git status、git add、git commit -m "..."、git log --oneline。- 每个想法一个分支:
git switch -c name,然后git merge。 - 用
.gitignore排除.venv/、缓存、数据和机密;用restore或revert撤销。
下一节:Jupyter 笔记本,交互式探索数据,以及如何在 Git 下保持整洁。
实验:评分内容
- 用
parse_status对git status报告中的文件分类25 分 - 用
parse_log解析git log --oneline的输出25 分 - 用
is_valid_branch_name按 Git 规则检查分支名25 分 - 用
not_ignored把.gitignore应用到文件列表25 分