GitHubをコマンドラインから操作する

目次

今までGitHubをWebブラウザから操作していたのですが、公式でコマンドラインでGitHubを操作できる「GitHub Cli」というツールがありました。 個人的なGitHubの使い方のメモも兼ねてインストールから、リポジトリの作成、pushでの更新、issue、プルリクエストまで使ってみます。

環境は「Ubuntu 20.04.2 LTS」です。PCで使用しているgitは version 2.25.1です。

GitHub Cli?

“GitHub Cli"はコマンドラインでGitHubの操作が行えるツールで、GitHubが公開しています。

https://cli.github.com

詳細な使い方は公式ページにあります。

https://cli.github.com/manual/

インストールする

GitHub Cliをインストールします。

公式ドキュメントを参考にインストールします。

https://github.com/cli/cli#installation

いくつか方法があるのですが、とりあえず今回はLinux用のバイナリを使おうと思います。 2021年8月8日に最新バージョンであるGitHub CLI 1.14.0をインストールします。

ダウンロードページには複数の環境に対応したファイルがあります。動作しているPCのハードウェア情報はuname -mコマンドで確認することが出来ます。

$ uname -m
x86_64

amd64はx86_64にも対応しています。 使用するUbuntuはDebian系のため拡張子が”.deb"のDebian系ディストリビューション向けパッケージをダウンロードします。

ダウンロードページ

ダウンロードページ

# ダウンロードページのgh_1.14.0_linux_amd64.debをPCにダウンロードする
$ curl https://github.com/cli/cli/releases/download/v1.14.0/gh_1.14.0_linux_amd64.deb -O -L
# ダウンロードファイルが破損していないか確認するためチェックサムをダウンロードする
$ curl https://github.com/cli/cli/releases/download/v1.14.0/gh_1.14.0_checksums.txt -O -L
# チェックサムを確認する
$ sha256sum -c gh_1.14.0_checksums.txt
sha256sum: gh_1.14.0_linux_amd64.rpm: そのようなファイルやディレクトリはありません
gh_1.14.0_linux_amd64.rpm: FAILED open or read
・・・中略・・・
gh_1.14.0_linux_amd64.deb: OK
・・・中略・・・
sha256sum: gh_1.14.0_linux_armv6.tar.gz: そのようなファイルやディレクトリはありません
gh_1.14.0_linux_armv6.tar.gz: FAILED open or read
sha256sum: 警告: 一覧にある 14 個のファイルが読み込めませんでした

警告が表示されますがダウンロードしたファイル"gh_1.14.0_linux_amd64.deb"はOKとなっているので問題ありません。

.debパッケージはdpkgコマンドでインストールします。

$ sudo dpkg -i ./gh_1.14.0_linux_amd64.deb

確認のためバージョンを表示してみます。

$ gh --version
gh version 1.14.0 (2021-08-04)
https://github.com/cli/cli/releases/tag/v1.14.0

GitHub認証を行う

コマンドからGitHubに接続できるように認証します。 gh auth loginコマンドを実行すると認証方法を聞かれるので答えていきます。 選択肢が表示されるので上下キーで選択することができます。

$ gh auth login
? What account do you want to log into? GitHub.com
? What is your preferred protocol for Git operations? SSH
? Upload your SSH public key to your GitHub account? /home/izumi/.ssh/id_ed25519.pub
? How would you like to authenticate GitHub CLI? Login with a web browser

! First copy your one-time code: xxxx-xxxx
- Press Enter to open github.com in your browser... 

ここでエンターキーを押すと自動的にブラウザが起動します。 GitHubへのログイン画面が表示されるのでログインすると、有効化画面へ遷移するので端末に表示されている"one-time code"を入力します。

ワンタイムコード入力画面

ワンタイムコード入力画面

認可確認画面が表示されるので"Authorize github"ボタンを押します。

認可確認画面

認可確認画面

認証完了画面が表示されます。

認証完了画面

認証完了画面

端末画面でエンターキーを押すと認証が完了します。

✓ Authentication complete. Press Enter to continue...

- gh config set -h github.com git_protocol ssh
✓ Configured git protocol
✓ Uploaded the SSH key to your GitHub account: /home/izumi/.ssh/id_ed25519.pub
✓ Logged in as hn-carter

GitHub Cliのコマンドで接続状況を確認してみます。

$ gh auth status
github.com
  ✓ Logged in to github.com as hn-carter (/home/izumi/.config/gh/hosts.yml)
  ✓ Git operations for github.com configured to use ssh protocol.
  ✓ Token: *******************
  

