2分間コーディングをさらに楽にする、gitとGitHub周りのテクニック

リチャード 伊真岡 blog

2分間コーディングをさらに楽にする、gitとGitHub周りのテクニック

以前「2 分間コーディングのすすめ、コードを書く習慣のハードルを下げる」という記事を書いたところ、多くの人に読んでいただいた上、好意的な意見をたくさんいただき、とても嬉しく思っています。さて今回は 2 分間コーディングを行う上でも役に立つ、git と GitHub まわりの作業を省力化するテクニックを紹介します。

GitHub 草を生やすには git コマンドを頻繁に叩く必要がある

私と同じように緑色の GitHub のコントリビューショングラフ、通称「草」をモチベーションとする人は、コーディングの成果を毎回 GitHub に push するために、頻繁に git コマンドを実行し、数多くの GitHub レポジトリも作成することになります。

github contribution graph

毎日の習慣としてストレスなくコーディングを繰り返すには、一連の git や GitHub まわりの作業を省力化することが重要になります。

github contribution graph

この記事で紹介するのは以下の 4 つのツールの組み合わせで、これによって楽にかつ高速に git や GitHub 周りの作業を繰り返せます。

  • ghq
  • peco
  • Oh My Zsh の git プラグイン
  • GitHub CLI

デモンストレーション

各ツールの使い方の詳細な説明に入る前に、4 つのツールを使った実際の作業を動画でお見せしましょう。タイプ数の少ないコマンドを組み合わて素早く作業が進んでいくのがわかると思います。

各ツールの使い方

それでは先に名前をあげた 4 つのツールの使い方を紹介します。本記事で紹介するのは GitHub コントリビューション・グラフを育てるのを楽にしてくれる部分だけですが、各ツールの威力の一端を感じていただけると思います。

ghq + peco

ghqは、git などの VCS レポジトリ群を管理するツールで、Go 言語の慣習がもたらす開発体験のよさに着想を得て開発されました。今では日本の技術コミュニティを中心に、様々なプログラミング言語の使い手たちが利用しています。はてな CTO であるmotemenさんが生み出し、現在は Nature CTO であるsongmuさんがメンテナをつとめています。

ghq はpecoと組み合わせれば更に便利になり、そのための設定もショートカットキーの登録を行うだけで簡単です。peco はコマンドライン上でのフィルタリングツールで、Perl や Go で有名なlestrratさんが Python のpercolを参考にして Go で開発しました。

先ほどの動画では以下の作業を行いました。

ghq create hello-world
Ctrk + ] キー押下
> hello を入力してpeco候補リストを絞り込み
Enter キー押下

最初はghq createコマンドです。このコマンドは ghq の推奨するディレクトリ構成に従ってディレクトリを作成し、かつ git init も自動で実行してくれます。 次にCtrl + ]ショートカットで ghq 管理下にあるレポジトリ一覧に対し、peco で絞り込みをかけ、helloと入力したところで候補がひとつになったので、Enterキー押下で go-hello-world レポジトリのディレクトリに移動しました。

この一連の作業は、以下とほぼ等価です。

cd ~
mkdir go-hello-world
cd go-hello-world
git init

ghq と peco の組み合わせは、タイピング数の節約については大きな違いがないように見えます。しかし、絞り込み対象が VCS レポジトリ群に限定され、先頭文字列だけでなく中間文字列の部分一致 (例: "hello"で"go-hello-world"に一致) でも絞り込めるので、ghq と peco を使わずに様々なファイルディレクトリを検索する方法とくらべてだいぶ楽になりますし、それを毎日繰り返すと作業効率の差は大きくなっていきます。

さらに ghq を使いこなす方法については ghq handbook を御覧ください。Ctrl + ]ショートカットキーの登録方法も載っています。

Oh My Zsh

次に紹介するのは zsh の設定ベスト・プラクティスの詰め合わせ、Oh My Zsh です。

