gitの生産性を高める設定
こんにちは。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
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
- anuraghazra
- github.com
このように自動的にうまいことディレクトリを切ってくれます。
おかげで、gitlabからclone
しようと、違うユーザのリポジトリをclone
しようと、綺麗にディレクトリが分かれてくれます。
他にも、cloneしてきたリポジトリを一覧表示できます。
$ ghq list
例えばこの後にcd
コマンドを駆使すれば簡単にリポジトリ移動ができると思います。
※後述のpeco
を組み合わせるともっと簡単にリポジトリ移動が可能になります!
3. peco
pecoはコマンド結果のインクリメンタルサーチを可能にするツールです。
要はサジェストです。
伝えるのが少し面倒()なのでぜひ公式のデモ画像を見て欲しいです。
インストール
$ brew install peco
使い方
以下のコマンドを打てば全てを理解すると思います。
ls結果が一覧で表示された後、好きな文字を打ち込むことでインクリメンタルサーチが働き、まぁ要は絞り込みをすることができます。
$ ls | peco
pecoとghqを組み合わせる
どんなところからでも一瞬で対象リポジトリに移動
$ cd $(ghq list --full-path | peco)
- ghq listはローカルにあるリポジトリを一覧でフルパスで返す
- pecoで検索をかけて1つに絞り込む
- フルパスに対してcdする
という仕組みです。
とはいえ上記コマンドを打ち込むのは面倒なので、さらに、./zshrc
などにコマンドを登録しておきましょう。
alias cdrepo='cd $(ghq list --full-path | peco)'
エイリアスはお好みです。私の場合はcdrepo
という名前で登録しました。
コマンドを呼び出せばどこからでもスッとリポジトリに移動できます。気持ちいい。
名前が曖昧なリモートブランチのチェックアウト
$ alias cherbra='git switch $(git branch -r | peco | cut -c 10-)'
リモートにあるブランチをチェックアウトしたいけど、名前なんだったっけな。。を解決するコマンド。
- リモートブランチをリスト表示
- pecoで検索
-
__origin/
をcutしたブランチ名でチェックアウト
という仕組みです。(※cutのところもっと綺麗にできそうだけど。)
なお、CHEckout Remote BRAnchです。
4. gh (hub)
続いてgh
コマンドを紹介します。
gh
コマンドはGitHub CLI(公式)です。
これを使うと、GitHubをローカルから操作することが可能になります。
例えば
- PRの作成やその他操作
- issueの作成やその他操作
- GitHub Actionsの操作
などがローカルから使えるようになります。(他にもたくさんある。)
なお、似たようなコマンドにhub
コマンドがあり、これはgh
コマンドが発展途上だった時から使われている歴史あるコマンドのようです。
githubから公式のgh
が出た以上、hub
を使っていないのであればgh
でいいのではないかなと思っています。
インストール
$ brew install gh
使い方
まだまだ使いこなせておらず、紹介できそうにないです。
ただ、とりあえずこれもpeco
やghq
と絡めると良さそうです。
例えば、
- ローカルからPRを生成するとき
- リモートにあるリポジトリを検索してクローンするとき
- リモートの特定のブランチを検索してチェックアウトするとき
などなど。
GitHubでよく行う作業があれば、それはgh, peco
などで自動化できる可能性が高いので、ぜひ調べてみてください。
5. tig
(wip)
6. GUIツール
(wip)
7. その他
7-1. gitignore
.gitignore
ファイルでgit管理したくないファイルやディレクトリを指定することができます。
macを使い始めたのですが、.DS_Store
というファイルが謎に生成されるので邪魔ですよね。
この時は、.gitignore
ファイルに記載することもできますが、gitのグローバル設定に書くようにしたほうが良いと言われています。
gitignoreはあくまで、プロジェクト固有の無視したいファイル or ディレクトリを記録する場所であるとされている。
開発者個人の環境に依存する、無視したいファイル or ディレクトリは、本来は開発者個人がglobal .gitignoreという場所に書いて管理するというのが望ましい習慣である。
.gitignore
はプロジェクトに関することに閉じるべきで、.DS_Store
の存在なんてWindowsユーザ(過去の私)は知ったこっちゃない話ですからね。
.DS_Store
さて、.gitignore
がプロジェクトに閉じるべきという意見はごもっともですが、私個人の意見としては余計なファイルが混ざり込む事故を避けるために、.gitignore
に書いてもいいのでは? と率直に感じますね。
ただ私なんて若造なので、こういう問題は先人の知恵に従いましょう。
7-2. others
Git系のCLIツールを紹介しているリポジトリがあったのでまたみてみたいですね。
最後に
git操作は毎日行うことだと思うので、ぜひ自分に合ったツールを取り入れてみてください。
私ももっとgitを使いこなせるようになりたいと思います。
Discussion