
如果 AI 能看見你的整個程式碼庫,而不是一次只看一個檔案,會怎麼樣?
在本章,你將解鎖 GitHub Copilot CLI 的真正威力:情境。你將學會使用 @ 語法來參照檔案與目錄,讓 Copilot CLI 深入理解你的程式碼庫。你會發現如何在多個會話間維持對話、在數天後精確地從上次中斷處繼續工作,以及跨檔案分析如何捕捉單檔審查完全漏掉的錯誤。
本章結束時,你將能夠:
@ 語法參照檔案、目錄與圖片--resume 和 --continue 恢復先前的會話⏱️ 預估時間:約 50 分鐘(20 分鐘閱讀 + 30 分鐘實作)

就像你的同事一樣,Copilot CLI 並不是讀心術高手。提供更多資訊能幫助人類和 Copilot 都能給出更精準的協助!
想像你在向同事解釋一個錯誤:
沒有情境:「書籍應用程式不能用。」
有情境:「請看
books.py,特別是find_book_by_title函式。它沒有做不分大小寫的比對。」
要給 Copilot CLI 提供情境,請用 @ 語法 指向特定檔案。

本節涵蓋你有效運用情境所需的一切。先掌握這些基本功。
@ 符號用於在提示中參照檔案與目錄。這就是你告訴 Copilot CLI「請看這個檔案」的方式。
💡 注意:本課程所有範例都使用此儲存庫內的
samples/資料夾,你可以直接嘗試每個指令。
你可以用你電腦上的任何檔案來試試看:
copilot
# 指向你擁有的任何檔案
> Explain what @package.json does
> Summarize @README.md
> What's in @.gitignore and why?
💡 沒有現成專案? 快速建立測試檔案:
echo "def greet(name): return 'Hello ' + name" > test.py copilot > What does @test.py do?
| 模式 | 功能說明 | 使用範例 |
|---|---|---|
@file.py |
參照單一檔案 | Review @samples/book-app-project/books.py |
@folder/ |
參照目錄內所有檔案 | Review @samples/book-app-project/ |
@file1.py @file2.py |
參照多個檔案 | Compare @samples/book-app-project/book_app.py @samples/book-app-project/books.py |
copilot
> Explain what @samples/book-app-project/utils.py does
copilot
> Compare @samples/book-app-project/book_app.py and @samples/book-app-project/books.py for consistency
copilot
> Review all files in @samples/book-app-project/ for error handling
這就是情境變成超能力的地方。單檔分析很有用,跨檔案分析則是質的飛躍。

copilot
> @samples/book-app-project/book_app.py @samples/book-app-project/books.py
>
> How do these files work together? What's the data flow?
💡 進階選項:想要安全性導向的跨檔案分析,可試試 Python 安全範例:
> @samples/buggy-code/python/user_service.py @samples/buggy-code/python/payment_processor.py > Find security vulnerabilities that span BOTH files
Copilot CLI 發現的內容:
跨模組分析
==========
1. 資料流模式
book_app.py 建立 BookCollection 實例並呼叫方法
books.py 定義 BookCollection 類別並管理資料持久化
流程:book_app.py(UI)→ books.py(商業邏輯)→ data.json(儲存)
2. 重複的顯示函式
book_app.py:9-21 show_books() 函式
utils.py:28-36 print_books() 函式
影響:兩個幾乎相同的函式做同樣的事。如果你更新其中一個(例如更改格式),必須記得同步另一個。
3. 不一致的錯誤處理
book_app.py 處理 year 轉換的 ValueError
books.py 發生錯誤時靜默回傳 None/False
模式:各模組間沒有統一的錯誤處理方式
為什麼這很重要:單檔審查會錯過全局問題。只有跨檔案分析才能揭露:

