目錄
1. 為什麼每個開發者都需要 Git?
先問你一個問題:你有沒有做過這樣的事情?
- 寫程式寫到一半,改到亂掉,想回到昨天的版本,但已經覆蓋保存了
- 桌面上出現
strategy_final.py、strategy_final_v2.py、strategy_final_v2_真的最終版.py - 和同學合作,互相發 zip 壓縮包,最後不知道誰的版本才是最新的
如果你有以上任何一種經歷,那你就已經遇到了版本控制問題。而 Git 就是解決這些問題的標準答案。
在量化交易開發中,Git 更是不可缺少:
- 策略程式碼需要頻繁迭代,必須追蹤每一次改動
- 回測參數調整後回頭比較,哪個版本表現更好?
- 部署到雲服務器的代碼,需要與本機保持同步
- 開源項目或與他人協作,必須使用 Git + GitHub
2. Git 是什麼?版本控制的本質
2.1 版本控制的比喻
生活比喻:遊戲存檔
你玩 RPG 遊戲時,每過一個關卡都會存檔。
Git 就是你寫程式時的「存檔系統」。每次你覺得代碼到了一個穩定狀態,就可以「存一個檔」(commit)。之後無論改了什麼,隨時都能回到任何一個歷史存檔,不怕改壞。
2.2 Git 的誕生背景
Git 由 Linus Torvalds(Linux 操作系統之父)在 2005 年創造,最初是為了管理 Linux 內核的龐大代碼庫。
Git 是一個分佈式版本控制系統(DVCS),這意味著:
| 特性 | 說明 |
|---|---|
| 本地完整倉庫 | 每個人的電腦上都有完整的版本歷史,不依賴服務器 |
| 離線可用 | 沒有網路也能提交、查歷史、建分支 |
| 速度極快 | 本地操作不需要網路請求,幾乎是即時 |
| 不易丟失 | 每個人都有完整備份,即使服務器掛掉也沒事 |
3. 安裝與初始設定
3.1 安裝 Git
macOS:
# 方法1:使用 Homebrew(推薦)
brew install git
# 方法2:安裝 Xcode Command Line Tools
xcode-select --install
Windows:
# 前往官網下載安裝包
# https://git-scm.com/download/win
# 安裝後在 Git Bash 中執行命令
Ubuntu / Debian Linux:
sudo apt update
sudo apt install git
3.2 驗證安裝
git --version
# 輸出:git version 2.43.0
3.3 初始設定(每台電腦只需做一次)
告訴 Git 你是誰,這樣每次提交記錄都會帶上你的名字:
# 設定使用者名稱和 Email
git config --global user.name "你的名字"
git config --global user.email "your@email.com"
# 設定預設編輯器(選用 VS Code)
git config --global core.editor "code --wait"
# 查看目前設定
git config --list
--global 是什麼意思?
--global 代表這台電腦上所有 Git 倉庫都使用這個設定。
如果某個項目需要不同的 Email(例如公司項目),可以在該項目目錄下執行相同命令但不加 --global,會覆蓋全域設定。
4. 三個區域:工作區、暫存區、版本庫
這是理解 Git 最重要的概念。Git 把你的項目分成三個「區域」:
生活比喻:裝貨打包
想像你要寄一個包裹:
🗂️ 工作區(Working Directory) = 你的桌面,你在這裡修改文件
📦 暫存區(Staging Area) = 打包箱,你把要寄的東西放進去
🏛️ 版本庫(Repository) = 倉庫記錄,每次寄出去的快照都永久保存在這裡
三個區域的關係如下:
| 區域 | 說明 | 對應命令 |
|---|---|---|
| 工作區 | 你實際編輯的文件,磁碟上看得到的內容 | —(直接修改文件) |
| 暫存區 | 準備提交的文件清單,是一個中間緩衝層 | git add |
| 版本庫 | 保存所有歷史版本快照,存在 .git 目錄中 |
git commit |
有時候你改了 5 個文件,但只想把其中 3 個打包成一次提交。暫存區讓你精細控制「這次 commit 包含哪些改動」,使每次提交的目的更清晰。
5. 核心命令速查
5.1 初始化倉庫
# 在當前目錄初始化一個新的 Git 倉庫
git init
# 克隆(複製)一個已有的遠端倉庫到本地
git clone https://github.com/username/repo.git
5.2 查看狀態與歷史
# 查看工作區和暫存區的狀態(最常用)
git status
# 查看提交歷史(按 q 退出)
git log
# 簡潔版提交歷史(一行一個)
git log --oneline
# 查看具體改了什麼內容
git diff
5.3 暫存與提交
# 把某個文件加入暫存區
git add strategy.py
# 把所有改動文件一次加入暫存區
git add .
# 提交暫存區的內容,並附上說明訊息
git commit -m "新增雙均線策略"
# 一步完成:add + commit(只對已追蹤文件有效)
git commit -am "修復計算邏輯錯誤"
- ❌ 不好的訊息:
"fix"、"update"、"asdfjkl" - ✅ 好的訊息:
"修復 SPY 策略在除息日的錯誤計算" - 好的訊息讓你半年後看歷史記錄也能快速理解
5.4 撤銷與回退
# 取消某個文件的暫存(從暫存區移出,不影響工作區)
git restore --staged strategy.py
# 丟棄工作區的修改(恢復到上一次 commit 的狀態)
git restore strategy.py
# 回退到某個歷史版本(commit hash 從 git log 取得)
git reset --hard a1b2c3d
# 安全地撤銷某次 commit(會建立一個新的反向 commit)
git revert a1b2c3d
git reset --hard 是危險操作!
--hard 會直接丟棄工作區和暫存區所有未提交的改動,無法還原。在已推送到遠端的代碼上使用更要謹慎。不確定時優先用 git revert。
5.5 忽略文件:.gitignore
有些文件不應該被 Git 追蹤,例如 API 金鑰、密碼、虛擬環境、編譯產物等。在項目根目錄建立 .gitignore 文件:
# .gitignore 範例(量化交易項目)
# Python 虛擬環境
venv/
.venv/
__pycache__/
*.pyc
# 環境變數與 API 金鑰(絕對不能上傳!)
.env
config_secret.py
api_keys.json
# 回測結果和數據文件(太大了)
data/
results/
*.csv
*.parquet
# 系統文件
.DS_Store # macOS
Thumbs.db # Windows
交易所 API Key、長橋 access token 等敏感信息一旦上傳到 GitHub,即使後來刪除,也可能已被惡意程序掃描記錄。務必在 .gitignore 中排除所有包含密鑰的文件。
6. 分支:並行開發的神器
6.1 什麼是分支?
生活比喻:平行宇宙
分支就像代碼的平行宇宙。你可以在不影響主線(main)穩定版本的情況下,在另一條分支上自由實驗新功能。實驗成功了再「合並」回主線;失敗了直接刪掉分支,主線毫髮無損。
6.2 分支基本操作
# 查看所有分支(* 號表示當前所在分支)
git branch
# 建立新分支
git branch feature/rsi-strategy
# 切換到該分支
git checkout feature/rsi-strategy
# 建立並立即切換(上面兩步合一)
git checkout -b feature/rsi-strategy
# 現代寫法(Git 2.23+ 推薦)
git switch -c feature/rsi-strategy
6.3 合并分支
# 先切回主分支
git switch main
# 將 feature 分支合并進來
git merge feature/rsi-strategy
# 合并完成後,刪除 feature 分支(可選)
git branch -d feature/rsi-strategy
6.4 常見分支工作流
對於量化交易個人項目,推薦以下簡單分支策略:
| 分支名 | 用途 | 說明 |
|---|---|---|
main |
主分支 | 只放穩定、經過驗證的代碼,可部署到服務器 |
dev |
開發分支 | 日常開發整合,功能開發完成後合并到 main |
feature/xxx |
功能分支 | 開發某個新策略或新功能,完成後合并到 dev |
hotfix/xxx |
緊急修復 | 線上出 bug,從 main 切出來修復後合并回 main |
7. GitHub 遠端倉庫:備份與協作
7.1 本地倉庫 vs 遠端倉庫
比喻:本機 vs 雲端
你電腦上的 Git 倉庫就像本地硬盤的文件。
GitHub 上的倉庫就像雲端備份(Google Drive、iCloud)。
兩者完全獨立,你需要主動「推送」(push)才同步到雲端,主動「拉取」(pull)才把雲端更新拉到本地。
7.2 建立 GitHub 倉庫並推送
# 第1步:在 GitHub.com 建立一個新的 Repository(空的)
# 第2步:在本地關聯遠端倉庫
git remote add origin https://github.com/yourname/your-repo.git
# 第3步:首次推送並設置追蹤關係
git push -u origin main
# 之後每次推送只需要
git push
7.3 拉取遠端更新
# 從遠端拉取最新代碼並自動合并
git pull
# 拆成兩步(更安全,可以先查看再決定是否合并)
git fetch origin # 只下載,不合并
git merge origin/main # 再手動合并
7.4 常用遠端操作命令
# 查看已設定的遠端倉庫
git remote -v
# 修改遠端 URL(例如從 HTTPS 改成 SSH)
git remote set-url origin git@github.com:yourname/your-repo.git
# 刪除某個遠端
git remote remove origin
- HTTPS:設定簡單,但每次 push 可能需要輸入密碼(可用憑證管理器解決)
- SSH:設定 SSH Key 後無需每次輸入密碼,推薦長期使用
8. 在量化交易開發中的 Git 實踐
8.1 量化項目的典型 Git 目錄結構
my-quant-strategy/
├── .git/ # Git 版本庫(自動生成,不要手動修改)
├── .gitignore # 排除敏感文件和大型數據
├── README.md # 項目說明
├── requirements.txt # Python 依賴清單
├── strategy/
│ ├── dual_sma.py # 雙均線策略
│ └── rsi_mean_revert.py # RSI 均值回復策略
├── backtest/
│ └── run_backtest.py # 回測入口
└── config/
├── config_template.py # 配置模板(提交到 Git)
└── config.py # 本地配置(在 .gitignore 中排除)
8.2 規範化 commit 工作流程
# 典型的一天工作流
# 早上拉取最新代碼
git pull
# 建立新功能分支
git switch -c feature/add-rsi-filter
# ...寫程式,測試...
# 查看改了什麼
git status
git diff strategy/dual_sma.py
# 把改動加入暫存區
git add strategy/dual_sma.py
# 提交(訊息清楚說明做了什麼)
git commit -m "feat: 雙均線策略新增 RSI 過濾器,避開超買區域入場"
# 推送到遠端
git push origin feature/add-rsi-filter
# 功能驗證後,合并到 dev
git switch dev
git merge feature/add-rsi-filter
git push
8.3 用 Git 管理回測版本
# 每次調整策略參數後建立 tag,方便對比回測結果
git tag -a v1.0 -m "雙均線 SMA(20,50),回測夏普 1.23"
git tag -a v1.1 -m "加入 RSI 過濾後,夏普提升至 1.45"
# 查看所有版本標籤
git tag
# 切回某個版本重新運行回測
git checkout v1.0
8.4 部署到雲服務器
# SSH 登入到雲服務器
ssh root@your-server-ip
# 如果是首次部署,克隆倉庫
git clone https://github.com/yourname/your-repo.git
cd your-repo
# 如果已部署,拉取最新代碼
git pull origin main
# 重新啟動策略進程
python strategy/main.py &
- 版本控制:記錄代碼每次變化,隨時可回退
- 三個區域:工作區 →
git add→ 暫存區 →git commit→ 版本庫 - 分支:平行開發,不影響主線穩定性
- 遠端倉庫:
git push備份到 GitHub,git pull拉取更新 - .gitignore:敏感信息(API Key)絕對不能上傳!
掌握 Git 是每個量化交易開發者的必備技能。從今天起,把你的策略代碼交給 Git 管理,讓版本歷史為你的開發保駕護航!