GitHub CLIの使い方:ghでできることと、gitとの違い

公開 更新 書いた人 大林 諒

Claude CodeなどのAIと作業していると、gh pr create のようなコマンドの許可を求められることがあります。git に似ていますが、別の道具です。ここでは gh と git の違い、入れ方、よく使うコマンド、AIに許可を出すときの見分け方を、サンプル料理教室の website リポジトリの例で書きます。読み終わると、AIが何を実行しようとしているかを読めるようになり、許可してよいかを自分で決められるようになります。画面で足りている人には要らない道具なので、その判断も最後に書きました。

この記事の内容
  1. 先に答えると
  2. gitとghの違い
  3. インストールとログイン
  4. よく使うコマンド
  5. なぜAIはghをよく使うのか
  6. 読むだけのコマンドと、書き込むコマンドの見分け方
  7. ghではできないことと、その代わり
  8. 使わなくていい人
  9. よく詰まるところ
  10. 次に読む

先に答えると

GitHub CLI(gh)は、GitHubのサイトでやる操作をコマンドでやる道具です。git は手元と履歴の操作で、GitHub以外の置き場でも使えます。gh はGitHub専用で、プルリクエスト、Issue、GitHub Actions を扱います。入れ方は Mac が brew install gh、Windows が winget install --id GitHub.cli --source winget で、そのあと gh auth login でログインします。

  • コミットやpushは git、プルリクエストの作成やマージは gh
  • list view status diff checks は読むだけ
  • create merge close delete edit はGitHubの中身を変える
  • gh repo delete、公開範囲の変更、--admin は人が必ず確かめる
  • ブラウザで足りている人は入れなくていい

用語を少しだけ。リポジトリはファイルと変更履歴を入れておく場所です。プルリクエスト(Pull Request、PR)は、変更を本線に入れる前に確認を頼む依頼です。IssueはGitHubの中の課題の一覧で、GitHub Actions はpushなどをきっかけに自動で処理を動かす仕組みです。

gitとghの違い

公式の説明では、git は手元またはリモートのGitリポジトリを扱う道具で、リモートはGitHubでも別のサービスでもかまいません。gh はGitHubを扱うためだけの道具です。プルリクエストという仕組みはGitそのものには無く、GitHubのサイトの機能です。だから git にプルリクエストを作るコマンドはなく、ブラウザか gh で作ります。

比べる点gitgh
相手手元の履歴と、GitのリモートGitHubのサイト
代表的な操作git commit、git push、git pullgh pr create、gh issue list、gh run list
GitHub以外で使えるか使える使えない
ブラウザで言うと無い。手元の話プルリクエストの画面、Issueの画面、Actionsの画面
認証HTTPSのトークンかSSH鍵gh auth login(Gitの認証も一緒に済ませられる)
gitとghの守備範囲の違い
gitとghの守備範囲の違い

実際の順番で見ると、役割の分かれ方がよく分かります。料金表を直してプルリクエストを出すまでの前半は git の仕事です。

$ git switch -c fix-menu-price
Switched to a new branch 'fix-menu-price'
$ git add menu.html
$ git commit -m "料金表を修正"
[fix-menu-price 20080f8] 料金表を修正
 1 file changed, 1 insertion(+), 1 deletion(-)
$ git push -u origin fix-menu-price
To .../origin/website.git
 * [new branch]      fix-menu-price -> fix-menu-price
branch 'fix-menu-price' set up to track 'origin/fix-menu-price'.

ここまでで、枝 fix-menu-price がGitHubに届きました。ブランチ(枝)は、本線とは別に作業するための線です。ここから先の「この枝を main に入れたいので見てください」という依頼が gh の仕事です。

$ gh pr create --title "料金表を修正" --base main

このコマンドは本物のGitHubにプルリクエストを作るので、この記事のためには実行していません。成功すると、作成されたプルリクエストのURLが表示されます。

インストールとログイン

インストール

環境方法
Macbrew install gh(Homebrewが必要)
Windowswinget install --id GitHub.cli --source winget、または公式の配布ページの MSI インストーラー
Linux公式のページに apt、dnf、zypper の手順あり

入ったかどうかは gh --version で確かめます。Windows Terminal では、インストール後に新しいウィンドウを開いてから試します。タブを増やしただけでは新しい設定が読まれません。

ログイン

  1. ターミナルで gh auth login と打ちます。
  2. 接続先を聞かれたら「GitHub.com」を選びます。
  3. Gitの操作に使う方式を聞かれたら HTTPS を選びます。
  4. GitHubの認証情報でGitにも認証するかを聞かれたら Y と答えます。
  5. 既定はブラウザでのログインです。画面に出た1回限りのコードをブラウザに入れて承認します。
  6. 終わったら gh auth status で、どのアカウントで入っているかを確かめます。

手順4で Y と答えると、git push の認証も一緒に済みます。トークンはパソコンの資格情報の保管庫にしまわれます。トークンは、パスワードの代わりに使う長い文字列です。保管庫が使えない環境では平文のファイルに書かれることがあるので、保存先は gh auth status で見ます。gh auth status --show-token はトークンをそのまま画面に出すので、AIとの会話の中では使いません。

