
GitHubを操作するCLI「gh – The GitHub CLI tool」(Beta)を試す
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
GitHubが「GitHub CLI」をベータ版として公開しました。
リポジトリはgh - The GitHub CLI toolです。 githubの紹介記事は、こちらです。
本ツールはGitHub公式であるのに対して、hubという非公式ツールがあります。
私は普段からhubを利用しており、hub createやhub create -pやhub browseをよく利用しています。
本記事では、GitHubの公式ツールghでどのような操作が可能か試してみました。
注意: Beta版なので、今後大きく仕様が変わる可能性があります。また本記事は、gh version 0.5.5 (2020-02-13)を利用しています。
インストール
Mac場合
$ brew install github/gh/gh
認証設定
何らかのコマンドを実行すると認証を求められます。
$ gh issue list Notice: authentication required Press Enter to open github.com in your browser
Enterを押下で、ブラウザが起動し、認可画面に遷移します。

緑色のAuthorize githubを押下し、認証完了です。

ghコマンドのオプション
現在第1引数に以下のコマンドが利用可能です。
- gh help
- gh issue
- gh pr
gh prとgh issueについて見ていきます。
gh pr
gh pr create
プルリクエストを作成するオプション。gh pr create [flags]で実行します。
flagsオプションの詳細は、下記の通りです。(詳細は、gh pr create --help参照。以後同様。)
| flags | 機能 | 
|---|---|
| -B, --base string | コードをマージするブランチを指定 | 
| -b, --body string | プルリクエストの内容を指定します。それ以外は対話型で設定します | 
| -d, --draft | ドラフトプルリクエストを作成します | 
| -t, --title string | タイトルを指定します。 それ以外は対話型で設定します | 
| -w, --web | Webブラウザーを開いてプルリクエストを作成します | 
オプション未指定で試す(gh pr create)
プルリクエストの内容を記述するエディターを設定します。
ghは利用するエディタを環境変数で認識し、$GITHUB_EDITOR、$EDITOR、$VISUALの順で評価します。参考
私の環境では、$VISUALにnanoが設定されていたため、neovimを設定しました。
export VISUAL='nvim'
ブランチを適当に切って、コミット後コマンド(gh pr create)を実行します

タイトルを入れると、プルリクエストの内容の入力が求められます。(e)でnvimを起動します

neovimが起動します。プルリクエストの内容を書きます。 (このとき、プルリクテンプレートがあると反映されることを確認しています)

wqで抜けると、Preview in browserかSubmitかCancelかを選択出来ます。今回は、Preview in browserを実行してみます。

ブラウザが起動し、neovimで入力した内容が反映されています。

オプション指定で試す
以下のシナリオを想定して実行してみます
| 設定項目 | 値 | 
|---|---|
| マージ先ブランチ | master | 
| プルリクエスト | draft | 
| タイトル | リファクタリング | 
| プルリクエストの内容 | hoge | 
$ gh pr create -B master -d -b 'hoge' -t 'リファクタリング' Creating pull request for gh-test into master in shuntaka9576/dotfiles https://github.com/shuntaka9576/dotfiles/pull/41
期待通り、draftプルリクエストが作成されました!
 

gh pr list
リポジトリ内のプルリクエストの一覧表示およびフィルタリングするオプション。gh pr list [flags]で実行します。
flagsオプションの詳細は、下記の通りです。
| flags | 機能 | 
|---|---|
| -a, --assignee string | アサインでフィルタ | 
| -l, --label strings | ラベルでフィルタ | 
| -L, --limit int | CLI上の取得上限を設定(デフォルト30件) | 
| -s, --state string | 状態(open|closed|merged|all)でフィルタ可能(デフォルト open) | 
プルリクエストのナンバー タイトル branch名の情報が表示されます。open(緑) merged(ピンク) close(赤)で表現されており、分かりやすいですね。

