Git使うのに便利なCLIツール

## 背景

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

<img width="207" alt="スクリーンショット 2020-02-09 14.30.12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258841/73b20143-f87d-f106-f4ce-47cbead9e055.png">

## github/hub

<img width="615" alt="スクリーンショット 2020-02-09 13.38.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258841/5be9c69e-b1f1-2a80-6493-920ee8a04876.png">

■ [github/hub](https://github.com/github/hub)

お馴染みのやつ。
プルリクエストやカレントディレクトリのgithubページを開いたりすると言った動作をCLIから行えます。
GitHubやGitHub Enterpriseを使ってるなるなら入れておくべきかなって思います。
ソースリーディングだけでも```git clone {user}/{repo}```でcloneできたりするのでとても便利。

#### 参考記事

* [GitHub を CLI で使う時の便利コマンド Hub コマンド の使い方をまとめてみた！](https://qiita.com/schktjm/items/946452e9d0760b1bfc5f)

#### インストール

``` bash
$ brew install hub

# aliasを貼ることを公式でも推奨している
(bash/zsh)$ eval "$(hub alias -s)"

(fish)$ eval (hub alias -s)
```

基本的な使い方なんかは[公式](https://hub.github.com/)も情報が充実してるのでそちらもご覧ください。

## jonas/tig

■ [jonas/tig](https://github.com/jonas/tig)

ログのツリーを見たり、diffやブランチの枝分かれが綺麗に見れたりするツールです。
操作方法もvim likeで使い方も簡単です。
もちろん操作中にadd や commitを行うことも可能です。

<img width="1668" alt="スクリーンショット 2020-02-09 13.43.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258841/48a0d4c3-6a7f-48f0-d3f3-cdd615f09a2a.png">

tigの細かい設定はtigrcで行うのが慣習となっているようです。
(コピペして使ってるだけなので詳細はわからないですが。。)

``` bash:tigrc.sample
# 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)
```

* [Tig で Git を自由自在に操作するための .tigrc 設定例](https://qiita.com/sfus/items/063797a1dd8fdc7d032f)
* [やけに丁寧なtigの設定ガイド（表示制御編）](https://qiita.com/yoshikazusawa/items/d99e8b5d6f6a45aa6e2e)

#### 参考記事

* [tigでgitをもっと便利に！ addやcommitも](https://qiita.com/suino/items/b0dae7e00bd7165f79ea)
* [tigの使い方とオプションをまとめた](https://iberianpig.github.io/posts/2016-04-22-tig%E3%82%92%E4%BD%BF%E3%81%86/)

#### インストール

```
$ brew install tig
```

## junegunn/fzf

■ [junegunn/fzf](https://github.com/junegunn/fzf)

fzfとはインクリメンタルにな検索が可能になるCLIツールです。
git用のツールというわけではないですが組み合わせることで大変便利な機能が満載です。

下記のような関数を定義するだけでfzfを使用してインクリメンタルに曖昧検索をしつつブランチの切り替えなどが行えます。

``` bash:bashrc
fbr() {
  local branches branch
  branches=$(git branch -vv) &&
  branch=$(echo "$branches" | fzf +m) &&
  git checkout $(echo "$branch" | awk '{print $1}' | sed "s/.* //")
}
```

同じように以下のように関数を定義すればファイルの差分を表示しつつステージングへ上げると言った操作が簡単に行えたりします。
こう言った情報は公式でもあったりネットに大量にあるのでその辺の入門はとてもしやすくてとても良いです。

``` bash:bashrc
fga() {
  modified_files=$(git status --short | awk '{print $2}') &&
  selected_files=$(echo "$modified_files" | fzf -m --preview 'git diff {}') &&
  git add $selected_files
}
```

ちなみに実装はgoです。
他の関数なんかは[ここ](https://github.com/ryuichi1208/dotfiles/blob/master/mac/zsh/.zsh/functions.zsh#L177-L241)にも書いてたりするのでみてみてください。

<img width="525" alt="スクリーンショット 2020-02-09 13.56.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258841/e94774ac-8ef5-c6ec-f003-9805dd8f853e.png">

#### 参考記事

* [fzfを使おう](https://qiita.com/kompiro/items/a09c0b44e7c741724c80)
* [fzfを活用してTerminalの作業効率を高める](https://qiita.com/kamykn/items/aa9920f07487559c0c7e)

#### インストール

``` bash
$ brew install fzf

# To install useful key bindings and fuzzy completion:
$ $(brew --prefix)/opt/fzf/install
```

## lazygit

■ [jesseduffield/lazygit](https://github.com/jesseduffield/lazygit)

gitコマンド用のシンプルなtuiです。
addやcommitなどの基本操作はもちろん、blame、PRの作成なんかもターミナルから行えます。
キーボード操作のみではなくマウス操作も可能でGUIからの乗り換えも比較的行いやすそうです。

<img width="1028" alt="スクリーンショット 2020-02-09 14.01.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258841/bab35295-55df-977e-1662-93791dc0eb5d.png">

#### 参考記事

* [lazygit - ターミナル用のGit UI](https://www.moongift.jp/2018/08/lazygit-%e3%82%bf%e3%83%bc%e3%83%9f%e3%83%8a%e3%83%ab%e7%94%a8%e3%81%aegit-ui/)
* [「gitはコマンドラインで！」な人にlazygitのススメ](https://qiita.com/u_d/items/5db25a7c357ea6c708b1)
* [ターミナル上でSourceTreeとかGitKrakenみたいなこと出来るlazygit](https://scrapbox.io/nwtgck/%E3%82%BF%E3%83%BC%E3%83%9F%E3%83%8A%E3%83%AB%E4%B8%8A%E3%81%A7SourceTree%E3%81%A8%E3%81%8BGitKraken%E3%81%BF%E3%81%9F%E3%81%84%E3%81%AA%E3%81%93%E3%81%A8%E5%87%BA%E6%9D%A5%E3%82%8Blazygit)

#### その他

こちらの作者はgit向けツールだけでなくdocker向けのTUIツールも作成していてこちらも大変便利でおすすめです。コンテナごとのCPU使用率やdocker-compose使用時のログの確認など機能豊富で大変重宝してます。

* [jesseduffield/lazydocker](https://github.com/jesseduffield/lazydocker)

#### インストール

```
$ brew install jesseduffield/lazygit/lazygit
```

## (vimプラグイン)vim-fugitive

[tpope/vim-fugitive](https://github.com/tpope/vim-fugitive)

cliツールではないvim pluginです。
fugitiveはvim用のgitプラグインです。
vimで編集->commitなどの操作をvimを終了させずに行うことができるようになったりします。
blameやdiffもvimを終了させずに使用することが可能です。

<img width="1027" alt="スクリーンショット 2020-02-09 20.21.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/258841/4a383eff-9b21-3bda-5687-b0627cf28817.png">

#### インストール

vim pluginマネージャを使用してる場合は以下のように設定してます。

``` toml
[[plugins]]↲
repo = 'tpope/vim-fugitive'↲
```

keybindは個人的には以下のように設定して使ってます。

``` vimscript:vimrc
" ========================↲
" 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
```

* [VimmerなGit使いはfugitive.vimを今すぐ入れたほうがいい](http://blog.yuku-t.com/entry/20110427/1303868482)

## まとめ

gitコマンド、githubはたくさんたくさん便利な機能があって覚えられないのでこんな感じでツールを使うことで少しは使いこなせてる感が出て個人的には満足です。

[tiimgreen/github-cheat-sheet](https://github.com/tiimgreen/github-cheat-sheet/blob/master/README.ja.md)

便利そうな機能全体は↑で見つけてはtoolで使えないかなって繰り返して使ってる感じなのでいつかしっかり勉強してみたい。。。