CUEBiC TEC BLOG

キュービックTECチームの技術ネタを投稿しております。

ターミナルで完結!便利なGit運用 Tipsを紹介してみた

概要

こんにちは、キュービックでSREをやっているYuhta28です。キュービック内のテック技術について発信します。
皆さんはGit開発する際、ターミナルでgitコマンド実行後GitHubのサイトを訪れてPRしマージされますでしょうか。そしてマージした後またローカルに戻ってgit pullでローカルブランチも最新にしていますか🤔
せっかくターミナルで操作しているのに途中でブラウザ操作が入るのは個人的には面倒だと感じています。git pushした後の操作も全てターミナルで完結すればブラウザ切り替えする手間も減らせて煩わしさが減ると思いませんか。
ローカルのリポジトリもバラバラにgit clone するとあのリポジトリどこだっけ?となり探すのがこれまた面倒になります。
今回GitHub上の操作をターミナルで実現できるGitHub CLIコマンドの紹介とghq、pecoを使った快適なリポジトリ管理を紹介していきます。

GitHub CLIについて

cli.github.com

GitHub CLIは2020年にバージョン1系がリリースされ、昨年8月にバージョン2系がリリースされたGitHub操作をターミナル上で実現するためのOSSになります。
GitHub CLIをインストールすることで前述のgit push以降のGitHub操作をターミナルから操作できるようになりシームレスなGit運用ができるようになります。バージョン2では拡張コマンド機能が追加され、よりカスタマイズされた操作ができるようになりました。(今回拡張コマンドを使うことはないので詳細な說明は割愛いたします)

インストール

概要はこのくらいにして早速インストールしていきます。MacでしたらHomebrewからインストールできます。

brew install gh

その他にも多くのパッケージマネージャ経由でインストールできますので、GitHubのREADMEページをご覧ください。

github.com

初期設定

インストールできましたらGitHub CLIの認証を行います。 SSHGitHubに接続されていましたらローカルのSSH秘密鍵GitHub CLIに認証させます。HTTPで接続されていましたらトークン値を貼り付けましょう。

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? Skip
? How would you like to authenticate GitHub CLI? Paste an authentication token
Tip: you can generate a Personal Access Token here https://github.com/settings/tokens
The minimum required scopes are 'repo', 'read:org'.
? Paste your authentication token:
~~~~~~省略~~~~~~

認証が通りましたらGitHubアカウントとしてGitHub CLIが使えるようになります。

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

Goインストール

このあと紹介するghqもpecoもGo製のOSSなので事前にGoをインストールする必要があります。MacでしたらHomebrewでインストールできますので事前にインストールします。

brew install go

ghqについて

github.com
ghqとはリポジトリ管理を楽にするコマンドラインツールでGo製のOSSです。GitHubリポジトリをローカルにクローンする場合、git cloneを実行したディレクトリ直下にローカルリポジトリが作成されます。
もし適当なディレクトリにクローンして管理するとどこにローカルリポジトリがあるのか探すのが大変ですし、ローカルにリポジトリをクローンし過ぎるとあっという間にローカルリポジトリの数は膨れ上がります。ghqとこのあと紹介するpecoを組み合わせることで、目的のリポジトリに瞬時に移動できます。

インストール

brew install ghq

pecoについて

github.com
pecoも先述のとおりGo製のOSSです。インタラクティブgrepツールでghqと組み合わせれば強力なリポジトリ管理ツールになります。

インストール

brew install peco

初期設定

2つをインストールできましたらまずは使用感について試しておきましょう。
ghq get <リモートリポジトリURL>GitHubリポジトリをローカルにクローンすることができます。クローン先はデフォルトでは$HOME/ghqですが、git configでクローン先を変更できます。

git config --global ghq.root '~/go/src' #~/go/srcディレクトリ直下にリポジトリを取得

取得したリポジトリghq listで一覧化できます。

$ ghq list
github.com/aws/aws-health-tools
github.com/cuebic/XXXXXXXXXXXXXXXX
github.com/iann0036/former2

続いてpecoも試しておきましょう。pecoはパイプで前のコマンドの結果を渡すことで真価を発揮します。

Executed `ps -ef | peco`, then the query `root` was typed. This shows all lines containing the word root GitHub READMEから引用

エイリアスコマンド作成