初次接觸專案?用 Copilot CLI 快速了解它。
copilot
> @samples/book-app-project/
>
> In one paragraph, what does this app do and what are its biggest quality issues?
你會得到:
這是一個 CLI 書籍收藏管理器,讓使用者能新增、列出、移除與搜尋儲存在 JSON 檔案中的書籍。最大品質問題包括:
1. 重複顯示邏輯 - show_books() 和 print_books() 做同樣的事
2. 不一致的錯誤處理 - 有些錯誤會丟出例外,有些回傳 False
3. 沒有輸入驗證 - year 可以是 0,title/author 可接受空字串
4. 缺乏測試 - 關鍵函式如 find_book_by_title 沒有測試覆蓋
優先修正:整合重複顯示函式並加入輸入驗證。
結果:原本需一小時閱讀的程式碼,濃縮成 10 秒。你知道該聚焦在哪裡。
copilot
> @samples/book-app-project/books.py Review this file for potential bugs
# Copilot CLI 現在擁有完整檔案內容,能給出具體回饋:
# "Line 49: Case-sensitive comparison may miss books..."
# "Line 29: JSON decode errors are caught but data corruption isn't logged..."
> What about @samples/book-app-project/book_app.py?
# 現在審查 book_app.py,但仍記得 books.py 的情境
copilot
> @samples/book-app-project/books.py What does this module do?
# Copilot CLI 讀取 books.py 並理解 BookCollection 類別
> @samples/book-app-project/ Give me an overview of the code structure
# Copilot CLI 掃描目錄並摘要
> How does the app save and load books?
# Copilot CLI 能追蹤它已讀過的程式碼
copilot
> @samples/book-app-project/book_app.py @samples/book-app-project/utils.py
> I see duplicate display functions: show_books() and print_books(). Help me consolidate these.
# Copilot CLI 同時看到兩個檔案,能建議如何合併重複程式碼
會話會自動儲存。你可以恢復先前的會話,從中斷處繼續。
每次對話都會自動儲存。只要正常離開即可:
copilot
> @samples/book-app-project/ Let's improve error handling across all modules
[... 進行一些工作 ...]
> /exit
# 從上次中斷處繼續
copilot --continue
# 互動式選擇會話清單
copilot --resume
# -r 是 --resume 的簡寫(省打字!)
copilot -r
# 或用 ID 恢復特定會話
copilot --resume=abc123
# 或用你命名的會話名稱恢復
copilot --resume="my book app review"
💡 怎麼找到會話 ID? 不需要記住它們。執行
copilot --resume不帶 ID 會顯示互動式清單,包含你所有先前會話、名稱、ID 與最後活躍時間。直接選你要的即可。多個終端機怎麼辦? 每個終端機視窗都是獨立會話,有自己的情境。如果你在三個終端機開啟 Copilot CLI,就是三個獨立會話。從任何終端機執行
--resume都能瀏覽全部。--continue旗標會先抓取目前工作目錄的會話;若沒有,則選最近活躍的會話。能不重啟就切換會話嗎? 可以。在活躍會話內用
/resumeslash 指令:> /resume # 顯示可切換的會話清單
給會話有意義的名稱,方便日後查找。你可以在啟動時命名會話,或在會話內隨時重新命名:
# 啟動時直接命名會話
copilot --name book-app-review
# 或在會話內重新命名
copilot
> /rename book-app-review
# 會話已重新命名,方便辨識
命名後,你可以直接用名稱恢復會話,無需瀏覽清單:
copilot --resume=book-app-review
要清除不再需要的會話,可在會話內用 /session delete:
copilot
> /session delete # 刪除目前會話
> /session delete abc123 # 刪除指定 ID 的會話
> /session delete-all # 刪除所有會話(請小心使用!)
會話會儲存你的對話歷史,但 記憶 更進一步,讓 Copilot CLI 能在所有會話間記住偏好與事實,而不僅限於單一會話。
copilot
> /memory show
# 顯示 Copilot CLI 目前記得你與專案的內容
> /memory on
# 開啟記憶(若你的帳號支援則預設開啟)
> /memory off
# 關閉記憶(若你偏好每次都全新開始)
例如,你告訴 Copilot CLI「我偏好用 pytest 做 Python 測試」,它能記住這個偏好,未來會自動套用。你不用每次重複。
💡 記憶 vs. 會話:會話儲存對話歷史,方便你恢復特定任務。記憶則儲存可重用的儲存庫事實與使用者偏好,Copilot 未來工作時可自動套用。想像會話是任務筆記本,記憶則是 Copilot 可帶著走的可重用情境。
隨著你加入檔案與對話,Copilot CLI 的 情境窗口 會逐漸填滿。有多種指令可協助你掌控:
copilot
> /context
Context usage: 62k/200k tokens (31%)
> /clear
# 放棄目前會話(不儲存歷史),開始全新對話
> /new
# 結束目前會話(儲存到歷史以便搜尋/恢復),開始全新對話
> /rewind
# 開啟時間軸選擇器,讓你回到對話中較早的某個點
💡 何時用
/clear或/new:如果你剛審查完 books.py,想切換討論 utils.py,先執行 /new(或 /clear 若不需會話歷史)。否則舊主題的情境可能會讓回應混亂。
💡 犯錯或想嘗試不同路線? 用
/rewind(或按兩次 Esc)開啟時間軸選擇器,可回到對話中任何較早的點,不只最近一次。這很適合走錯路時回溯,而不用完全重來。