gh pr status
プルリクエストのステータスを表示するオプション。gh pr status [flags]で実行します。
Global Flagsの除くflagsオプションは現在存在しません。
自分のカレントブランチに関するPRと、自分が作成したPR(open)とレビュー依頼されているPRの情報が確認できます。
$ gh pr status Relevant pull requests in shuntaka9576/dotfiles Current branch #41 リファクタリング [gh-test] Created by you #41 リファクタリング [gh-test] #40 Refactoring [refactoring] Requesting a code review from you You have no pull requests to review
gh pr view
引数で指定されたプルリクエストをブラウザで表示するオプション。gh pr view [{<number> | <url> | <branch>}] [flags]で実行します。
flagsオプションの詳細は、下記の通りです。
| flags | 機能 | 
|---|---|
| -p, --preview | issue内容のプレビューを表示する | 
プレビューと聞いたら、fzfですね。
リポジトリ配下で、下記のコマンドを実行します。(fzf-tmuxになっていますが、fzfでも可能です)
$ gh pr list| fzf-tmux --prompt "pr preview>" --preview "echo {} | awk '{print \$1}' | xargs gh pr view -p" | xargs gh pr view
左側にプルリクエストのリスト、右側にプルリクエストの内容が表示出来ます。曖昧検索選択後、自動的にブラウザが立ち上がり、対象のプルリクエストを確認出来ます。

gh pr checkout
対象のプルリクエストのbranchにcheckoutするオプション。gh pr checkout {<number> | <url> | <branch>} [flags]で実行します。
Global Flagsの除くflagsオプションは現在存在しません。
~/dotfiles [master] $ gh pr checkout 41 # PRの番号を指定 Switched to branch 'gh-test' Your branch is up to date with 'origin/gh-test'. Already up to date. ~/dotfiles [gh-test] # 指定したPRのブランチにcheckout $
コードレビュー時に、ブランチ名をコピーしてgit checkout ブランチ名する手間が省けて良さそうですね。
gh issue
gh issue create
issueを作成するオプション。gh issue create [flags]で実行します。
| flags | 機能 | 
|---|---|
| -b, --body string | issue内容を指定します。それ以外は対話型で設定します | 
| -t, --title string | issueタイトルを指定します。 それ以外は対話型で設定します | 
| -w, --web | Webブラウザーを開いてプルリクエストを作成します | 
要領は、gh pr createと同様です。
gh issue list
issueを表示するオプション。git issue list [flags]で実行します。
flagsオプションの詳細は、下記の通りです。
| flags | 機能 | 
|---|---|
| -a, --assignee string | アサインでフィルタ | 
| -l, --label strings | ラベルをフィルタ | 
| -L, --limit int | CLI上の取得上限を設定(デフォルト30件) | 
| -s, --state string | 状態(open|closed|all)でフィルタ可能 | 
下記ような検索をする場合、コマンドは、gh issue list -l bug -L 20 -s allとなります。
| 設定値 | 値 | 
|---|---|
| ラベル | bug | 
| 取得上限 | 20 | 
| 状態 | 全て | 
aws-cdkで実行した結果は下記の通り。 openしているissueが緑でcloseしているissueが赤で表現されています。

gh issue status
プルリクエストのステータスを表示するオプション。gh issue status [flags]で実行出来ます。
Global Flagsの除くflagsオプションは現在存在しません。
自分がアサインされたissue,メンションされたissue,作成したissueの情報が確認できます。
$ gh issue status Relevant issues in shuntaka9576/dotfiles Issues assigned to you There are no issues assigned to you Issues mentioning you There are no issues mentioning you Issues opened by you #36 powerline作成 about 6 months ago #34 マルチバイト文字列使用時に、tmuxのstatus-windowが... about 6 months ago
gh issue view
issueをブラウザで表示するオプション。git issue view {<number> | <url> | <branch>} [flgas]で実行します。
flagsオプションの詳細は、下記の通りです。
| flags | 機能 | 
|---|---|
| -p, --preview | issue内容のプレビューを表示する | 
先ほどと同様に、fzfを組み合わせると便利そうです。
$ gh issue list| fzf-tmux --prompt "issue preview>" --preview "echo {} | awk '{print \$1}' | xargs gh issue view -p" | xargs gh issue view
左側にissueリスト、右側にissue内容が表示出来ます。曖昧検索選択後、自動的にブラウザが立ち上がり、対象のissueを確認出来ます。

最後に
本記事は、ghの機能を試してみました。beta版でありながら十分に実用的だと感じました。
今後様々なオプションが増えることが期待出来るので、注目していきたいです。











