GitHub CLIで始める快適GitHub生活

最近、GitHub CLIが便利だな〜と思ったので紹介します。

この記事は以下リリース時点の情報です。
[Release v0.11.1 · cli/cli](https://github.com/cli/cli/releases/tag/v0.11.1)


# GitHub CLIとは？
コマンドライン上でGitHubの操作を行えるCLIツールです。GitHubが公式で公開しています。

https://github.com/cli/cli

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114396/0fd8490b-83b5-4cfa-22c9-d1b30350f953.png)
(参考： [GitHub公式ブログ](https://github.blog/2020-02-12-supercharge-your-command-line-experience-github-cli-is-now-in-beta/)）

## インストール
Macの場合はbrewでインストールできます。Windowsの場合は公式の[README.md](https://github.com/cli/cli#windows)を参照してください。

```bash
brew install gh
```

## 認証
最初に自分のGitHubアカウントと連携するために認証が必要です。
なんらかのghコマンドを打つと認証を求められるので、案内にしたがって認証を完了してください。

```
$ gh issue list
Notice: authentication required
Press Enter to open github.com in your browser
```

## コマンド補完の設定
GitHub CLIはコマンドが長いので最初にシェルの補完設定をしておくと便利です。
`gh completion`で補完関数が表示されるので、お使いのシェルの設定ファイルにevalを記述してください。

fishの場合

```config.fish
eval (gh completion -s fish| source)
```

zshの場合

```bash:.zshrc
eval "$(gh completion -s zsh)"
```

bashの場合

```bash:.bashrc
eval "$(gh completion -s bash)"
```

# 何が良いの？
そのままですが、ブラウザを開いてマウスカーソルで操作する必要がないのが何より良いです。
新しくリポジトリを作成する時や過去のプルリクエストの検索の際などに、いちいちブラウザを開いて集中力を途切れさせる必要はありません。そのままエディタ、ターミナルと向き合えば良いのです。最高に便利。

以降でコマンド一覧と実際に普段の業務でよく使うコマンドを紹介します。

# コマンド一覧
GitHub CLIで使えるコマンド一覧です。
コマンドごとのオプションなど詳細情報は、リンク先のドキュメントを参照してください。

## repo - リポジトリの操作
https://cli.github.com/manual/gh_repo

リポジトリの作成、クローン、表示などが行えます。

```bash
# リポジトリの作成
$ gh repo create [<name>] [flags]

# リポジトリのクローン
$ gh repo clone <repository> [<directory>] [flags]

# リポジトリのフォーク
$ gh repo fork [<repository>] [flags]

# リポジトリ内容の閲覧
$ gh repo view [<repository>] [flags]
```

## pr - プルリクエストの操作
https://cli.github.com/manual/gh_pr

プルリエクストの作成、マージ、レビューなどが行えます。たぶん一番使うコマンドですね。

```bash
# プルリクエストのブランチへのチェックアウト
$ gh pr checkout {<number> | <url> | <branch>} [flags]

# 現在のブランチからのプルリクエストの作成
$ gh pr create [flags]

# プルリクエストのクローズ
$ gh pr close {<number> | <url> | <branch>} [flags]

# プルリクエストの差分を確認
$ gh pr diff {<number> | <url>} [flags]

# プルリクエストの一覧を取得
$ gh pr list [flags]

# プルリクエストをマージ
$ gh pr merge [<number> | <url> | <branch>] [flags]

# プルリクエストにレビューを追加
$ gh pr review [<number> | <url> | <branch>] [flags]

# プルリクエストの内容を閲覧
$ gh pr view [<number> | <url> | <branch>] [flags]

# 自分に関係のあるプルリクエストのステータスを閲覧
$ gh pr status [flags]

# ドラフトのプルリクエストをレビューに変更する
$ gh pr ready [<number> | <url> | <branch>] [flags]

# クローズしたプルリクエストを再度オープンにする
$ gh pr reopen {<number> | <url> | <branch>} [flags]
```

## issue - イシューの操作
https://cli.github.com/manual/gh_issue

イシューの作成や、ステータスの確認などが行えます。

```bash
# イシューの作成
$ gh issue create [flags]

# イシューのクローズ
$ gh issue close {<number> | <url> | <branch>} [flags]

# イシューの一覧表示
$ gh issue list [flags]

# イシューの再オープン
$ gh issue list [flags]

# 自分の関連するイシューのステータス確認
$ gh issue status [flags]

# 指定のイシューの閲覧
$ gh issue view {<number> | <url>} [flags]
```

## gist - GitHub Gistの操作
https://cli.github.com/manual/gh_gist

GitHub gistの作成が行えます。

```bash
# gistの作成
$ gh gist create [<filename>... | -] [flags]
```

## api - GitHub APIの実行
https://cli.github.com/manual/gh_api

GitHub APIの実行ができます。GraphQLのqueryを手軽に実行できます。

```bash
# 自分のリポジトリ一覧の取得
$ gh api graphql --paginate -f query='
  query($endCursor: String) {
    viewer {
      repositories(first: 100, after: $endCursor) {
        nodes { nameWithOwner }
        pageInfo {
          hasNextPage
          endCursor
        }
      }
    }
  }
```


## alias - CLIコマンドのエリアスの登録
GitHub CLIの各コマンドのエイリアスを作成できます。

```bash
# エイリアスの登録
$ gh alias set <alias> <expansion> [flags]

# エイリアスの削除
$ gh alias delete <alias> [flags]

# エイリアスの一覧表示
gh alias list [flags]
```


# 実際に良く使うコマンド紹介
最後に、実際に使用頻度が高いコマンドを紹介します。

## 自分の出したプルリクエストの一覧取得

プルリクエストの概要欄に過去の関連プルリクエストを貼りたいときなど、過去のプルリクエストを検索しますよね。GitHub CLIを使えばコマンドライン上でgrep検索できます。

```bash
$ gh pr list -s all -a <自分のアカウント名> | grep "検索文字列"
```

オプションの入力を省くためにaliasを作っておくとなお便利です。

```bash
# myprでエイリアスとして登録
$ gh alias set mypr "pr list -s all -a kawamataryo"

# 検索の実行
$ gh mypr | grep "Vue化"
```

## リポジトリの作成
https://cli.github.com/manual/gh_repo_create

どのようなコードを書くにせよGitHubにリポジトリを立ててから書き始めるタイプなので重宝しています。今まではブラウザを開いて、GUIでぽちぽちやる必要があり煩わしかったのですが、GitHub CLIならコマンド1つでリポジトリが作成可能です。

```bash
# my-super-programというリポジトリをパブリックで公開
$ gh repo create my-super-program --public -d 'The best library ever!'
```

私はローカルのリポジトリ管理を[ghq](https://github.com/x-motemen/ghq)で行っているので、

1. リポジトリの作成
2. ghqでの取得
3. VSCodeで開く

までの一連の流れを行う関数をfishシェルに登録して使っています。

```config.fish
# githubにリポジトリを作り、ghqで取得、vscodeでひらく
function ghcr
 gh repo create $argv
 ghq get git@github.com:kawamataryo/{$argv[1]}.git
 code /Users/kawamataryou/ghq/github.com/kawamataryo/{$argv[1]}
end
```

ghcrコマンドを使えば、速攻で実装をスタートできます。便利！

```bash
$ ghcr my-super-program --public -d 'The best library ever!'
```

![ezgif.com-optimize (11).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/114396/b0888d74-426e-e652-3fb6-0222bf2c0c64.gif)


**2020/08/16 追記**
@ryoppippi さんが汎用的に使えるように書き直してくれました!!

```bash
function ghcr
 gh repo create $argv
 ghq get $argv[1]
 code (ghq list --full-path -e $argv[1])
end
```


## プルリクエストの作成

プルリクエストの作成時も便利です。
通常は、`push --set-upstream origin hogehoge`としてブランチをpushして、その後表示されるリンクからプルリクエスト作成画面へ移動という流れかと思います。GitHub CLIを使えばその作業を1つのコマンドで行うことができます。CLI上でプルリクエストのタイトルや概要などの項目を埋めることも可能です。
自分は概要に動作確認の画像の貼り付けなどを行いたいので、いつも`-w`のオプションを指定してブランチのpush後に自動的にGitHubのプルリクエスト作成画面がブラウザで開くようにしています。

```bash
$ gh pr create -w
```

これもエイリアスに登録しておけば楽です。

```bash
# prcとしてエイリアスの登録
$ gh alias set prc "pr create -w"

# プルリクエストの作成
$ gh prc
```



# 終わりに

以上「GitHub CLIで始める快適GitHub生活」でした。
今回紹介出来てないんですが、GitHub APIをもっと上手く使えばかなり色々出来そうです。
今後も継続して使っていきたいです。

# 参考
- [GitHubを操作するCLI「gh – The GitHub CLI tool」(Beta)を試す | Developers.IO](https://dev.classmethod.jp/articles/shuntaka9576-gh/)
- [GitHub CLI Beta | Take GitHub to the command line](https://cli.github.com/)
- [cli/cli: GitHub’s official command line tool](https://github.com/cli/cli#windows)