GitHub Copilot CLI 最佳实践
GitHub Copilot CLI 已经不是“在终端里问几句 shell 命令”的小工具。GitHub 官方现在把它定位成 terminal-native AI coding assistant:它可以读代码、写文件、跑命令、管理 PR、调用子 agent、接 MCP/LSP、进入 autopilot,并通过 GitHub.com 或 GitHub Mobile 远程跟进会话。
先明确它适合做什么
Copilot CLI 最适合处理仓库级任务,而不是替代 IDE 里的行内补全。
适合 CLI 的任务:
- 理解陌生仓库或模块
- 制定实现计划
- 小到中等规模的跨文件修改
- 补测试、跑测试、修 lint
- 代码审查和 PR 修复
- 自动生成报告、摘要、文档
- 把明确任务委托给后台 agent
不适合 CLI 的任务:
- 精确到一两行的即时编辑
- 没有边界的“帮我重构整个系统”
- 生产环境直接操作
- 需要人工持续判断方向的探索
- 你不愿意 review diff 的改动
把它当成“能操作终端的工程同事”,而不是“无需监督的自动开发者”,使用体验会稳定很多。
安装和认证:先更新旧认知
官方文档当前给出的安装前提是:
- 有可用的 GitHub Copilot 订阅或计划
- 如果由组织或企业提供 Copilot,管理员没有禁用 Copilot CLI policy
- 使用 npm 安装时需要 Node.js 22 或更高版本
- Windows 使用时需要 PowerShell v6 或更高版本
常见安装方式:
# npm,跨平台
npm install -g @github/copilot
# macOS / Linux
brew install copilot-cli
# Windows
winget install GitHub.Copilot
# macOS / Linux install script
curl -fsSL https://gh.io/copilot-install | bash常用维护命令:
copilot login
copilot version
copilot update
copilot logout第一次在仓库目录里启动时:
copilotCLI 会要求你确认是否信任当前目录。这个提示不要当形式:在一次 CLI 会话中,Copilot 可能读取、修改并执行当前目录及其子目录里的文件。只在你信任的仓库里启动它。
第一件事:生成并维护自定义指令
Copilot CLI 支持多种 custom instructions。最实用的是仓库级指令:
copilot init或在交互会话里:
/init它会分析仓库并创建或更新 .github/copilot-instructions.md。这个文件应该记录 Copilot 很难从代码里稳定推断、但每次都应该遵守的信息。
建议写:
# Build and validation
- Run `pnpm test` after TypeScript logic changes.
- Run `pnpm lint` before finishing.
- Run `pnpm prisma generate` after schema changes.
# Constraints
- Do not change public API response shapes without approval.
- Do not add production dependencies unless requested.
- Do not push to remote branches unless explicitly asked.
# Patterns
- Follow `src/orders/validation.ts` for request validation.
- Follow `src/jobs/send-digest.ts` for background jobs.官方支持的几类指令大致是:
| 文件 | 用途 |
|---|---|
.github/copilot-instructions.md |
仓库级通用指令 |
.github/instructions/**/*.instructions.md |
路径级或模块级指令 |
AGENTS.md |
agent 共享指令,可在仓库根目录、当前目录或 COPILOT_CUSTOM_INSTRUCTIONS_DIRS 指定目录中使用 |
~/.copilot/copilot-instructions.md |
本机全局指令 |
经验上,指令文件不要写成公司制度汇编。写命令、边界、目录职责和参考模式;少写“保持高质量”“遵循最佳实践”这类空话。
权限控制:两层开关要分清
Copilot CLI 能执行 shell、读写文件、搜索代码、访问网页、调用 MCP 和启动子 agent。只读操作通常可以自动执行;会修改系统、写文件、访问 URL 或执行破坏性命令的操作需要授权。
权限控制分两层:
- 工具可见性:模型知不知道某类工具存在
- 工具授权:模型选择了工具后,能不能直接执行
限制工具集:
# 禁止 web search / web fetch
copilot --excluded-tools='web_fetch, web_search'
# 只允许常见本地代码工具
copilot --available-tools='bash,edit,view,grep,glob'授权或禁止具体工具:
# 允许所有 git 命令,但禁止 push
copilot --allow-tool='shell(git:*)' --deny-tool='shell(git push)'
# 允许读文件,只允许写一个指令文件
copilot --allow-tool='read, write(.github/copilot-instructions.md)'
# 禁止写文件
copilot --deny-tool=write重要规则:--deny-tool 优先于 --allow-tool,即使你开了 --allow-all。
谨慎使用:
copilot --allow-all-tools
copilot --allow-all
copilot --yolo官方明确建议:这些全开权限只应在隔离环境里使用,不要做成默认 alias。我的默认策略是:允许读和测试,允许本地 git 查看,禁止 git push,涉及联网、写敏感路径、删除文件、安装依赖时手动确认。
会话中途如果授权太多,可以重置:
/reset-allowed-toolsPrompt 要写成可执行任务
Copilot CLI 对清楚任务的响应明显更稳定。一个好 prompt 包含四块:
- Goal:要完成什么
- Context:相关文件、报错、issue、PR、参考实现
- Constraints:不要改什么,必须遵守什么
- Done when:测试、lint、diff、PR 状态或人工验收标准
弱 prompt:
fix checkout更好的 prompt:
Goal:
Reduce duplicate payment validation in src/checkout/.
Context:
- Follow the pattern in src/orders/validation.ts.
- The failing test is checkout-expired-card.test.ts.
Constraints:
- Do not change public API response shapes.
- Do not add production dependencies.
Done when:
- Checkout unit tests pass.
- Final answer lists changed files and remaining risks.这类结构化 prompt 的核心价值不是“礼貌”,而是减少模型猜测和后续审查成本。
Plan 模式:复杂任务默认先计划
官方最佳实践强调 Plan mode:先生成结构化实现计划,确认后再写代码。
进入方式:
/plan Add OAuth2 authentication with Google and GitHub providers或在交互界面按 Shift+Tab 切换到 plan mode。计划会保存到当前 session 的 plan.md,你还可以按 Ctrl+Y 用默认 Markdown 编辑器修改计划。
适合先 Plan 的任务:
- 新功能
- 多文件重构
- 数据库迁移
- 权限、支付、鉴权、审计逻辑
- CI/CD 或部署脚本改动
- 你自己也还没完全想清楚的需求
推荐流程:
Read the relevant files. Do not edit yet./plan ...- 审计划,指出遗漏和边界
- 批准后实现
- 跑测试和 lint
/review审 diff
不要把 Plan 模式当成形式。它真正有用的地方,是把“方向错了”的发现提前到写代码之前。
Autopilot:只交给边界清楚的任务
Autopilot 会让 Copilot 在给定初始指令后持续执行多步任务,直到任务完成、遇到阻塞、被你中止,或达到 --max-autopilot-continues 上限。
适合:
- 按已确认计划实现
- 补测试
- 修 CI failure
- 批量格式化和简单重构
- 明确输入输出的脚本任务
不适合:
- 开放式探索
- 需求模糊的新功能
- 需要你持续判断取舍的设计
- 高风险生产操作
程序化调用时可以这样限制 runaway loop:
copilot --autopilot --max-autopilot-continues 10 \
--allow-tool='shell(npm:*), shell(git:*), write' \
--deny-tool='shell(git push)' \
-p "Run the test suite, fix failures in src/auth/, and summarize the diff."不要把 Autopilot 和 --allow-all 混为一谈。Autopilot 是“持续推进任务”的行为模式;--allow-all 是“权限全开”的安全选择。两者可以一起用,但风险也会叠加。
/fleet:只并行真正独立的工作
/fleet 会让主 agent 分析任务,把可拆分的部分交给并行子 agent,并由主 agent 协调依赖。
适合:
- 给多个独立模块补测试
- 并行审查不同目录
- 多个互不依赖的文档更新
- 多方案探索,然后人工选择
不适合:
- 多个 agent 同时改同一批文件
- 任务之间有强顺序依赖
- 共享抽象还没定,就让多个子任务依赖它
示例:
/fleet Write unit tests for src/users, src/orders, and src/payments.
Each subtask owns only its directory. Do not edit shared test helpers.
Run the relevant test command for each module and summarize failures.使用 /fleet 的关键是写清“谁拥有哪个目录”和“哪些文件不能碰”。否则并行会把速度优势变成合并成本。
/review 和 /pr:把审查接进日常流
Copilot CLI 内置 code-review agent,可以用 /review 审查当前分支或指定 diff:
/review the changes on this branch compared to main.
Focus on correctness, security, regression risk, and missing tests.
Do not comment on style unless it hides a bug.PR 工作流可以用:
/pr
/pr create
/pr fix feedback
/pr fix conflicts
/pr fix ci
/pr auto官方文档说明 /pr fix feedback、/pr fix conflicts、/pr fix ci、/pr auto 可能提交并 push,因此仍应让权限策略保留最后确认。
我的建议:
- 本地先
/review - CI 后再
/pr fix ci - 对
git push保持手动确认 - 对自动修改的 review feedback 再看一次 diff
MCP、LSP、Skills:只接能提高命中率的工具
Copilot CLI 支持多种扩展能力,但不要一上来全装。
MCP:接外部工具和上下文
MCP 可以给 CLI 接外部工具、数据源和服务。GitHub MCP server 已经内置;其他 MCP 可以用 /mcp add 或配置文件添加。
适合接 MCP 的场景:
- issue/PR/CI 状态在 GitHub
- 需求在 Linear/Jira
- 运行环境信息在内部服务
- 文档在外部知识库
- 需要真实调用工具,而不是复制一段文本
判断标准:这个上下文是否经常变、是否会重复使用、是否比粘贴到 prompt 更可靠。
LSP:让重构和跳转更准
LSP server 能给 CLI 提供定义跳转、引用查找、hover、rename、document symbols、workspace symbols 等结构化能力。对于大型 TypeScript、Go、Python、Java 项目,它比纯文本搜索更稳。
如果你经常让 Copilot CLI 做跨文件重命名、查引用、理解类型关系,优先配置 LSP。
Skills 和 custom agents
Skills 适合沉淀重复方法,比如:
- PR review checklist
- release notes 草稿
- migration plan
- incident summary
- dependency upgrade review
Custom agents 适合明确角色,比如 test-writer、security-reviewer、docs-maintainer。不要为每个临时偏好都做 agent;先把稳定流程写进指令文件,重复三次以上再技能化。
模型选择:不要写死旧列表
GitHub Copilot 支持的模型变化很快。官方模型页会按 client 和 plan 列出可用模型;Auto model selection 也会随策略、区域、企业限制和 model policy 调整。
实践建议:
- 默认用 Auto 或当前 CLI 默认模型
- 复杂重构、调试、架构判断再手动切更强模型
- 快速搜索、摘要、简单文档用轻量模型
- 在脚本和 CI 里显式设置
--model,保证输出稳定 - 用
/model查看当前可选模型和 premium request multiplier
如果要接自有模型供应商,官方 BYOK 文档要求模型支持 tool calling/function calling 和 streaming;最佳效果建议至少 128k context window。配置通过 COPILOT_PROVIDER_BASE_URL、COPILOT_PROVIDER_TYPE、COPILOT_PROVIDER_API_KEY、COPILOT_MODEL 这类环境变量完成。
注意安全规则:文章和仓库里只写变量名,不写真实 key。
Rubber Duck:实验性的第二意见
GitHub Blog 在 2026-04-06 介绍了 Copilot CLI 的 Rubber Duck 实验功能。它会用另一个模型家族作为独立 reviewer,在高价值节点批评主 agent 的计划、实现或测试。
适合使用:
- 复杂重构
- 高风险架构改动
- 测试覆盖是否充分
- 你怀疑当前方案有盲点
使用前提:
- 这是 experimental mode
- 需要在 CLI 内使用
/experimental - 当前 GitHub 描述中,Claude family orchestrator 可搭配 GPT-5.4 作为 Rubber Duck;实际可用性仍受模型访问权限影响
它不是魔法。Rubber Duck 的价值是增加一个不同视角,不能替代测试、CI 和人工 review。
非交互式和 GitHub Actions
Copilot CLI 可以直接用 -p 或管道运行,不进入交互界面:
copilot -p "Explain this file: ./complex.ts"
echo "Explain this file: ./complex.ts" | copilot脚本里常用参数:
| 参数 | 用途 |
|---|---|
-p, --prompt |
直接传入 prompt |
-s, --silent |
输出更干净,便于脚本捕获 |
--no-ask-user |
禁止交互式追问 |
--model |
固定模型 |
--allow-tool |
最小授权 |
--allow-url |
最小 URL 访问授权 |
--output-format=json |
输出 JSONL |
示例:
copilot -p '/review the changes on this branch compared to main. Focus on bugs and security issues.' \
-s --allow-tool='shell(git:*)'GitHub Actions 中可以安装 CLI、设置 COPILOT_GITHUB_TOKEN,再用 copilot -p ... 执行。官方示例使用带 “Copilot Requests” 权限的 fine-grained PAT 存为 Actions secret。
自动化任务要更保守:
- prompt 要精确
- 权限要最小
- 加 timeout
- 输出写到 artifact 或 step summary
- 不要让模糊 prompt 自动改代码并 push
远程会话:适合长任务监控
Remote access 允许你从 GitHub.com 或 GitHub Mobile 查看并控制正在本机运行的 CLI 会话,适合长任务中途离开电脑时监控进度、回应追问或批准权限请求。
常用方式:
/remote或启动时:
copilot --remote注意它目前是 public preview。官方还说明:会话必须仍在本机终端里运行,机器要在线,工作目录要是 GitHub.com 上的 Git 仓库。长任务最好配合 /keep-alive,避免机器睡眠。
一个稳定的日常工作流
我建议把 Copilot CLI 用成这套节奏:
copilot init生成并维护仓库指令。- 为当前任务写清目标、上下文、约束和完成条件。
- 复杂任务先
/plan,不要直接开改。 - 确认计划后再实现,必要时切 Autopilot。
- 可并行任务才用
/fleet。 - 完成后跑测试、lint、type check。
- 用
/review做第一轮审查。 - 用
/pr管理 PR,但对 commit/push 保持确认。 - 重复出现的问题写回
.github/copilot-instructions.md、AGENTS.md或 skill。
常见反模式
反模式 1:默认 yolo
把 copilot --yolo 做成 alias 是高风险行为。它让 Copilot 在每个仓库里默认拥有过大权限。
反模式 2:没有指令文件
每次 prompt 里重复解释构建命令、lint 命令、commit 规范,就是应该写进 .github/copilot-instructions.md 的信号。
反模式 3:模糊任务进 Autopilot
Autopilot 适合执行清楚计划,不适合帮你发现需求本身。
反模式 4:并行修改同一块代码
/fleet 的前提是任务之间写入范围独立。否则最后会变成合并和回滚成本。
反模式 5:脚本里全开权限
CI 里应使用 --no-ask-user 和最小 --allow-tool,而不是为了省事直接 --allow-all。
反模式 6:把模型列表写死
模型可用性和计费会变。文章、文档和团队规范里应该写选择原则,而不是把某个时间点的完整列表当永久事实。
结论
Copilot CLI 的核心价值不是“问命令”,而是把终端、GitHub、仓库上下文、子 agent、MCP/LSP、代码审查和自动化连成一个可监督的 agent workflow。
最有效的用法也不是追求最大权限或最长自主执行,而是:
- 用指令文件沉淀团队规则
- 用 Plan mode 降低方向错误
- 用最小权限控制风险
- 用 LSP/MCP 提升上下文质量
- 用
/review和测试闭环验收结果 - 只把边界清楚的任务交给 Autopilot 或
/fleet
这样用,Copilot CLI 才会从“很会猜的终端聊天工具”,变成真正能接进日常工程流的 coding agent。
参考资源
- GitHub Copilot CLI
- Getting started with GitHub Copilot CLI
- Installing GitHub Copilot CLI
- Best practices for GitHub Copilot CLI
- GitHub Copilot CLI command reference
- Allowing and denying tool use
- Adding custom instructions for GitHub Copilot CLI
- Allowing GitHub Copilot CLI to work autonomously
- Running tasks in parallel with the /fleet command
- Adding MCP servers for GitHub Copilot CLI
- Using LSP servers with GitHub Copilot CLI
- Running GitHub Copilot CLI programmatically
- Automating tasks with Copilot CLI and GitHub Actions
- Supported AI models in GitHub Copilot
- Using your own LLM models in GitHub Copilot CLI
- About remote access to GitHub Copilot CLI sessions
- Managing pull requests with the /pr command
- GitHub Copilot CLI combines model families for a second opinion