Oh My ZSH の前にまずは zsh の話ですが、zsh は 2020 年から MacBook のデフォルトのシェルになりました。今では zsh を普段の開発で使っている人も多いことでしょう。

macOS Catalina から、Mac は zsh をデフォルトのログインシェルおよびインタラクティブシェルとして使うようになります。 - Apple 公式サポートページ: zsh を Mac のデフォルトシェルとして使う

zsh に限らず、シェルを自分好みにカスタマイズするのは、相応の知識が必要で時間のかかる作業ですが、Oh My ZSH は独力ではシェルを改造するのが難しい開発者たちの強い味方です。ターミナルの色付けや自動補完、ショートカットキーの登録をはじめ、シェル改造のエキスパートたちの積み重ねたベスト・プラクティス設定を、インストールコマンドひとつで自分のシェル環境に適用できます。

本記事で関わりがあるのは Oh My ZSH の中でも git プラグインです。これは下図のように git コマンドの省略形のエイリアスを提供してくれるので、繰り返せば繰り返すほど時間を節約してくれますし、「各 git コマンドの省略形はどういったエイリアスにすべきか」と自分で悩む必要もありません。軽快なリズムを失うこと無く GitHub のコントリビューション・グラフを育て続ける味方になってくれます。

Oh My Zsh コマンド git コマンド
gaa git add --all
gc -m "init" git commit -v -m "init"
ggp git push origin $(current_branch)

GitHub CLI

ツールの紹介の最後は GitHub CLI です。その名の通り GitHub 公式ツールで、コマンドラインから GitHub の操作が可能です。Oh My Zsh にもgithub プラグインは存在するのですが、GitHub 認証のやりやすさや安定性などは GitHub 公式の CLI の方が良いように感じます。

本記事に関連するのは gh repo create コマンドです。わざわざ Web ブラウザから https://github.com を開いてレポジトリを作成しなくて良くなります。 ただし、そのまま使うと github repo create コマンドは、以下のように対話形式で何度も質問を投げかけて来て少し面倒です。

gh repo create
? Repository name
  > go-hello-world
? Repository description
  >
? Visibility
  > Public
  > Private
  > Interval
? This will add an "origin" git remote to your local repository. Continue? (y/n)
  > ✓ Created repository richardimaoka/go-hello-world on GitHub
  > ✓ Added remote git@github.com:richardimaoka/go-hello-world.git

~/.zshrc に以下のエイリアス定義をしておくと、対話形式の質問を 1 個だけに減らせます。この最後の質問は省略するのが難しく、その理由はローカルのレポジトリ名の指定は自動化しづらいからです。Enter キー 1 回分押せば良いなので、最後の質問は残しても大きな問題ではありません。

## GitHub CLI
alias ghrc="gh repo create --public --description description -y"

他の作業フロー例をいくつか紹介

ここまではまっさらな新規の GitHub レポジトリを作成してコードを push するためのツールの使い方紹介してきました。ここからは、その他のパターンの作業例で、いずれも 2 分間コーディングの一環として取り組めそうなものばかりです。

第 3 者 GitHub レポジトリの fork、書き換え

GitHub で公開されているサンプルコードを手元で動作を認するのは、技術を覚える上でとても有効です。手元で試して終わりではなく、GitHub のコントリビューション・グラフを育てるには、書き換え可能な状態にするため fork したあとで、最終的には git push まで行います。

適当な例として Go の gRPC 実装である https://github.com/grpc/grpc-go/ には、サンプルコードとして examples ディレクトリ があるので、このレポジトリを例に取ると、

  1. Web ブラウザから https://github.com/grpc/grpc-go に飛んで、レポジトリを fork

github-fork

  1. fork が終了したら、レポジトリの URL をコピー

github-clone

  1. レポジトリを手元に落として、コードを改変して走らせる
ghq get -l https://github.com/grpc/grpc-go
code .

# あとは適当に書き換えて走らせる

この時点で origin は fork した先である自分のレポジトリを指しているので、次のステップでの git push が楽になります

