背景
日々の業務やらプライベートでのチーム開発で使ってるgit関連のツール紹介です。
gitコマンドは大変便利ですけどそれ以外の周辺ツールを使うことでより便利に使うことができたりします。
(基本的にはmacとlinuxでしか動かしてないですが一部windowsでは使えないものがあります)

github/hub

お馴染みのやつ。
プルリクエストやカレントディレクトリのgithubページを開いたりすると言った動作をCLIから行えます。
GitHubやGitHub Enterpriseを使ってるなるなら入れておくべきかなって思います。
ソースリーディングだけでもgit clone {user}/{repo}
でcloneできたりするのでとても便利。
参考記事
インストール
$ brew install hub
# aliasを貼ることを公式でも推奨している
(bash/zsh)$ eval "$(hub alias -s)"
(fish)$ eval (hub alias -s)
基本的な使い方なんかは公式も情報が充実してるのでそちらもご覧ください。
jonas/tig
ログのツリーを見たり、diffやブランチの枝分かれが綺麗に見れたりするツールです。
操作方法もvim likeで使い方も簡単です。
もちろん操作中にadd や commitを行うことも可能です。

tigの細かい設定はtigrcで行うのが慣習となっているようです。
(コピペして使ってるだけなので詳細はわからないですが。。)
# set key 'g' / goto file top
bind generic g move-first-line
# set key 'G' / goto file bottom
bind generic G move-last-line
bind main G move-last-line
# set key 'E'
bind generic E view-grep
# set key 'F'
bind generic F ?git fetch %(remote)
bind main F ?git fetch %(remote)
# set key 'U'
bind generic U ?git pull %(remote)
# set key 'C'
bind generic C !git commit
#bind refs C !git commit
bind main C !git commit
# set key 'P'
bind generic P ?git push -u %(remote) %(repo:head)
参考記事
インストール
$ brew install tig
junegunn/fzf
fzfとはインクリメンタルにな検索が可能になるCLIツールです。
git用のツールというわけではないですが組み合わせることで大変便利な機能が満載です。
下記のような関数を定義するだけでfzfを使用してインクリメンタルに曖昧検索をしつつブランチの切り替えなどが行えます。
fbr() {
local branches branch
branches=$(git branch -vv) &&
branch=$(echo "$branches" | fzf +m) &&
git checkout $(echo "$branch" | awk '{print $1}' | sed "s/.* //")
}
同じように以下のように関数を定義すればファイルの差分を表示しつつステージングへ上げると言った操作が簡単に行えたりします。
こう言った情報は公式でもあったりネットに大量にあるのでその辺の入門はとてもしやすくてとても良いです。
fga() {
modified_files=$(git status --short | awk '{print $2}') &&
selected_files=$(echo "$modified_files" | fzf -m --preview 'git diff {}') &&
git add $selected_files
}
ちなみに実装はgoです。
他の関数なんかはここにも書いてたりするのでみてみてください。

参考記事
インストール
$ brew install fzf
# To install useful key bindings and fuzzy completion:
$ $(brew --prefix)/opt/fzf/install
lazygit
gitコマンド用のシンプルなtuiです。
addやcommitなどの基本操作はもちろん、blame、PRの作成なんかもターミナルから行えます。
キーボード操作のみではなくマウス操作も可能でGUIからの乗り換えも比較的行いやすそうです。

参考記事
その他
こちらの作者はgit向けツールだけでなくdocker向けのTUIツールも作成していてこちらも大変便利でおすすめです。コンテナごとのCPU使用率やdocker-compose使用時のログの確認など機能豊富で大変重宝してます。
インストール
$ brew install jesseduffield/lazygit/lazygit
(vimプラグイン)vim-fugitive
cliツールではないvim pluginです。
fugitiveはvim用のgitプラグインです。
vimで編集->commitなどの操作をvimを終了させずに行うことができるようになったりします。
blameやdiffもvimを終了させずに使用することが可能です。

インストール
vim pluginマネージャを使用してる場合は以下のように設定してます。
[[plugins]]↲
repo = 'tpope/vim-fugitive'↲
keybindは個人的には以下のように設定して使ってます。
" ========================↲
" airblade/vim-gitgutter↲
" ========================↲
nnoremap [gitgutter] <Nop>↲
nmap <C-h> [gitgutter]↲
nmap [gitgutter]j <Plug>GitGutterNextHunk
nmap [gitgutter]k <Plug>GitGutterPrevHunk
nmap [gitgutter]u <Plug>GitGutterUndoHunk
まとめ
gitコマンド、githubはたくさんたくさん便利な機能があって覚えられないのでこんな感じでツールを使うことで少しは使いこなせてる感が出て個人的には満足です。
便利そうな機能全体は↑で見つけてはtoolで使えないかなって繰り返して使ってる感じなのでいつかしっかり勉強してみたい。。。