gh auth login で、ターミナルとブラウザを行き来する流れ
gh auth login で、ターミナルとブラウザを行き来する流れ

よく使うコマンド

手元のフォルダが website なら、多くのコマンドはそのリポジトリを相手に動きます。別のリポジトリを指すときは -R sample-cooking/reservation-mail のように付けます。

コマンド何をするかGitHubを変えるか
gh repo clone sample-cooking/websiteリポジトリを手元に持ってくる変えない
gh repo view説明とREADMEを表示する。--web でブラウザを開く変えない
gh pr createプルリクエストを作る変える
gh pr list開いているプルリクエストの一覧。既定は30件まで変えない
gh pr view 2121番のタイトル、本文などを表示する変えない
gh issue list開いているIssueの一覧。既定は30件まで変えない
gh run listGitHub Actionsの最近の実行の一覧。既定は20件まで変えない

表示の形は、公式マニュアルの例だと次のようになります。

$ gh pr list
#14  Upgrade to Prettier 1.19                           prettier
#13  Add Support for Windows Automatic Dark Mode        dark-mode

$ gh issue list
#14  Update the remote url if it changed  (bug)
#8   Add an easier upgrade command        (bug)

#14 が番号、次がタイトルで、プルリクエストの右端は枝の名前、Issueの右端はラベルです。ブラウザの一覧と同じものを文字で見ているだけです。gh pr view 21 のように番号を付ければ詳しく見られます。差分は gh pr diff 21、自動テストなどの結果は gh pr checks 21 で出ます。

同じプルリクエストの一覧を、ブラウザとターミナルで見る
同じプルリクエストの一覧を、ブラウザとターミナルで見る

gh pr create は、引数を何も付けなければタイトルと本文を対話で聞いてきます。--fill を付けるとコミットの内容から自動で埋まります。--web ならブラウザの作成画面が開きます。枝がまだGitHubに送られていないと、どこへ送るかを聞いてきます。

なぜAIはghをよく使うのか

ブラウザを開かなくてもプルリクエストを作れるからです。Claude CodeのようなAIは文字のコマンドで作業するので、ボタンを押す画面よりコマンドのほうが扱いやすくなります。Claude Codeの公式の説明にも、Claudeが gh pr create でプルリクエストを作る場合の動きが書かれています。公式のGitHub CLIの説明でも、スクリプトでGitHubの操作を自動にしやすいことが利点に挙げられています。

大きな流れは次のとおりです。人が「この修正でプルリクエストを出して」と頼むと、AIが git で枝を作ってコミットしてpushし、gh pr create で依頼を作り、URLを返します。人はそのURLをブラウザで開いて差分を読み、よければマージします。実際に運用していると、作るところまではAIに任せ、マージのボタンだけは人が押す形にすると事故が減ります。

AIとGitの付き合い方全体は「GitHub CopilotとClaude Code:AIでコードを書くときのGitの使い方」に書きました。

何を実行したかの読み方

gh のコマンドは、ほとんどが「対象、動詞、番号、オプション」の順です。

gh pr merge 21 --squash --delete-branch
部分意味
ghGitHub CLIを使う
pr対象はプルリクエスト
merge動詞。マージする
2121番のプルリクエスト
--squashコミットを1つにまとめて入れる
--delete-branchマージしたあと、手元とGitHubの枝を消す

読む順番は、動詞、対象、どこのリポジトリか(-R が付いていないか)、オプションの4つです。この例なら「21番をマージして枝も消す。戻すには手間がかかる」と読めれば十分です。分からなければ、その場で gh pr merge --help を見るか、AIに「このコマンドは何を変えますか」と聞いてから許可します。

読むだけのコマンドと、書き込むコマンドの見分け方

動詞を見れば、ほぼ分かります。AIに許可を出すときは次の表で判断してください。

区分コマンドの例許可の考え方
読むだけgh pr list、gh pr view、gh pr diff、gh pr checks、gh pr status、gh issue list、gh issue view、gh run list、gh run view、gh repo view、gh auth status許可してよい
手元だけ変わるgh repo clone、gh pr checkout中身を確かめて許可
GitHubの中身が増えるgh pr create、gh pr comment、gh issue create、gh issue comment内容を読んで都度許可。他の人に通知が飛ぶことがある
GitHubの状態が変わるgh pr merge、gh pr close、gh pr edit、gh pr review、gh issue close、gh issue edit、gh run rerun、gh run cancel、gh workflow run都度許可。マージは人がやるのが安全
取り返しがつきにくいgh repo delete、gh repo edit --visibility、gh issue delete、gh run delete、gh secret set、gh pr merge --admin原則AIにやらせない

見た目で判断しにくいものが3つあります。

  • gh api は、GitHubのAPI(プログラム用の窓口)を直接呼ぶコマンドです。既定は読むだけの GET ですが、パラメータを足すと書き込みの POST になり、--method でも変わります。付いているオプションまで読みます
  • gh pr create --dry-run は「作らずに内容を表示する」オプションですが、ヘルプに「May still push git changes」とあり、pushは走ることがあります
  • gh pr merge --admin は、要件を満たしていないプルリクエストを管理者の権限でマージします。マージキュー(マージの順番待ちの列)を飛ばして直接マージするときにも使います。レビュー必須などの決まりを飛び越える指定なので、見かけたら止めます

