Zenn
🐚

GitHub CLIのおすすめの使い方【随時更新】

2025/03/30に公開
6

はじめに

今回GitHub CLI(ghコマンド)で私が普段使いしているスニペットを紹介したいと思います。【随時更新予定】

本記事の目的

GitHub CLIはGitHub操作をコマンドラインで行えるツールです。
https://cli.github.com/

GitHub CLIを用いることでブラウザを開いてカーソルを操作することなく、ターミナル上で特に定常作業などを効率的に操作を行うことができます。

・・・と言いたいところなのですが、特にターミナルでの操作に慣れていない人にはなかなか日常的には使われていない印象があります。

私はターミナル・CLIを愛用しており、できるだけカーソル操作することなくキーボード操作することを信条(誇張あり)として、GitHub CLIを色々いじってきました。

ドキュメントやGitHub CLI紹介記事では、コマンド内容・操作の基本的な紹介が多く、
特にCLIに慣れていない人にとっては活用イメージ・カスタマイズ例が湧きずらいかもしれないと思い、
今回、私が使用しているスニペットを紹介したいと考えました。

スニペット例から、GitHub CLI及びCLIやターミナルの便利さやカスタマイズする楽しさなどが伝われば幸いです!

スニペットのカスタマイズの前知識

スニペットを構築する際に、よりスニペットコマンドを便利にするいくつかの前知識をいくつか記述します。

  1. インタラクティブ(対話的)選択ツールの使用

GitHub CLIに限らず、CLI操作をより使いやすくするツールとして、あいまい検索(fuzzy finder)によるインタラクティブな選択を行えるツールを用いると良いです。
インタラクティブ選択とは以下のようなものになります。

インタラクティブに選択した結果内容を任意のコマンドに渡すことができ、対話的な形で自由度高くコマンドを生成することが出来ます。

ツール例としては、以下などがあります。

  • fzf

    • fzfのインストール

    詳細はREADMEを参照してください(以下、インストール例)

    brew install fzf
    
    source <(fzf --zsh)
    
  • peco

以降のスニペット例ではfzfを用いて記述してきます。

  1. GitHub CLIのオプションについて

GitHub CLIではオプションを指定することで、表示内容を色々カスタマイズすることができます。
オプション内容は各コマンドのドキュメント--helpを付けて実行することで確認することができます。
色々カスタマイズできる要素があるため、よりこだわりがある人は自分好みに設定するといいと思います。
(私のスニペット例は自分好みにカスタマイズしているのもあり、あくまでカスタマイズの一例として見ていただければと思います。)

~/Programming/type-challenges % gh pr list --help
List pull requests in a GitHub repository.

The search query syntax is documented here:
<https://docs.github.com/en/search-github/searching-on-github/searching-issues-and-pull-requests>

For more information about output formatting flags, see `gh help formatting`.

USAGE
  gh pr list [flags]

FLAGS
      --app string        Filter by GitHub App author
  -a, --assignee string   Filter by assignee
  -A, --author string     Filter by author
  -B, --base string       Filter by base branch
  -d, --draft             Filter by draft state
  -H, --head string       Filter by head branch
  -q, --jq expression     Filter JSON output using a jq expression
      --json fields       Output JSON with the specified fields
  -l, --label strings     Filter by label
  -L, --limit int         Maximum number of items to fetch (default 30)
  -S, --search query      Search pull requests with query
  -s, --state string      Filter by state: {open|closed|merged|all} (default "open")
  -t, --template string   Format JSON output using a Go template; see "gh help formatting"
  -w, --web               List pull requests in the web browser

INHERITED FLAGS
      --help                     Show help for command
  -R, --repo [HOST/]OWNER/REPO   Select another repository using the [HOST/]OWNER/REPO format

EXAMPLES
  List PRs authored by you
  $ gh pr list --author "@me"

  List only PRs with all of the given labels
  $ gh pr list --label bug --label "priority 1"

  Filter PRs using search syntax
  $ gh pr list --search "status:success review:required"

  Find a PR that introduced a given commit
  $ gh pr list --search "<SHA>" --state merged


