gh是 GitHub 提供的命令行程序。我很喜欢用。这个命令行设计得比glabtea(分别是 GitLab 和 Gitea 的命令行程序)要好得多,和 git 能有比较紧密的协同。这一工具可以很好地节约我们将代码托管在 GitHub 平台上时,进行日常开发所用的操作。

接下来我将介绍一下这个工具在我日常工作过程中的主要用法。

创建、派生和克隆仓库

给自己创建一个仓库

使用 gh 创建、派生和克隆仓库比直接使用 git 要简便些。

$ cd `mktemp -d` # 新建一个目录到 /tmp 目录下,并 cd 过去。如果你是 Windows 用户,你随便找个目录也行。
# /tmp 目录中的内容会在系统下次启动前清空,所以不用担心在这里制造脏数据
$ git init # 初始化一个仓库
$ gh repo create # 此时出现三个选项

? What would you like to do?  [Use arrows to move, type to filter]
> Create a new repository on github.com from scratch
  Create a new repository on github.com from a template repository
  Push an existing local repository to github.com

这三个选项分别对应:

  • 在 GitHub 上新建一个仓库
  • 通过 GitHub 上的模板仓库,在 GitHub 上创建一个仓库
  • 在 GitHub 上新建一个仓库,并将当前的仓库推送过去

我们选择第三个选项,并依序完成相关引导。「Push an existing local repository to github.com」的缺省值是帮我们创建一个公开仓库到当前账户,仓库名与当前我们所处的文件夹名相同。

? What would you like to do? Push an existing local repository to github.com
? Path to local repository .
? Repository name tmp.SXvUIzts8A
? Repository owner wold9168
? Description
? Visibility  [Use arrows to move, type to filter]
> Public
  Private

克隆一个仓库

gh clone <username>/<reponame> 可以克隆一个仓库。例如:

$ gh repo clone wold9168/wold9168.github.io

这样克隆比 git 简便些,少输入一个github.com,并且默认用 ssh 协议进行克隆。这对于网络连通性较差的用户比较友好。(一些地区通过 HTTPS 协议访问 github.com 会时断时续,但是使用 ssh 协议就不会有这个问题)

另外的一个好处是,如果你克隆的是一个 fork(派生仓库),那么通过gh clone进行克隆会自动添加 upstream 这个 remote。比如这是我 fork 的 logseq/mldoc 仓库,我今天恰修了它标准输入无法使用管道的问题:

$ git remote get-url origin
git@github.com:wold9168/mldoc.git
$ git remote get-url upstream
git@github.com:logseq/mldoc.git

派生一个仓库

gh repo fork <username>/<reponame> 可以克隆一个仓库。例如:

$ gh repo fork wold9168/wold9168.github.io
✓ Created fork foo/wold9168.github.io
? Would you like to clone the fork? Yes # 这里的引导会提问你是否要将仓库克隆到本地,克隆的效果和 gh clone 是一样的

派生仓库的快速操作

我觉得这是 gh 最富价值的部分。

对于一个本地的派生仓库副本,通过 gh repo sync,我们可以避免打开仓库的 Web 页面,而快速和其上游进行同步。

通过 gh pr create,我们可以将当前分支推送给上游。gh pr create 之前我们需要先将需要 PR 的分支 push 给 origin 这个 remote。

gh pr create 推送的仓库是通过 gh repo set-default 决定的。这个指令决定了 PR 发送的目标对应的 remote。例如我们可以通过以下指令将 git clone 下来的不带 upstream 的仓库转换为一个可使用 gh pr create 进行的仓库:

$ git remote add upstream <上游仓库的 URL>
$ gh repo set-default upstream