リポジトリを新規作成する

まずローカルに空のリポジトリを作成し、その後GitHubにリポジトリを作成します。

GitHubにリポジトリを作成するにはgh repo create リポジトリ名コマンドを実行します。

  • –description 説明文 (リポジトリの説明文を記述します)
  • –public (公開リポジトリにします)
  • –confirm (確認をスキップします)
# ローカルに空のGitリポジトリを作成します
$ git init sample-web
Initialized empty Git repository in /home/izumi/sample-web/.git/
# カレントディレクトリを変更します
$ cd sample-web
# GitHubにリポジトリを新規作成します
$ gh repo create sample-web --confirm --description "webサイトのサンプル" --public
✓ Created repository hn-carter/sample-web on GitHub
✓ Added remote git@github.com:hn-carter/sample-web.git

これでGitHubに空のリポジトリが作成されました。

ブラウザでレポジトリを確認

ブラウザでレポジトリを確認

ローカルのブランチを変更する

GitHubがリポジトリのデフォルトブランチ名が"master"から"main"に変更されているのですが、ローカルで使用している「git version 2.25.1」ではデフォルトブランチ名が"master"のままなので変更します。

# "main"ブランチを作成し、カレントブランチに切り替えます
$ git checkout -b main
Switched to a new branch 'main'

“main"ブランチを作成したので、“README.md"ファイルを作成しGitHubへ転送します。

# README.mdファイルを作成します
$ echo -e "# htmlサンプル\n\nテスト用" > README.md
# ステージングエリアに追加し、
$ git add README.md
# コミットします
$ git commit -m "README.mdファイルを作成しました"
[main (root-commit) 94f8a70] README.mdファイルを作成しました
 1 file changed, 3 insertions(+)
 create mode 100644 README.md
# 一覧表示で"main"ブランチしか無いことを確認できます
$ git branch
* main
# リモートリポジトリを確認します
$ git remote -v
origin	git@github.com:hn-carter/sample-web.git (fetch)
origin	git@github.com:hn-carter/sample-web.git (push)
# リモートに変更がないため`origin`に`main`ブランチをpushします
# `-u`オプションで次回からは`git push`のみで同じことが行えます
$ git push -u origin main
Enumerating objects: 3, done.
Counting objects: 100% (3/3), done.
Writing objects: 100% (3/3), 307 bytes | 30.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To github.com:hn-carter/sample-web.git
 * [new branch]      main -> main
Branch 'main' set up to track remote branch 'main' from 'origin'.

ブラウザでファイルがGitHubへ転送されたことを確認できます。

ブラウザでREADME.mdを確認

ブラウザでREADME.mdを確認

issue イシューを作成する

issueをToDoメモ代わりに使ってみます。

issueはgh issue createコマンドで作成します。 文章は”(ダブルクォーテーション)で囲むことで改行することが出来ます。 --assignee @meとすることで自分をアサインできます。

$ gh issue create --title "webページを作る" --body "とりあえずテスト用にwebページを作ります

- [ ] htmlファイル
- [ ] cssファイル

ダブルクォーテーションで囲むことでコマンドラインでも複数行の入力をすることが出来ます
" --assignee @me

上記のコマンドを実行するとGitHubにissueが作成されて、アドレスが返ってきます。


Creating issue in hn-carter/sample-web

https://github.com/hn-carter/sample-web/issues/1
ブラウザでissueを確認

ブラウザでissueを確認

issueはコマンドラインからも見ることが出来ます。

gh issue listコマンドでissueの一覧を表示することが出来ます。

$ gh issue list

Showing 1 of 1 open issue in hn-carter/sample-web

#1  webページを作る    about 9 minutes ago

gh issue view 番号コマンドで詳細を表示することが出来ます。

$ gh issue view 1
webページを作る #1
Open • hn-carter opened about 9 minutes ago • 0 comments
Assignees: hn-carter


  とりあえずテスト用にwebページを作ります                                     
                                                                              
  [ ] hrmlファイル                                                            
  [ ] cssファイル                                                             
                                                                              
  ダブルクォーテーションで囲むことでコマンドラインでも複数行の入力をすることが出来ます


View this issue on GitHub: https://github.com/hn-carter/sample-web/issues/1

作成したissueにコメントするにはgh issue comment 番号コマンドを使います。

$ gh issue comment 1 --body "コメントのテスト
これはGitHub CLIでコメントしています
"
ブラウザでissueコメントを確認

