Githubのghコマンドを入れたらめちゃくちゃ幸せになれた話

# はじめに
こんにちは[スペリス](https://spalice.com)でエンジニアをしております、安永です。

この記事では、今回は最近業務で使い出した`gh`コマンドがめちゃくちゃ便利なので、使う前と比べて何が良くなったのか？やインストール方法・セットアップよく使うコマンドなどをご紹介したいと思います。

## ghとは？
`gh`コマンドはGithubの公式がリリースしている、プルリクやissueなどをコマンドライン上で操作できるようになるツールになります。

https://github.com/cli/cli

# セットアップ
## インストール
mac OSの場合は、以下のコマンドでインストールできます。

```bash
brew install gh
```

windowsの場合は、以下のコマンドでインストールできます。

```bash
winget install --id GitHub.cli	
```

詳しくは[公式のGithub](https://github.com/cli/cli)をご参照ください。

## アカウント連携
`gh`を入れたら、まずGithubアカウントと連携する必要があります。以下のコマンドで、連携ができます。

```bash
gh auth login --web
```

1. 実行すると、Git操作したいプロトコル（HTTPSかSSHか）を聞かれるのでどちらか選びます（ここではHTTPSを選びます）
![スクリーンショット 2023-01-21 13.34.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290687/6910e988-559c-4dbb-8025-8a5b3a5157d1.png)

1. 次に、Github credentialを使って認証を行うか聞かれるので、Yで進めます。
![スクリーンショット 2023-01-21 13.34.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290687/3972af67-eeda-c901-d01e-5accf0ae45f7.png)

1. 次にワンタイムコードと共に、Enterを押すように促されますので、Enterを押すとブラウザが立ち上がります。**立ち上がったブラウザの入力ボックスに、コマンドラインで表示されたコードを入力します。**（ワンタイムコードではありますが、一応赤い枠で一部隠しております。）
![スクリーンショット 2023-01-21 13.34.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290687/fdda65cf-9c17-f36e-762d-65647f024386.png)

1. Authorize Appを選択します。
![スクリーンショット 2023-01-21 13.35.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290687/8f1b40ad-e300-d3e3-051f-2842f408c04d.png)

1. スマホのGithubアプリもしくはパスワードで本人確認が求められるので、認証をしたらセットアップ完了です。
![スクリーンショット 2023-01-21 13.35.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290687/c4475fbb-a7dc-76c0-5da3-1bea731ef7a6.png)

## editorを変更

そしてまずやっておきたい設定として、editorの変更をします。

`gh`コマンドを使って例えば、PRを作成する場合、説明文を編集するのをコマンドから促されるのですが、デフォルトだとエディタがnanoになっております。`gh`ではこのeditorをVS Codeに設定することができます。これが最高に便利。

以下を実行するだけ。

```bash
gh config set editor "code --wait"
```

もちろんvimにすることもできます。

```bash
gh config set editor "vim"
```

# よく使うコマンド
PRのコマンドが多いですが、もちろんissueとかも出すことができます。

## PRをローカルにプル
自分にPRが投げられた時に、ローカルでテストをするためにPRのコードをローカルにプルしてきたい時ってありますよね。
そんな時にも`gh`コマンドが活躍します。

今までは、以下のような感じでプルしてきていました。

```bash
# 別ブランチにいる場合、developまたはmainに移動
git checkout develop
git checkout -b ブランチ名
git reset --hard origin/ブランチ名
```

`gh`を使えば、以下のように持って来れます。デフォルトのブランチ以外にいても自動的にコードをチェックアウトしてきてくれます。つまり、ブランチなどをいちいち切る必要がなくなりますね。

```bash
# gh pr checkout ブランチの番号 OR ブランチ名 OR URL で取ってこれる
gh pr checkout 184
```

さらにこのコマンドはプルリクの「Conversation」タブの右上にある、「<>Code」からコピーできます。めちゃ便利。

![スクリーンショット 2023-01-25 10.54.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290687/eef73e6e-8d80-53c5-eee2-af8ea346305f.png)

## PRを作成
`gh`は、`git add .`などをするディレクトリ上で実行すると自動的にそのリポジトリのPRを出してくれます。

そのため、PRを作成する場合は、まず`git checkout -b feature/XXX`でブランチを作成してから、同じディレクトリで以下のコマンドを実行します。

```bash
gh pr create
```

実行すると色々と聞かれるので、都度矢印キー＋Enterで答えて、PRを提出します。

### developブランチにPRを出す

developブランチPRを出すときは`--base`を使います。指定しないと`main`（または`master`）ブランチに投げられますのでご注意を。

```bash
gh pr create --base develop
```

### 担当者・レビュアーを設定する
`--assignee`を使うと担当者、`--reviewer`を使うとレビュアーを指定できます。

assigneeに@meを使うと自分にアサインされます。もちろん他の人にもアサインできます。

```bash
gh pr create --assignee @me --reviewer @member
```

## PRをマージ
以下のコマンドでPRをマージすることができます。

マージされるのは、**今いるブランチから提出しているPRになります。**

例えば、`git checkout -b feature/hoge`でブランチを切って、`gh pr create`でPRを作成、`gh pr merge`をすると、`feature/hoge`のPRがマージされます。

```bash
gh pr merge
```

実行すると色々と聞かれるので、都度矢印キー＋Enterで答えて、マージします。

## PRを編集
```bash
gh pr edit
```

実行すると何を編集するのか聞かれるので、矢印キーとスペースキーでXを付けて、Enterで確定。その後指示に従って編集します。

![スクリーンショット 2023-01-21 14.07.00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/290687/2e5c4e24-7c6a-97c8-35fd-1d17a948aef3.png)

# どう幸せになったのか？
`gh`入れたらどのように開発生活がハッピーになったのかご紹介します。

## 開発効率の向上
`gh`を使ってから、コマンドライン＋VS Codeでプルリクを投げるところが完結したので、作業効率が非常に上がりました。
例えば、以下のような点が作業効率化に繋がったと思っています。

### PRをローカルに持ってくる作業などいちいち煩わしかった作業が一発でできる

上で紹介したようにPRをローカルに持ってくる際に`gh pr checkout 128`を実行するだけでよくなったので、効率化に役立ちました。

### PRの説明文（テストケースなど）をVS Codeから編集でき説明文が書きやすくなった

`gh`を使うと、VS Codeを使って説明文を編集することができるようになったので、めちゃくちゃ書きやすくなりました。
VS Codeのショートカットや拡張機能などを使うことができるようになったのが大きいと思います。

### PRをマージした後のローカルブランチの掃除作業が無くなった

これまでは、マージした後のブランチはローカルに残ったままになっていて、いちいち消すのにコマンドを叩くか、以下のようなシェルを用意して、マージした後に実行するようにしていました。

```bash
git checkout develop
git pull origin develop
git fetch -p \
  && git branch --format "%(refname:short) %(upstream:track)" \
    | grep "\[gone\]" \
    | awk '{print $1}' \
    | xargs -IXXX git branch -D XXX
```

ですが、`gh pr merge`を使うと、ローカルのブランチを消すかどうかを聞いてくれて、yを入力しsubmitすると、**マージ先のブランチにチェックアウト→git pull→マージしたブランチを削除**まで全部やってくれます。

## ヒューマンエラーが減った
今までは、ブラウザからGithubを立ち上げて、画面をポチポチしながらPRを出したり、PRをプルしてきていました。

でも、`gh`を使ってからはコマンドで完結するようになったので、別のブランチにPR投げる、といったようなヒューマンエラーも減りました。

## システマチックに複数のPRを出すことが可能になった
`gh`を入れていれば、シェルで実行ができるので、例えば、hotfixのPRを出すときなど、

```bash
gh pr create --base develop
gh pr create --base main
```

のようなシェルを実行してやれば、一気にdevelopとmain両方にPRを投げることができて、便利になりました。

あとは、まだ実践してはいないですが、`gh`を使って、CI/CDから実行を行うことも可能と考えると夢が広がりますね。

# おわりに
`gh`はいいぞ〜。どなたかの参考になれば幸いです。