ghqとpecoの動作確認が完了しましたらこの2つを組み合わせたワンライナーコマンドを作成し、シェルの読み込みファイルに記載します。

# .zshrc

# ghq+peco
alias ghcd='cd $(ghq root)/$(ghq list | peco)'

記載しましたらsourceコマンドで読み込みます。

source ~/.zshrc

実行結果

$ ghcd

QUERY>
github.com/cuebic/XXXXXXXXXXXXXXXX
github.com/cuebic/XXXXXXXXXXXXXXXX

ターミナル操作

必要な準備は完了しました。これでどのように変わるでしょうか。
試しに新しいOSSリポジトリをローカルに落としたい場合は、git cloneからghq getに変わります。

$ ghq get git@github.com:github/gitignore.git
     clone ssh://git@github.com/github/gitignore.git -> /Users/ghq/github.com/github/gitignore
       git clone --recursive ssh://git@github.com/github/gitignore.git /Users/ghq/github.com/github/gitignore
Cloning into '/Users/ghq/github.com/github/gitignore'...
remote: Enumerating objects: 9730, done.
remote: Counting objects: 100% (6/6), done.
remote: Compressing objects: 100% (6/6), done.
remote: Total 9730 (delta 0), reused 4 (delta 0), pack-reused 9724
Receiving objects: 100% (9730/9730), 2.30 MiB | 2.16 MiB/s, done.
Resolving deltas: 100% (5288/5288), done.

ghcdですぐにローカルにクローンしたリポジトリに移動できます。

$ ghcd
QUERY>                                                  
github.com/github/gitignore

そして、ローカルリポジトリの編集が完了し、リモートリポジトリにコミットしてマージする場合もターミナル内で全て完結できます。

# リモートリポジトリへのaddからpush作業
$ git add .

$ git commit -m "fix"
[feature/add-gitops-article 37cb79b] fix
 2 files changed, 55 insertions(+), 6 deletions(-)

$ git push origin feature/add-gitops-article
Enumerating objects: 14, done.
Counting objects: 100% (14/14), done.
Delta compression using up to 8 threads
Compressing objects: 100% (7/7), done.
Writing objects: 100% (8/8), 61.15 KiB | 15.29 MiB/s, done.
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * [new branch]      feature/add-gitops-article -> feature/add-gitops-article

 # mainブランチへのPRからマージ作業
$ gh pr create

Creating pull request for feature/add-gitops-article into main in cuebic/XXXXXXXXXXXX

? Title fix
? Body <Received>
? "What's next? Submit"
https://github.com/cuebic/XXXXXXXXXXXX/pull/19

$ gh pr status

Relevant pull requests in cuebic/XXXXXXXXXXXX

Current branch
  #19  fix [feature/add-gitops-article]

Created by you
  #19  fix [feature/add-gitops-article]

Requesting a code review from you
  You have no pull requests to review

$ gh pr merge
? What merge method would you like to use? Create a merge commit
? Delete the branch locally and on GitHub? Yes #マージ後にローカルブランチを削除するか選択
? "What's next? Submit"
✓ Merged pull request #20 (feature/add gitops article)
remote: Enumerating objects: 2, done.
remote: Counting objects: 100% (2/2), done.
remote: Compressing objects: 100% (2/2), done.
Unpacking objects: 100% (2/2), 1.24 KiB | 633.00 KiB/s, done.
remote: Total 2 (delta 0), reused 0 (delta 0), pack-reused 0
From ssh://github.com/cuebic/XXXXXXXXXXXX
 * branch            main       -> FETCH_HEAD
   43e72c6..016f5bd  main       -> origin/main
Updating 43e72c6..016f5bd
Fast-forward
 entry/2022/05/17/122008.md | 101 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----
 1 file changed, 95 insertions(+), 6 deletions(-)
✓ Deleted branch feature/add-gitops-article and switched to branch main #ローカルのブランチを削除

所感

ご覧のようにgit addからGitHubリポジトリのマージまで全てターミナル上で完結しました。今までは毎回ローカルでgit pushした後にGitHubのサイトを開いて、PRを作成しマージする必要がありました。ターミナルからその操作を全て完結すればストレスフルなGit開発ができると思いますのでみなさんもぜひ試してみてください。

参考文献

zenn.dev

qiita.com