LEARN MORE
  Use `gh <command> <subcommand> --help` for more information about a command.
  Read the manual at https://cli.github.com/manual


  • --jsonオプションについて
    ghコマンドでは、--jsonでfieldを設定することで、デフォルトでは表示されないfieldやfieldの順番などをカスタマイズすることができます。
    表示できるfieldは試しに無効なfieldを設定することで有効なfieldを確認することができます。
    私は日付の表示をYYYY-MM-DD hh:mm:ssの表記にカスタマイズしたり、authorの情報なども表示して、その情報でもfilterできるようにカスタマイズしていることが多いです。

    詳細はこちら

    ~/Programming/type-challenges % gh pr list --json "x"
    Unknown JSON field: "x"
    Available fields:
      additions
      assignees
      author
      autoMergeRequest
      baseRefName
      body
      changedFiles
      closed
      closedAt
      comments
      commits
      createdAt
      deletions
      files
      headRefName
      headRefOid
      headRepository
      headRepositoryOwner
      id
      isCrossRepository
      isDraft
      labels
      latestReviews
      maintainerCanModify
      mergeCommit
      mergeStateStatus
      mergeable
      mergedAt
      mergedBy
      milestone
      number
      potentialMergeCommit
      projectCards
      projectItems
      reactionGroups
      reviewDecision
      reviewRequests
      reviews
      state
      statusCheckRollup
      title
      updatedAt
      url
    
    • --jqオプションについて
      --jsonオプションでfieldをカスタマイズした後は、--jqオプションで整形することができます。
      | jqでパイプすることで整形している例も多くみられますが、パイプでつながずとも--jqで同様のことができるというTIPSです。
  1. スニペットは略語展開(abbr,abbreviation)で設定
    略語展開(abbreviation)とは、シェル上で入力した特定の短縮文字をあらかじめ設定しておいた文字列に展開してくれるaliasのようなものです。 スニペットは略語展開として設定することで、より手軽に使用することができます。
    以下は、私が今現在おすすめしているzabrzeでの設定例です。
    - name: gh pr checkout
      abbr: ghpc
      snippet:
        gh pr checkout $(gh pr list --search "user-review-requested:@me" --limit 100
        --json number,title,author,state,isDraft,updatedAt,createdAt,headRefName
        --jq '
        ["no","title","author","state","draft","updatedAt","createdAt","branch"],
        ( .[] |
        [.number
        , .title[0:50]
        , .author.login
        , .state
        , (if .isDraft then "×" else "〇" end )
        , (.updatedAt | strptime("%Y-%m-%dT%H:%M:%SZ") | strftime("%Y/%m/%d %H:%M:%S"))
        , (.createdAt | strptime("%Y-%m-%dT%H:%M:%SZ") | strftime("%Y/%m/%d %H:%M:%S"))
        , .headRefName])
        | @tsv
        '
        | column -ts $'\t'
        | fzf --no-sort --header-lines=1
        | awk '{ print $1}')
    

GitHub CLIのおすすめのコマンド・スニペット例

以下順不同で私がよく行うスニペット群を紹介したいと思います。

PR操作

PR一覧を確認(gh pr list)

PR一覧はブラウザではhttps://github.com/<name>/<repo>/pullsで閲覧できますが、CLIでも確認することができます。

以下では、statusがOpenもしくはDraft状態のPRを最新の30件を取得するコマンドになります。

gh pr list

上記コマンドのオプションを色々設定した、私のスニペットは以下になります。
ghコマンドでは後述するコマンドであるgh pr checkout <pr_no>などのように、PRNoを指定することが多いため、そのNoを一覧から確認したい際に使うことがあります。

gh pr list --author "" --assignee "" --search "" --state all --limit 100
  --json number,title,author,state,isDraft,updatedAt,createdAt,headRefName
  --jq '
    ["no","title","author","state","draft","updatedAt","createdAt","branch"],
    ( .[] |
    [.number
    , .title[0:50]
    , .author.login
    , .state
    , (if .isDraft then "◯" else "☓" end )
    , (.updatedAt | strptime("%Y-%m-%dT%H:%M:%SZ") | strftime("%Y/%m/%d %H:%M:%S"))
    , (.createdAt | strptime("%Y-%m-%dT%H:%M:%SZ") | strftime("%Y/%m/%d %H:%M:%S"))
    , .headRefName])
    | @tsv
  '
  | column -ts $'\t'
  | fzf --no-sort --header-lines=1