ブラウザでissueコメントを確認

CUIでissueコメントを確認

CUIでissueコメントを確認

ブランチを作成する

ここからローカルでGitHubで管理するファイルを作成します。 このとき、mainブランチはいつでも実行可能な状態にしておくために作業用のブランチを作ります。変更は作業用ブランチに対して行います。

# "feature-1"ブランチを作成し、カレントブランチに切り替えます
$ git checkout -b feature-1

ここでいろいろ作業してファイルを作成します。とりあえず"sample.html"ファイルと"css"デレクトリを作り、そこに"style.css"ファイルを作成しました。

├ README.md 
├ sample.html
└ css/
    └ style.css

作業内容をコミットします。コミットをどの程度の頻度で行うかは自由ですが、今回はファイル単位にコミットしました。 コミットする際にメッセージに「#issueの番号」を含めると、自動でissueにリンクが付与されます。

# ステージングエリアにファイルを追加し、
$ git add sample.html
# コメントを付けてコミットします
$ git commit -m "add htmlファイルを作成 #1"
$ git add css/style.css
$ git commit -m "add スタイルシートを作成 #1"

コミットした結果をリモートリポジトリにpushします。

# リモートの`origin`に作業中の`feature-1`ブランチをpushします
$ git push origin feature-1
Enumerating objects: 8, done.
Counting objects: 100% (8/8), done.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (7/7), 889 bytes | 59.00 KiB/s, done.
Total 7 (delta 0), reused 0 (delta 0)
remote: 
remote: Create a pull request for 'feature-1' on GitHub by visiting:
remote:      https://github.com/hn-carter/sample-web/pull/new/feature-1
remote: 
To github.com:hn-carter/sample-web.git
 * [new branch]      feature-1 -> feature-1
ブラウザで'feature-1'ブランチを確認

ブラウザで'feature-1'ブランチを確認

コミットのメッセージにissueがリンクされています。

コミットメッセージのissueリンク

コミットメッセージのissueリンク

プルリクエストを作成する

変更がGitHubへpushされたので、レビュー依頼の通知をするためプルリクエストを作成します。 この辺の作業はよくわからないのですがとりあえず練習のためやってみてます。

プルリクエストをissueにリンクするにはキーワードを使用します。 Linking a pull request to an issue

キーワードはcloses #issue番号となります。

$ gh pr create --title "初めてのプルリクエスト" --body "とりあえずHTMLとCSSを作成しました。

issue1とリンクします
closes #1
"

プルリクエストが作成されると、リンクが返ってきます。

Creating pull request for feature-1 into main in hn-carter/sample-web

https://github.com/hn-carter/sample-web/pull/2
ブラウザでプルリクエストを確認

ブラウザでプルリクエストを確認

gh pr listコマンドでプルリクエストの一覧を表示します。

$ gh pr list

Showing 1 of 1 open pull request in hn-carter/sample-web

#2  初めてのプルリクエスト  feature-1

詳細を表示するにはgh pr view プルリクエストの番号を実行します。

$ gh pr view 2
初めてのプルリクエスト #2
Open • hn-carter wants to merge 2 commits into main from feature-1 • +16 -0 


  とりあえずHTMLとCSSを作成しました。

  issue1とリンクします closes #1


View this pull request on GitHub: https://github.com/hn-carter/sample-web/pull/2

作成したプルリクエストにコメントするにはgh pr comment comment 番号コマンドを使います。

$ gh pr comment 2 --body "プルリクエストへのコメントのテスト
- [x] できてる?
"
ブラウザでコメントを確認

ブラウザでコメントを確認

プルリクエストをマージし、issue をクローズする

修正が完了したらmainブランチにマージします。 プルリクエストにissue #1が紐付けされているので、マージすると自動でissueもクローズされます。

$ gh pr merge 2 --merge --body "とりあえず完成"
✓ Merged pull request #2 (初めてのプルリクエスト)

“feature-1"ブランチの作業内容が"main"ブランチに結合しています。

ブラウザでmainブランチを確認

ブラウザでmainブランチを確認

issueもクローズされています。

ブラウザでissue#1を確認

ブラウザでissue#1を確認

ローカルリポジトリをリモートリポジトリと同じ状態にする

ローカル環境をリモートと同じ状態にします。

# mainブランチに移動して
$ git checkout main
# リモートリポジトリの変更を取り込みます
$ git pull origin main

GUIのgitkで変更履歴を見てみました。

$ gitk
gitk画面

gitk画面