Git × GitHub × Vercel:從自己的電腦到公開網址
三個工具串起來之後,你只要在 Antigravity 裡說「存檔」「推上 GitHub」,一分鐘後網站就自動更新。這一頁是整學期的部署手冊,也收錄了可以直接使用的提示詞與 Antigravity 課程套件。
| 工具 | 一句話 | 出錯時救你的方式 |
|---|---|---|
| Git | 在自己電腦上建立存檔點 | 回到任何一個存檔點 |
| GitHub | 把存檔點備份到雲端,Vercel 從這裡取得程式碼 | 電腦壞了,程式碼還在 |
| Vercel | 把 GitHub 上的程式碼變成網站 | 一鍵退回上一個正常的版本 |
一次性設定(約 20 分鐘)
完成環境安裝的 Antigravity、Python、Git 之後,再做下面三件事:
1. 安裝 GitHub CLI 並登入
- 到 cli.github.com 下載安裝(Windows 選 .msi,Mac 選 .pkg)。安裝後重新開啟 Antigravity。
- 在 Antigravity 的終端機自己輸入下列指令,依序選擇
GitHub.com→HTTPS→Login with a web browser,再到瀏覽器輸入畫面上的代碼完成登入:
gh auth login
確認:
gh auth status
為什麼用 gh:登入資訊由系統安全保存,之後 AI 執行 git push 或建立儲存庫時都不需要你提供密碼或 token。Windows 與 Mac 的步驟完全一樣。
2. 註冊 Vercel
- 到 vercel.com/signup,選 Hobby(免費)方案,按 Continue with GitHub。
- 第一次匯入專案時,Vercel 會請你安裝它的 GitHub App。可以選「只允許特定儲存庫」,之後每個專案再加入。
3. 安裝課程的 Antigravity 套件
把下方「Antigravity 課程套件」的 AGENTS.md 與 .agents 資料夾複製到每個專案的根目錄。
gh auth login 一定要學生自己在終端機操作。若讓 AI 執行,它會卡在互動式選單。教室網路若擋 github.com 的裝置驗證頁,請先用手機熱點完成登入。
每天的工作循環
- 修改:請 AI 做一條功能(先讀 PROJECT.md)。
- 測試:在自己電腦上對答案、執行 pytest。
- 存檔:「存檔」→ git-save skill 建立存檔點。
- 推送:「推上 GitHub」→ github-publish skill 執行 git push。
- 自動部署:Vercel 偵測到推送,大約 1 分鐘完成。
- 線上確認:打開公開網址,用手機也看一次。
口訣:本機對過答案才存檔,存檔了才推送。推送到 main 分支的每一個版本都會直接上線,所以壞掉的程式不要推。
實作:第一次上線【第 1 週】
先用一個只有 HTML 的自我介紹網頁,把整條流程走一次。網頁越簡單越好,重點是看到「推送後網站自動更新」。
步驟 1:建立網頁
在 程式設計三 底下建立 my-first-site 資料夾,用 Antigravity 開啟,並放入課程套件。
請在目前資料夾建立一個自我介紹網頁 index.html: 1. 只用 HTML 與 CSS,寫在同一個檔案裡,不使用任何框架 2. 內容:我的暱稱(先填「我的名字」)、三個興趣、一句這學期的目標 3. 手機與電腦都要好讀 4. 執行 git init,建立 .gitignore,然後用 git-save 存檔,訊息「建立自我介紹網頁」 完成後告訴我怎麼在瀏覽器打開它。
步驟 2:推上 GitHub
推上 GitHub。儲存庫名稱 my-first-site,選 Public。
步驟 3:在 Vercel 匯入
- Vercel 首頁 →「Add New…」→「Project」。
- 在「Import Git Repository」找到 my-first-site,按「Import」(第一次會請你安裝 Vercel 的 GitHub App)。
- Framework Preset 保持 Other,其他不用改,按「Deploy」。
- 完成後點畫面上的網址,例如
my-first-site-xxxx.vercel.app。
步驟 4:感受自動部署
把網頁上的「我的名字」改成(你的暱稱),再加一個「我最想做的網站」段落。改完先讓我在本機確認,確認後存檔並推上 GitHub。
推送後馬上到 Vercel 專案的「Deployments」頁面,看著新的部署從 Building 變成 Ready,再重新整理你的公開網址。
完成:你剛剛把一段修改,從自己的電腦送到全世界都看得到的網址,中間沒有手動上傳任何檔案。整學期的每一個專案都會這樣上線。
分支與預覽部署:上線前先試看看
推到 main 分支的版本會直接上線。想先試一個比較大的改動時,開一個分支:Vercel 會替每個分支產生一個預覽網址,正式網址完全不受影響。
我想試著把網頁改成深色主題,但先不要影響正式網站。 請建立一個新分支 dark-theme,在這個分支上修改並存檔,然後推上 GitHub。 完成後告訴我:要怎麼在 Vercel 找到這個分支的預覽網址?確認沒問題後,要怎麼把它合併回 main?
| 推送到 | Vercel 的反應 | 網址 |
|---|---|---|
main | Production 部署 | 正式網址(同學看到的) |
| 其他分支 | Preview 部署 | 每個分支各自的預覽網址 |
環境變數與金鑰
資料庫連線字串、AI 的 API 金鑰,永遠不放進程式碼,也不推上 GitHub。
| 位置 | 放什麼 | 會不會上傳 |
|---|---|---|
專案裡的 .env | 自己電腦開發用的設定 | 不會(列在 .gitignore) |
| Vercel → Settings → Environment Variables | 線上網站用的設定 | 只存在 Vercel |
| Vercel Marketplace 加入 Neon 時 | 自動產生 DATABASE_URL | 只存在 Vercel |
如果不小心把金鑰推上 GitHub:刪掉檔案再推送是不夠的,歷史紀錄裡還查得到。第一件事是到該服務的網站把金鑰作廢、重新產生一組,再告訴老師。
出錯時怎麼辦
| 狀況 | 做法 |
|---|---|
| 線上網站壞了,要馬上恢復 | Vercel 專案 → Deployments → 找到上一個正常的部署 → 「⋯」→ Instant Rollback。幾秒內恢復,之後再慢慢修。 |
| 某個存檔點的修改是錯的 | 請 AI:「用 git revert 撤銷『功能3:新增評論』這個存檔點,不要用 reset」。revert 會新增一個存檔點,紀錄完整保留。 |
| Vercel 部署失敗(紅色 Error) | 點該次部署 → Logs,把錯誤訊息貼給 AI,並使用 vercel-deploy-check skill。 |
| 推送被拒絕(rejected) | 通常是 GitHub 上有你電腦沒有的修改。請 AI 用 git pull 合併後再推送,不要使用 --force。 |
提示詞模板
有安裝課程套件時,簡短的一句話就會觸發對應的 skill;沒有安裝時,請使用完整版。
| 要做的事 | 有套件時說 | 使用的 skill |
|---|---|---|
| 建立存檔點 | 存檔 | git-save |
| 推上 GitHub | 推上 GitHub | github-publish |
| 上線前檢查 | 準備上線到 Vercel,請做上線前檢查 | vercel-deploy-check |
請建立 Git 存檔點:先執行 git status 告訴我有哪些改動,確認沒有 .env、.venv、instance/、資料庫檔要被存檔;有 tests/ 就先跑 python -m pytest -q,失敗就停下來告訴我原因。全部沒問題後,用「功能N:功能名稱」的格式存檔,並執行 git log --oneline -5。
請把專案推上 GitHub。先執行 gh auth status 確認我已登入(沒登入就告訴我自己執行 gh auth login,不要向我要密碼或 token)。確認 .gitignore 正確、所有修改都已存檔。還沒有遠端時,用 gh repo create(名稱:___,Public)建立並推送;已有遠端就 git push。最後告訴我儲存庫網址。不要使用 --force。
我要把這個 Flask 網站部署到 Vercel。請先不要修改任何檔案,逐項檢查並用表格回報: 1. 根目錄的 app.py 有名為 app 的 Flask 物件;requirements.txt 完整 2. Vercel 上 SQLite 的寫入會消失:程式是否在 DATABASE_URL 存在時改用 Postgres(Neon),並列出需要調整的 SQL 語法 3. .env、.venv、instance/、*.db 都在 .gitignore,且 git ls-files 中沒有它們 4. 程式碼中沒有寫死任何密碼或連線字串 5. python -m pytest -q 是否全部通過 最後列出部署後我要在瀏覽器手動確認的項目。
Vercel 部署失敗了,以下是 Deployments → Logs 的錯誤訊息: (貼上錯誤訊息) 請說明失敗的原因、要修改哪個檔案的哪裡,先不要修改,等我確認。
Antigravity 課程套件
套件放在課程資料夾 practice/antigravity-kit/。把 AGENTS.md 與整個 .agents 資料夾複製到每個專案的根目錄即可。這兩樣都會跟著 Git 存檔,同組同學共用同一套規則。
foodie/ ├─ AGENTS.md 課程規則:每次對話都會遵守 ├─ .agents/ │ └─ skills/ │ ├─ git-save/SKILL.md 「存檔」 │ ├─ github-publish/SKILL.md 「推上 GitHub」 │ └─ vercel-deploy-check/SKILL.md 「上線前檢查」 ├─ PROJECT.md └─ app.py …
Rules 與 Skills 的差別:AGENTS.md 是規則,每一次對話都會套用,所以只放「永遠要遵守」的事,例如不可以要求密碼。Skill 是做事的步驟,AI 讀了每個 skill 的 description,判斷你的需求符合時才會使用。你也可以直接在提示詞裡寫出 skill 名稱,確保它被使用。
安裝後,到 Antigravity 對話框右上角「⋯」→ Customizations,可以看到目前生效的 Rules 與 Skills。
AGENTS.md(課程規則)
# 課程規則(程式設計三) 這份檔案放在專案根目錄,Antigravity 每次對話都會遵守。 ## 工作方式 - 每次開始工作前,先讀 PROJECT.md,依照裡面的頁面、資料表與驗收標準實作。 - 一次只做一條功能。完成後停下來,告訴我怎麼手動測試,等我確認再做下一條。 - 只修改和這次任務相關的檔案,不要重寫整個專案,也不要順手改其他功能。 - 用繁體中文說明你做了什麼、改了哪些檔案,以及每個檔案改動的原因。 ## 程式品質 - SQL 一律使用參數(SQLite 用 ?,Postgres 用 %s),不可以用字串拼接或 f-string 組 SQL。 - 使用者輸入一定要在伺服器端檢查,不能只靠網頁表單。 - 測試失敗時,先說明原因;不要為了讓測試通過而修改測試的預期結果。 ## 安全 - 不要要求我把密碼、token、API 金鑰貼到對話框。需要登入時,告訴我要在瀏覽器或終端機做什麼,由我自己完成。 - 金鑰與資料庫連線字串只放在 .env 或 Vercel 的環境變數,.env 必須列在 .gitignore。 - 不要執行 git push --force、git reset --hard,也不要刪除 GitHub 儲存庫或 Vercel 專案。 - 專案資料夾只放虛構或範例資料。
git-save/SKILL.md
--- name: git-save description: 建立 Git 存檔點(commit)。當使用者說「存檔」「commit」「建立存檔點」,或一條功能已經對過答案、要保存目前進度時使用。 --- # 建立存檔點 依照下列順序執行,每一步都用繁體中文回報結果。 1. 執行 `git status`,列出這次有哪些檔案被新增、修改或刪除。 2. 檢查是否有不該存檔的檔案:`.env`、`.venv/`、`instance/`、`__pycache__/`、資料庫檔(`*.db`)。如果出現在待存檔清單中,先停下來告訴我,並建議加入 `.gitignore`,不要存檔。 3. 如果專案有 `tests/` 資料夾,執行 `python -m pytest -q`。有測試失敗就停下來說明原因,不要存檔。 4. 用一兩句話摘要這次的改動,請我確認存檔訊息。訊息格式:`功能N:功能名稱` 或 `修正:問題描述`。 5. 執行 `git add -A` 與 `git commit -m "<訊息>"`。 6. 如果 PROJECT.md 有「功能進度」,把完成的項目打勾,並一起存檔。 7. 最後執行 `git log --oneline -5` 給我看。 不要執行 `git push`;要推上 GitHub 請使用 github-publish skill。
github-publish/SKILL.md
--- name: github-publish description: 把專案推上 GitHub。當使用者說「推上 GitHub」「push」「備份到 GitHub」「建立 GitHub 儲存庫」時使用。第一次推送會建立新的儲存庫,之後只推送新的存檔點。 --- # 推上 GitHub 使用 GitHub CLI(gh)。全程不可以要求使用者提供密碼或 token。 ## 1. 檢查登入狀態 執行 `gh auth status`。 - 如果顯示未登入:停下來,請使用者自己在終端機執行 `gh auth login`(選 GitHub.com → HTTPS → Login with a web browser),完成後再繼續。不要替使用者執行登入。 - 如果找不到 gh 指令:請使用者到 https://cli.github.com 安裝,安裝後重新開啟 Antigravity。 ## 2. 推送前檢查 - `git status` 必須是乾淨的(所有修改都已存檔);如果不是,先請使用者用 git-save 存檔。 - 確認 `.gitignore` 排除 `.env`、`.venv/`、`instance/`、`__pycache__/`、`*.db`。 - 用 `git ls-files` 確認沒有任何 .env 或金鑰檔已經被追蹤。若有,停下來說明怎麼移除,不要推送。 ## 3. 推送 - 執行 `git remote -v`。 - **還沒有遠端(第一次)**:詢問使用者儲存庫名稱與 Public/Private,然後執行 `gh repo create <名稱> --<public 或 private> --source=. --remote=origin --push` - **已經有遠端**:執行 `git push`。 ## 4. 回報 - 執行 `gh repo view --json url -q .url` 取得儲存庫網址,告訴使用者。 - 如果這個儲存庫已連結 Vercel,提醒使用者:推送後 Vercel 會自動開始部署,大約 1 分鐘後到 Vercel 的 Deployments 頁面確認狀態。 禁止:`git push --force`、刪除或改名遠端儲存庫、修改其他人的儲存庫。
vercel-deploy-check/SKILL.md
--- name: vercel-deploy-check description: 部署到 Vercel 之前的檢查清單,以及部署後的線上驗收。當使用者說「準備上線」「部署到 Vercel」「上線前檢查」,或部署失敗需要找原因時使用。 --- # Vercel 上線前檢查 逐項檢查,用表格回報每一項的結果(通過/未通過/不適用)與修正建議。未經使用者同意,不要自行修改檔案。 ## A. 靜態網站(只有 HTML/CSS/JS) 1. 根目錄有 `index.html`。 2. 網頁中的連結與圖片都使用相對路徑,而且檔名大小寫和實際檔案一致(Vercel 主機會區分大小寫)。 ## B. Flask 網站 1. 入口檔是根目錄的 `app.py`(或 index.py、main.py),裡面有名為 `app` 的 Flask 物件。 2. `requirements.txt` 列出所有用到的套件(至少 flask;使用 Postgres 時要有 psycopg)。 3. 圖片、CSS 等靜態檔案放在 `public/` 資料夾。 4. **資料庫**:Vercel 主機上的檔案是暫時的,SQLite 寫入的資料會消失。 - 程式要能在環境變數 `DATABASE_URL` 存在時連線到 Postgres(Neon),不存在時使用本機 SQLite。 - 列出 SQLite 與 Postgres 語法不同的地方:參數符號 ? 與 %s、自動編號欄位、日期函式、ROUND(AVG(...)) 需要轉成 numeric。 5. 本機執行 `python -m pytest -q` 全部通過。 ## C. 安全 1. `.env`、`.venv/`、`instance/`、`*.db` 都在 `.gitignore` 中,而且 `git ls-files` 中看不到它們。 2. 程式碼中沒有寫死任何密碼、token、連線字串;一律從環境變數讀取。 3. 說明哪些環境變數要到 Vercel 專案的 Settings → Environment Variables 設定(Neon 由 Marketplace 加入時會自動設定 DATABASE_URL)。 ## D. 部署後驗收 部署完成後,請使用者提供網址,然後列出要在瀏覽器手動確認的項目: - 首頁能打開,資料有顯示(代表資料庫連線成功)。 - 新增一筆資料後重新整理,資料仍在(代表寫入的是雲端資料庫,不是暫時檔案)。 - 用手機打開一次。 - 失敗時,請使用者到 Vercel 專案的 Deployments → 點該次部署 → Logs,把錯誤訊息貼給你分析。
套件中的 skill 是「範例答案」。建議第 1 週先讓學生用完整版提示詞操作一次,體會每一步在做什麼;第 4 週開始做吃貨站時再安裝套件,讓學生感受到「把重複的流程寫成 skill」帶來的差別。
自己建立 Skill
當你發現自己第三次貼上同一段提示詞時,就是把它變成 skill 的時候。
Skill 的結構
- 在專案的
.agents/skills/底下建立一個資料夾,名稱用小寫英文與連字號,例如weekly-log。 - 在資料夾裡建立
SKILL.md:開頭的description是最重要的一行,要寫出「做什麼」與「什麼時候用」;下面寫步驟、何時要停下來問你、禁止事項。 - 需要的話,可以在同一個資料夾放
resources/(範本、資料)或scripts/(AI 可以執行的程式)。
Skill 範本(practice/antigravity-kit/skill-template/)
--- name: my-skill description: (一句話說明這個 skill 做什麼,以及「什麼時候」要使用它。AI 只看這一句決定要不要用,所以要寫出使用者可能會說的話,例如:當使用者說「整理週誌」時使用。) --- # (skill 的名稱) ## 目的 (這個 skill 要解決什麼重複發生的問題?) ## 步驟 1. (第一步要做什麼、執行什麼指令、讀哪個檔案) 2. (第二步) 3. (怎麼回報結果:表格、清單,或一句話) ## 什麼時候要停下來問我 - (例如:要刪除檔案之前、測試失敗時) ## 禁止 - (例如:不可以修改 tests/ 裡的檔案)
請 AI 幫你寫 Skill
我每週上課最後都要寫「每週進度紀錄」:讀 PROJECT.md 和 git log,整理本週完成的功能、對應的存檔點、還沒完成的項目,「AI 犯的錯」與「我怎麼發現的」兩格留白讓我自己寫。 請幫我把這件事做成一個 Antigravity skill: 1. 建立 .agents/skills/weekly-log/SKILL.md 2. description 要寫出我可能會說的話,例如「整理週誌」「寫進度紀錄」 3. 步驟要具體到執行哪個指令、讀哪個檔案、用什麼格式回報 4. 寫明什麼情況要停下來問我 完成後說明這個 skill 什麼時候會被觸發,並建議我用哪一句話測試它。
練習:做一個屬於你的 Skill
| 點子 | description 可以這樣寫 |
|---|---|
| 每週進度紀錄 | 整理本週進度紀錄。當使用者說「整理週誌」「寫進度紀錄」時使用。 |
| 新增一條功能的固定流程 | 依 PROJECT.md 實作一條新功能。當使用者說「做下一條功能」時使用。 |
| Demo 前檢查 | Demo 發表前檢查公開網址與示範資料。當使用者說「準備 Demo」時使用。 |
測試方法:開一個新的對話,只說 description 裡寫的那句話,看 AI 有沒有照你的步驟做。沒有被觸發時,通常是 description 寫得太籠統。
其他 AI 工具的 Skill:Claude Code 與 Codex
Skill 不是 Antigravity 獨有的功能。Anthropic 在 2025 年把 SKILL.md 的格式公開成 Agent Skills 開放標準,Claude Code、OpenAI Codex、Antigravity 都採用同一種寫法:一個資料夾、一個 SKILL.md、開頭寫 name 與 description。你寫的 skill,換工具也帶得走。
| Antigravity(本課程) | OpenAI Codex | Claude Code | |
|---|---|---|---|
| 專案的 skill 放在 | .agents/skills/ | .agents/skills/ | .claude/skills/ |
| 個人(所有專案) | ~/.gemini/config/skills/ | ~/.agents/skills/ | ~/.claude/skills/ |
| 每次都遵守的規則 | AGENTS.md | AGENTS.md | CLAUDE.md |
| 自動使用 | 依 description 判斷 | 依 description 判斷 | 依 description 判斷 |
| 手動指定 | 在提示詞寫出 skill 名稱 | 輸入 $skill名稱,或 /skills 選單 | 輸入 /skill名稱 |
| 內建、可直接用的 skill | — | $skill-creator(幫你寫 skill)、$skill-installer(安裝精選 skill) | /code-review、/debug、/verify、/run 等;skill-creator 以外掛安裝 |
| 分享給別人 | 放進 Git 儲存庫 | 打包成外掛(plugin) | 打包成外掛,從 marketplace 安裝 |
課程套件可以直接沿用:Codex 讀的位置和 Antigravity 完全相同,複製過去就能用。Claude Code 只要換個資料夾:把 .agents/skills/ 底下的三個資料夾複製到 .claude/skills/,再建立一個 CLAUDE.md,內容只寫一行 @AGENTS.md(Claude Code 會把它引入的檔案一起當成規則)。
推薦的 Skill
| Skill | 工具 | 什麼時候用 | 推薦度 |
|---|---|---|---|
| 本課程套件:git-save、github-publish、vercel-deploy-check | 三者皆可 | 每天的存檔、推送、上線 | 必裝 |
| skill-creator | Codex 內建;Claude Code 以外掛安裝 | 把重複的提示詞變成 skill。它會先問你要什麼,再寫出結構完整的 SKILL.md | 非常推薦,學寫 skill 最快的方法 |
| /code-review、/debug | Claude Code 內建 | 存檔前請 AI 找出改動中的錯誤;程式出錯時有系統地找原因 | 推薦,對應課程的「審查 AI 程式」 |
| 文件類 skill:docx、pptx、xlsx、pdf | Anthropic 官方範例(anthropics/skills) | 期末專題要交 Word 報告或 PowerPoint 簡報時 | 期末報告時好用 |
| $skill-installer | Codex 內建 | 安裝 OpenAI 整理的精選 skill | 進階,安裝前先讀內容 |
安裝別人的 skill 前,一定要先讀過 SKILL.md。skill 可以附帶腳本,AI 會照著執行。只安裝來源可信的 skill:你自己寫的、課程提供的,或工具官方發布的。
網路上的「精選 skill 清單」更新很快,也常有沒人維護的。看到推薦時,先確認它的來源和最後更新時間。
課堂統一使用 Antigravity,但有些學生自己在用 Claude Code 或 Codex。告訴他們:課程套件、提示詞模板、PROJECT.md 都是通用的,換工具不影響作業。評量看的是 PROJECT.md、測試與 AI 協作紀錄,不看用哪個工具。
常見狀況
gh auth login 之後,git push 還是要求輸入帳號密碼
在終端機執行一次 gh auth setup-git,讓 Git 改用 gh 的登入資訊。
Vercel 的 Import 清單裡找不到我的儲存庫
Vercel 的 GitHub App 只被允許存取部分儲存庫。在匯入畫面點選調整 GitHub App 權限的連結(會跳到 GitHub 的設定頁),把該儲存庫加進「Repository access」後存檔。
網站部署成功,但打開是 404
靜態網站:確認根目錄有 index.html,而且檔名是小寫。Flask 網站:確認入口檔是根目錄的 app.py,裡面的 Flask 物件叫做 app。
線上新增的資料,過一陣子就不見了
網站還在使用 SQLite。Vercel 主機上的檔案是暫時的,必須改用 Neon 雲端資料庫,見第 8 週。