git remote -v
origin  ssh://git@github.com/richardimaoka/grpc-go.git (fetch)
origin  ssh://git@github.com/richardimaoka/grpc-go.git (push)
  1. コード改変が終わったら、GitHub に push
gaa
gc -m "modified locally"
ggp

第 3 者 GitHub レポジトリを読むだけのつもりで clone したあと、気が変わって書き換えてから push

サンプルコードを走らせるつもりはなくても、OSS の本体ソースコードを手元に落として読むことも OSS の学習に有用です。 ghq + peco があれば、手元に落とした OSS のレポジトリを、いつでも簡単に検索できるので、ソースコード・リーディングがとても快適になります。

ghq get -lコマンドを使えば、ghq ディレクトリ構成に従った上で内部的にgit cloneしてくれますが、OSS 本体レポジトリから clone してしまうと、 下記のように origin が自分のレポジトリではなく本体レポジトリになり、push するのが少し面倒です。

ghq get -l https://github.com/grpc/grpc-go

git remote -v
origin  ssh://git@github.com/grpc/grpc-go.git (fetch)
origin  ssh://git@github.com/grpc/grpc-go.git (push)

かといって、当初書き換えるつもりがなく、ソースコード・リーディングをするためだけなのに毎回 fork するのも面倒です。

そんなときは、gh repo fork コマンドを使いましょう。非常に賢いことに、このコマンドは remote レポジトリの再設定まで自動行ってくれるので、fork 先の自分のレポジトリが origin に、fork 元のレポジトリが upstream に設定されます。

gh repo fork
  ✓ Created fork richardimaoka/grpc-go
  ? Would you like to add a remote for the fork? Yes
  ✓ Added remote origin

git remote -v
  origin  https://github.com/richardimaoka/grpc-go.git (fetch)
  origin  https://github.com/richardimaoka/grpc-go.git (push)
  upstream        https://github.com/grpc/grpc-go (fetch)
  upstream        https://github.com/grpc/grpc-go (push)

既存レポジトリ再利用してコード書き換え

先ほどの「clone したあと、気が変わって書き換えてから push」と似ていますが、自分用のコードスニペットを溜め込んでいるレポジトリや、自分用のサンドボックス用レポジトリがある場合、 ネットで見つけたちょっとしたコードを動かして試したくなることがあるでしょう。

ここでは ghq + peco が真価を発揮します。自分が現在どのディレクトリにいたとしてもCtrl + ]ショートカットで素早く目的のレポジトリに移動できます。

ghq peco

ここで私が気に入っているテクニックは、go-sandbox, python-sandbox などの-sandbox で終わる名前のレポジトリを作って何度も再利用することです。 再利用するサンドボックス・レポジトリは、毎回新規 GitHub レポジトリを作って収集がつかなくなることを防ぎます。

サンドボックス・レポジトリは、いつ消してもいいファイルだけを置くので、新しいコードを試したくなるたびに、

  • ファイルを全消去して gc -m "cleared"
  • 試したいコードコピペして gc -m "today's code"

とすれば git commit2 つ分になり、GitHub コントリビューショングラフが育てやすくなります。いつでもきれいなサンドボックスを保ったまま、必要とあれば履歴から消してしまったコードも探せます。

まとめ: git と GitHub 周りを省力化するその前に

最後になってしまいましたが注意点をひとつ。たまにしか git や GitHub 周りの作業を行わない人や、2 分間コーディングがまだ習慣化していない段階の人は、無理をして今すぐツールを入れる必要はありません。個人的には、git や GitHub 作業の繰り返しに大きなストレスを感じ始めてからの導入で良いと思います。

4 つもの新しいツールを使い始めるのは、どうしても認知的な負荷が高くなります。使いたくなったら、あとからいつでも使い始められます。私も git 使用歴 5 年以上経ちますが、2 分間コーディングを始めた最近になってようやく、これらのツールが必要だと感じるようになりました。

もしあなたが git や GitHub 作業を習慣的に行っているなら、ここで紹介したテクニックが役立ってくれることを願います。