公開範囲の変更はヘルプでも注意が書かれていて、gh repo edit --visibility には --accept-visibility-change-consequences を一緒に付ける決まりです。--visibility public が見えたら、ホームページのファイルや予約メールのスクリプトが全世界に公開されるという意味です。

Claude Codeで許可を出すとき

Claude Codeの公式の説明では、Bashのコマンドは組み込みの読み取り専用のものを除いて確認が入ります。読み取り専用の例として挙げられているのは ls や grep、読むだけの git で、gh の名前はありません。確認が出る前提で考えておきます。

確認の画面で「Yes, and don’t ask again」を選ぶと、そのコマンドの形がリポジトリの .claude/settings.local.json に保存され、次から聞かれなくなります。これは次の考え方で使い分けます。

コマンド選ぶもの理由
gh pr view 21「don’t ask again」でよい読むだけ
gh pr create ...1回だけ「Yes」他の人に見える形でGitHubが変わる
gh pr merge ...「No」にして自分で押す本線の中身が変わる
gh repo delete ...「No」リポジトリごと消える

選択肢にはこのほかに「Yes, and switch to auto mode」が出ることがあります。選ぶと、人の代わりに自動の判定が確かめるようになり、上の使い分けができなくなります。

ルールは * で範囲を決めます。Bash(gh pr view *) なら gh pr view だけですが、Bash(gh *) にすると gh repo delete まで含めて全部通ります。公式も同じ形の Bash(git *) は全部の git コマンドを許すと説明しています。広い書き方はしないでください。

Claude Codeがghのコマンドを実行する前に出す確認
Claude Codeがghのコマンドを実行する前に出す確認

ghではできないことと、その代わり

できないことその代わり
コミットを作る、差分をステージするgit commit、git add、または画面付きの道具
GitLabやBitbucketを操作するGitHub専用。GitLabなら公式のCLI glab、Bitbucketはブラウザか、それぞれの案内を確かめる
手元のファイルの変更を送るgit push。gh pr create は未pushのときにpushを案内するが、中身の管理はGitの仕事
差分を見やすい画面で読むgh pr view --web でブラウザを開く。長い差分はブラウザのほうが読みやすい
インターネットなしで動くGitHubに問い合わせる道具なので不可。手元の履歴を見るだけなら git log

使わなくていい人

gh は無くても困りません。次に当てはまるなら入れなくていいです。

  • プルリクエストの作成やマージをブラウザで済ませている
  • GitHub Desktopで「Preview Pull Request」まで行けば足りている
  • 受付Aのように見るだけで、たまに画面を開く程度
  • GitHubではなくGitLabやBitbucketを使っている

入れておく価値があるのは、AIにプルリクエストまで作らせたい人と、外注エンジニアBのようにターミナルで一日作業している人です。Claude Codeの /install-github-app のように gh の導入を前提にする機能もあります。必要になってから入れれば間に合います。画面で済ませる道具の話は「GitHub Desktop・Sourcetree・VS Codeの使い方と選び方」に書きました。

よく詰まるところ

症状原因直し方
gh が見つからないと出るインストールされていない、またはターミナルが古いまま入れたあと、新しいウィンドウで開き直す
ログインを求められるgh auth login が済んでいない、期限切れgh auth login をやり直し、gh auth status で確かめる
gh は動くのに git push が通らない、またはその逆gh と git の認証は別のものgh auth login の手順4で Y と答えてやり直す
別のアカウントで動いている複数のアカウントでログインしているgh auth status で見て、gh auth switch で切り替える
違うリポジトリの一覧が出る別のフォルダで実行しているwebsite のフォルダで実行するか -R sample-cooking/website を付ける
gh pr create で送り先やフォークの選択を聞かれる枝がまだGitHubに無いsample-cooking/website への push を選ぶ。フォークは自分の複製を作る操作で、普段は選ばない
権限の無いリポジトリで gh pr create すると自分の複製ができた書き込み権限が無いと、自動でフォークが作られることも、選択肢として出ることもある持ち主に権限を確かめる。「GitHubの権限と2段階認証:共同作業者・Organization・非公開リポジトリ」へ
.github/workflows/ のファイルを git push すると断られるgh auth login の既定の権限に workflow が含まれないgh auth refresh -s workflow で足す。詳しくは「GitHub Actionsの使い方:自動で動かす仕組みと無料枠」へ
gh repo delete が権限不足で止まるdelete_repo の権限が要る止まったままにする。本当に消すなら、人がブラウザで確かめてからやる
gh pr list が空なのにプルリクエストはあるはず既定は開いているものだけgh pr list --state all で閉じたものも見る

GitHub Actionsの結果が失敗と出たときは、gh run list で一覧を見て、gh run view で詳しく見ます。Actions自体の話は「GitHub Actionsの使い方:自動で動かす仕組みと無料枠」に書きました。

次に読む

あわせて読む