會話在你離開時自動儲存。數天後恢復,完整情境:檔案、問題、進度都記得。
想像這樣的多日工作流程:
# 週一:一開始就命名書籍應用程式審查會話
copilot --name book-app-review
> @samples/book-app-project/books.py
> Review and number all code quality issues
品質問題清單:
1. 重複顯示函式(book_app.py & utils.py)- 中等
2. 空字串未驗證 - 中等
3. year 可為 0 或負數 - 低
4. 所有函式缺少型別提示 - 低
5. 缺乏錯誤紀錄 - 低
> Fix issue #1 (duplicate functions)
# 著手修正...
> /exit
# 週三:精確從上次命名的會話繼續
copilot --resume=book-app-review
> What issues remain unfixed from our book app review?
book-app-review 會話剩餘未修正問題:
2. 空字串未驗證 - 中等
3. year 可為 0 或負數 - 低
4. 所有函式缺少型別提示 - 低
5. 缺乏錯誤紀錄 - 低
第 1 項(重複函式)已於週一修正。
> Let's tackle issue #2 next
這有多強大:數天後,Copilot CLI 記得:
不用重新解釋、不用重讀檔案,直接繼續工作。
🎉 你已掌握必備技能! @ 語法、會話管理(--name/--continue/--resume//rename)、情境指令(/context//clear)足以讓你高效工作。以下內容為選修,準備好時再回來。

這些主題建立在上述必備技能之上。挑你感興趣的,或直接跳到 實作練習。
| 我想學… | 跳到 |
|---|---|
| 萬用字元模式與進階會話指令 | 進階 @ 模式與會話指令 |
| 多輪提示如何累積情境 | 情境感知對話 |
Token 限制與 /compact |
理解情境窗口 |
| 如何挑選要參照的檔案 | 挑選參照內容 |
| 分析截圖與設計稿 | 圖片操作 |
*情境窗口就像桌子:一次只能放有限東西。檔案、對話歷史、系統提示都佔空間。*
#### 達到上限時會發生什麼
```bash
copilot
> /context
Context usage: 45,000 / 128,000 tokens (35%)
# 加入更多檔案與對話,這個數字會增加
> @large-codebase/
Context usage: 120,000 / 128,000 tokens (94%)
# 警告:接近情境上限
> @another-large-file.py
Context limit reached. Older context will be summarized.
```
#### `/compact` 指令
情境快滿但不想失去對話時,`/compact` 會摘要你的歷史,釋放 token 空間:
```bash
copilot
> /compact
# 摘要對話歷史,釋放情境空間
# 你的關鍵發現與決策會保留
```
你也可以給 `/compact` 選擇性聚焦指令,決定摘要時優先保留哪些內容:
```bash
copilot
> /compact focus on the list of bugs we found and decisions made
# 摘要歷史,讓錯誤清單與決策突出
```
> 💡 **何時用聚焦指令**:若你的對話涵蓋多主題,聚焦指令能讓 `/compact` 保留最相關部分,避免失去主線。
#### 情境效率小技巧
| 情境 | 行動 | 原因 |
|------|------|------|
| 開始新主題 | `/clear` | 移除無關情境 |
| 走錯路 | `/rewind` | 回到較早的任何點 |
| 長對話 | `/compact` | 摘要歷史,釋放 token |
| 需特定檔案 | `@file.py` 而非 `@folder/` | 只載入所需內容 |
| 達到上限 | `/new` 或 `/clear` | 全新情境 |
| 多主題 | 每主題用 `/rename` | 容易恢復正確會話 |
#### 大型程式碼庫最佳實踐
1. **具體**:用 `@samples/book-app-project/books.py` 取代 `@samples/book-app-project/`
2. **主題間清除情境**:切換焦點時用 `/new` 或 `/clear`
3. **用 `/compact`**:摘要對話,釋放情境空間
4. **多會話並行**:每個功能或主題用一個會話

是時候運用你的情境與會話管理技能了。
本課程提供可直接檢視的範例檔案。啟動 copilot 並執行下列提示:
copilot
> @samples/book-app-project/ 請幫我進行這個專案的程式碼品質審查
# Copilot CLI 會找出以下問題:
# - 重複的顯示函式
# - 缺少輸入驗證
# - 不一致的錯誤處理
💡 想用自己的檔案試試看嗎? 建立一個小型 Python 專案(
mkdir -p my-project/src),加入一些 .py 檔案,然後用@my-project/src/來審查它們。如果需要,也可以請 copilot 幫你產生範例程式碼!
copilot
> /rename book-app-review
> @samples/book-app-project/books.py 我們來為空白書名加入輸入驗證
[Copilot CLI 建議驗證方式]
> 實作這個修正
> 現在整合 @samples/book-app-project/ 中重複的顯示函式
> /exit
# 之後 - 從上次中斷處繼續
copilot --continue
> 為我們做過的變更產生測試
完成示範後,請嘗試以下變化題:
copilot
> @samples/book-app-project/book_app.py @samples/book-app-project/books.py
> 這兩個檔案有什麼關聯?有沒有什麼程式碼異味?
會話挑戰:啟動一個會話,用 /rename my-first-session 命名,進行一些操作,然後用 /exit 離開,再執行 copilot --continue。它還記得你在做什麼嗎?
/context。你用了多少 token?試試 /compact 再檢查一次。(更多關於 /compact 的說明,請見 Going Deeper 章節的 理解情境窗口。)自我檢查:當你能解釋為什麼 @folder/ 比逐一開啟每個檔案更強大時,就代表你已經理解情境的運作。
前面的實作範例著重於程式碼品質審查與輸入驗證。現在請用相同的情境技巧,練習另一個任務:追蹤資料在應用程式中的流動方式:
copilotbooks.py 和 book_app.py:
@samples/book-app-project/books.py @samples/book-app-project/book_app.py 請追蹤一本書從使用者輸入到儲存到 data.json 的流程。每個步驟涉及哪些函式?@samples/book-app-project/data.json 如果這個 JSON 檔案遺失或損毀會發生什麼事?哪些函式會失敗?@samples/book-app-project/books.py @samples/book-app-project/utils.py 請建議一個能在兩個檔案中都適用的一致性錯誤處理策略。/rename data-flow-analysis/exit 離開,再用 copilot --continue 回到會話,並針對資料流提出後續問題成功標準:你能跨多個檔案追蹤資料流動、恢復已命名的會話,並獲得跨檔案的建議。