🐾

gitの生産性を高める設定

2023/04/14に公開

こんにちは。takaminです。

最近転職したのですが、新しい環境は人間関係や使用技術が一新され、毎日が刺激だらけとなり楽しいですね。

同時に、Developerは専門的な技術ももちろんですが、汎用的で基礎的な技術を「きっちりと」身につけておくことが大切なのだなと身に染みて感じています。

今回は、git操作の生産性を高める方法を書いていきたいと思います。
gitは毎日使うツールなので、ぜひ自分に合ったツールを導入してみてください。

なお、生産性を上げるには「使用頻度が高いもの」や「かけている時間が多いもの」にテコ入れするのがコツです!
gitに限らず、常にラクできるものがないか情報を仕入れていくことが大切ですね。

簡単な環境紹介

  • macOS Ventura 13.3 (macデビューしました。これでスタバでしゃしゃれます。)
  • zsh 5.9

とりあえずmacで話が進みますが、windowsやlinuxでも使えるツールもあるので、適宜読み替えてください。

1. Gitエイリアス

Gitエイリアスは最も手軽で親しみのある方法ですね。
よく使うコマンドにはどんどんエイリアスを登録していくのがいいと思います。

登録方法は以下です。

git config --global alias.XXX YYY

XXXにエイリアスを。YYYに対象コマンドを書きます。

※ところで、なんとなくglobalを使っていませんか?(開く)

--globalオプションをなんとなく使っている人も多いと思います。
こういう、何気なく使っているオプションを掘り下げると意外と身になるものです。

git configのオプションには3種類あり、configの効力範囲(スコープ)を決められます。

--system 全ユーザで有効な設定
--global 今ログインしているユーザで有効な設定
--local 今いるgitリポジトリでのみ有効な設定

参考までに、私の設定は以下です。

$ git config --global alias.com commit
$ git config --global alias.che checkout
$ git config --global alias.swi switch
$ git config --global alias.bra branch
$ git config --global alias.sta status

私は3文字で統一していますが、もっと短くする人もいますし、人それぞれですね。

また、私はそこまでゴリゴリgitを触らないのであまり面白いエイリアスはありませんが、diffとかlogとかの複雑なコマンドのエイリアスを作るともっと便利だと思います。

エイリアス以外の設定

以下の設定で、リモートにないブランチでも--set-upstream origin...をいちいち設定せずにgit pushでpushできるようになります。
超便利。

git config --global --add --bool push.autoSetupRemote true

2. ghq

https://github.com/x-motemen/ghq
ghqはリポジトリ管理に最適なツールです。
ghqの特徴は以下です。

  • あらかじめ設定したディレクトリに自動的にgit cloneしてくれるようになる
  • cloneの際、OrganizationやAccoutごとにうまくディレクトリを作ってくれる

これにより、いちいちcdしてからgit cloneする必要がなくなります。
また、cloneしてきたリポジトリのアカウントごとにディレクトリを作ってくれるので、常にローカルのリポジトリ構造が整理された状態になります。

インストール方法

brew install ghq

使い方

まずは、clone先のルートとするディレクトリを決めましょう。
特にない方はデフォルト放置で十分だと思います。

※私は今までgitcloneディレクトリを作ってそこに色々ぶち込んでいたいたアナログタイプだったので、ghqのルートもなんとなくこの名前のディレクトリにしました。

$ git config --global ghq.root '~/gitclone'

次に、好きなリポジトリをクローンします。
このとき、git cloneではなくghq getコマンドを使います。(git cloneは残念ながら二度とお目にかかることはないでしょう。)

今回は、みんな大好き https://github.com/anuraghazra/github-readme-stats をcloneすることにします。

$ ghq get https://github.com/anuraghazra/github-readme-stats