ポイントとしては、

  • 以下オプションで最新のPRを100件取得しつつ、fzfでfilterする形で閲覧出来るようにしています。

    • --state all: closed/merged状態のPR含めて、全てのPRを表示するようにしています。
      • PRのステータスを特定の内容のみに制限したい場合は--state mergedのように指定することもできます。
    • --limit 100: limitを設定しない場合は30件のみですが、最大数である100件取得するようにしています。
  • 以下の検索オプションは通常は明示する必要がないのですが、追加で設定したい場合に設定できるように設けています。

    • --author "": 作成者フィルタ
      • たとえば自身のPRのみに制限したい場合は--author "@me"のように指定することができます。
    • --assignee "": 担当者フィルタ
    • --search "": 追加の検索条件
      • より検索条件をカスタマイズしたい場合は、--search "word in:title"のように指定することでより詳細な検索を行うことも可能です。
        検索詳細はこちら
  • 出力内容をカスタマイズするために、--jsonオプションで追加表示したいfieldを指定するとともに、--jqコマンドで表示内容を整形しています。

    • --json: 取得するフィールドを指定
    • --jq: jqクエリで出力を整形
  • 出力内容の表形式で見栄え良いように以下で整形しています。

    • column -ts $'\t': タブ区切りを整形して表形式に変換
    • fzf: インタラクティブなフィルタリングツール
      • --no-sort: 元の順序を保持
      • --header-lines=1: 先頭行をヘッダーとして扱う

レビュー依頼されたPRにチェックアウト(gh pr checkout)

私がよく使うスニペットです。
レビュー依頼されたPRに手軽にcheckoutすることができます。

gh pr checkout $(gh pr list --search "user-review-requested:@me" --limit 100
  --json number,title,author,state,isDraft,updatedAt,createdAt,headRefName
  --jq '
    ["no","title","author","state","draft","updatedAt","createdAt","branch"],
    ( .[] |
    [.number
    , .title[0:50]
    , .author.login
    , .state
    , (if .isDraft then "◯" else "☓" end )
    , (.updatedAt | strptime("%Y-%m-%dT%H:%M:%SZ") | strftime("%Y/%m/%d %H:%M:%S"))
    , (.createdAt | strptime("%Y-%m-%dT%H:%M:%SZ") | strftime("%Y/%m/%d %H:%M:%S"))
    , .headRefName])
    | @tsv
  '
  | column -ts $'\t'
  | fzf --no-sort --header-lines=1
  | awk '{ print $1}')

ポイントとしては、

  • gh pr checkoutコマンドはgh pr checkout <pr_no>とチェックアウトするPRNoを指定しないといけないです(他にはブランチ名など)
    PRNoを随時確認するのは大変のため、サブシェルで$(gh pr list | fzf)と用いることで、checkoutしたいPR一覧を表示させつつインタラクティブに選択できるようにしています。

  • 内部コマンドで自分にレビュー依頼されているPR一覧を取得

    • --search "user-review-requested:@me": 自分にレビュー依頼があるPRのみを対象
    • awk '{ print $1}': 選択した行の最初のカラム(PR番号)を抽出

レビュー依頼・アサインされているPR・Issueを確認する(gh status)

意外と知られていないのがgh statusコマンドです。
今レビュー依頼されているPRなんだっけ・・?というときに以下のコマンドを実行すると確認することができます。
手癖のように実行することで、レビュー依頼漏れなどを防ぐことができるのでおすすめです。

gh status

リポジトリ・PRを直接ブラウザで開く(gh browse)、他

GitHub CLIを使うことで、ターミナルから直接HEADのリポジトリのページなどをブラウザで開くこともできます。
場合によってはブラウザで閲覧する方が見やすい方がある場合もあるかと思いますが、その場合もコマンド一発ですぐに開くことができます。

gh browseの以下は私がよく使う代表例ですが、他にもprojects・releases etc...なども指定して開くこともできます。

リポジトリをブラウザで開く

gh browse

現在のHEADにいるブランチでリポジトリを開く

gh browse --branch $(git symbolic-ref --short HEAD)

リポジトリのsettingsページをブラウザで開く

gh browse --settings

現在のHEADにいるブランチのPRをブラウザで開く

gh pr view -w

まとめ

GitHub CLIを使いこなすことで、定番のGitHub作業内容を効率化できます。

最初は初期設定やスニペットの作成に慣れていないと戸惑うかもしれませんが、慣れると作業効率がとても上がると思います。

より便利なスニペット例がある場合は、コメントで教えていただけると嬉しいです!皆さんのghコマンド活用テクニックもぜひ共有してください。
(まだ他のスニペット例も全然記述できていない💦ので、私も随時更新していきたいと思います。)

6

Discussion

ログインするとコメントできます