每次提 Pull Request 还得开网页点创建,GitHub CLI 能在终端做完吗?

分支已经推到远端,提 Pull Request 却还要切到浏览器:点创建、填标题、选要合进哪条分支。看完别人的改动,再切回终端换分支。来回几次,提交本身没占用多少时间,切页面倒占了不少。git 负责提交和推送。托管平台上的创建、指派、检出,可以留在终端里做完。

GitHub CLI 手册 把 gh 写成在终端或脚本里操作 GitHub 的命令行界面。安装入口手册指向仓库 README,这里只谈登录之后怎么创建和检出 Pull Request。只给自己的账号授权,不要拿来路不明的令牌去登别人的仓库。

本机登录

手册对应的入口是 gh auth login。默认主机是 github.com,企业实例加上 --hostname。默认认证是在浏览器里走一遍流程,完成后令牌会存进系统凭据库。找不到凭据库时才会退回到明文文件,存放位置可以用 gh auth status 查看。再加上 --web --clipboard,会打开浏览器,并把一次性设备码拷进剪贴板。

也可以用 --with-token 从标准输入读入个人访问令牌。手册写明,经典令牌至少要有 repo、read:org、gist 这三个范围。细粒度令牌会绑定到特定资源,交互其他资源时容易行为怪异,这种情况手册更建议改用 GH_TOKEN。环境变量里的令牌同样会被读取,更适合无界面的自动化。--git-protocol 用来选定后续 git 操作走 https 还是 ssh。选 ssh 时,它会尝试发现已有密钥,没有就提示生成并上传,可用 --skip-ssh-key 跳过这一步。这些都是给本机、自己的账号用的入口,不是去绕过仓库权限。

创建和检出

gh pr create 成功后会打印出新 Pull Request 的网址,别名是 gh pr new。当前分支还没完全推到远端时,它会询问推到哪里,并在没有推送权限时提供 fork 的选项。标题和正文默认会交互询问。--title / --body 可以直接带上,--fill 则从 git 提交记录自动取标题和正文。这两类写法同时出现时,显式参数会覆盖自动填充。不想在终端里问答,也可以用 --editor:打开编辑器后,第一行当作标题,其余当作正文。--base 指定合入的目标分支,不写则看当前分支的 gh-merge-base 配置,再没有就用仓库默认分支。--draft 可以先开成草稿,--reviewer 和 --assignee 能直接带上审查人和指派人,指派人写成 @me 就指向自己。--web 仍会打开网页,适合还想在页面里改最后一眼的人。正文里写 Fixes #123 或 Closes #123,合并后会关掉对应议题,这是手册写明的关联方式。默认情况下,对目标仓库有写权限的人可以向这条 head 分支继续推送,不想开放这一项时加上 --no-maintainer-edit。创建中途失败时,可以用 --recover 恢复上次输入。

要改别人已经开出的 Pull Request,手册对应的是 gh pr checkout,参数可以是编号、网址或分支名。不带参数时,会从最近十条里交互挑选。官方说明里,仓库中来自 fork 的请求也可以这样检出。需要把这份改动放到另一个目录时,可以用 --worktree 指定路径,和站内写过的 git worktree 是同一类做法,怎么维护这里不展开。本地已有同名分支、只想对齐远端最新状态时,手册提供的是 --force。

日常最小路径往往是这样:在本机登录一次,分支推上去之后直接 gh pr create,按提示填标题和正文,成功后终端里就能拿到网址。别人已经开出来、要在本机接着改时,再 gh pr checkout 带上编号。不必为了创建和切换再反复打开网页。

定时跑工作流是另一条线,跟终端里手动提 Pull Request 不是同一件事,时区问题可以看站内这篇 Actions 定时任务时区。

你们现在提 Pull Request,还是会切到网页上点创建吗?