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/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へ転送されたことを確認できます。
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はコマンドラインからも見ることが出来ます。
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でコメントしています
"
ブランチを作成する
ここからローカルで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
コミットのメッセージに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"ブランチに結合しています。
issueもクローズされています。
ローカルリポジトリをリモートリポジトリと同じ状態にする
ローカル環境をリモートと同じ状態にします。
# mainブランチに移動して
$ git checkout main
# リモートリポジトリの変更を取り込みます
$ git pull origin main
GUIのgitkで変更履歴を見てみました。
$ gitk