すると、以下のようなディレクトリ構造が生まれているはずです。

  • ghqルート(デフォルトは多分ghq
    • github.com
      • anuraghazra
        • github-readme-stats

このように自動的にうまいことディレクトリを切ってくれます。
おかげで、gitlabからcloneしようと、違うユーザのリポジトリをcloneしようと、綺麗にディレクトリが分かれてくれます。

他にも、cloneしてきたリポジトリを一覧表示できます。

$ ghq list

例えばこの後にcdコマンドを駆使すれば簡単にリポジトリ移動ができると思います。
※後述のpecoを組み合わせるともっと簡単にリポジトリ移動が可能になります!

3. peco

pecoはコマンド結果のインクリメンタルサーチを可能にするツールです。
要はサジェストです。

伝えるのが少し面倒()なのでぜひ公式のデモ画像を見て欲しいです。
https://github.com/peco/peco

インストール

$ brew install peco

使い方

以下のコマンドを打てば全てを理解すると思います。

ls結果が一覧で表示された後、好きな文字を打ち込むことでインクリメンタルサーチが働き、まぁ要は絞り込みをすることができます。

$ ls | peco

pecoとghqを組み合わせる

どんなところからでも一瞬で対象リポジトリに移動

$ cd $(ghq list --full-path | peco)
  1. ghq listはローカルにあるリポジトリを一覧でフルパスで返す
  2. pecoで検索をかけて1つに絞り込む
  3. フルパスに対してcdする

という仕組みです。

とはいえ上記コマンドを打ち込むのは面倒なので、さらに、./zshrcなどにコマンドを登録しておきましょう。

~/.zshrc
alias cdrepo='cd $(ghq list --full-path | peco)'

エイリアスはお好みです。私の場合はcdrepoという名前で登録しました。
コマンドを呼び出せばどこからでもスッとリポジトリに移動できます。気持ちいい。

名前が曖昧なリモートブランチのチェックアウト

~/.zshrc
$ alias cherbra='git switch $(git branch -r | peco | cut -c 10-)'

リモートにあるブランチをチェックアウトしたいけど、名前なんだったっけな。。を解決するコマンド。

  1. リモートブランチをリスト表示
  2. pecoで検索
  3. __origin/をcutしたブランチ名でチェックアウト

という仕組みです。(※cutのところもっと綺麗にできそうだけど。)
なお、CHEckout Remote BRAnchです。

4. gh (hub)

続いてghコマンドを紹介します。
ghコマンドはGitHub CLI(公式)です。

https://github.com/cli/cli

これを使うと、GitHubをローカルから操作することが可能になります。
例えば

  • PRの作成やその他操作
  • issueの作成やその他操作
  • GitHub Actionsの操作
    などがローカルから使えるようになります。(他にもたくさんある。)

なお、似たようなコマンドにhubコマンドがあり、これはghコマンドが発展途上だった時から使われている歴史あるコマンドのようです。

https://github.com/github/hub

githubから公式のghが出た以上、hubを使っていないのであればghでいいのではないかなと思っています。

インストール

$ brew install gh

使い方

まだまだ使いこなせておらず、紹介できそうにないです。
ただ、とりあえずこれもpecoghqと絡めると良さそうです。

例えば、

  • ローカルからPRを生成するとき
  • リモートにあるリポジトリを検索してクローンするとき
  • リモートの特定のブランチを検索してチェックアウトするとき
    などなど。

GitHubでよく行う作業があれば、それはgh, pecoなどで自動化できる可能性が高いので、ぜひ調べてみてください。

5. tig

https://github.com/jonas/tig
(wip)

6. GUIツール

(wip)

7. その他

7-1. gitignore

.gitignoreファイルでgit管理したくないファイルやディレクトリを指定することができます。
macを使い始めたのですが、.DS_Storeというファイルが謎に生成されるので邪魔ですよね。

この時は、.gitignoreファイルに記載することもできますが、gitのグローバル設定に書くようにしたほうが良いと言われています。

https://qiita.com/anqooqie/items/110957797b3d5280c44f#thumbsdbやds_storeをgitignoreに入れるのはよくないって本当

gitignoreはあくまで、プロジェクト固有の無視したいファイル or ディレクトリを記録する場所であるとされている。
開発者個人の環境に依存する、無視したいファイル or ディレクトリは、本来は開発者個人がglobal .gitignoreという場所に書いて管理するというのが望ましい習慣である。

.gitignoreはプロジェクトに関することに閉じるべきで、.DS_Storeの存在なんてWindowsユーザ(過去の私)は知ったこっちゃない話ですからね。

~/.config/git/ignore ←場所はココ
.DS_Store

さて、.gitignoreがプロジェクトに閉じるべきという意見はごもっともですが、私個人の意見としては余計なファイルが混ざり込む事故を避けるために、.gitignoreに書いてもいいのでは? と率直に感じますね。

ただ私なんて若造なので、こういう問題は先人の知恵に従いましょう。

7-2. others

Git系のCLIツールを紹介しているリポジトリがあったのでまたみてみたいですね。

https://github.com/frontaid/git-cli-tools

最後に

git操作は毎日行うことだと思うので、ぜひ自分に合ったツールを取り入れてみてください。

私ももっとgitを使いこなせるようになりたいと思います。

Discussion