Gitの使ってるツールや設定晒す

これは[Nextremer Advent Calendar 2016](http://qiita.com/advent-calendar/2016/nextremer)の第20日目の記事です。

# いろいろGit周りのツールや設定が増えてきたので並べてみる
何番煎じか分からないけど、私がGit周りで普段使っているツールや設定を並べてみる。
整理出来てないので見づらかったらごめんなさい。

# 補完
## Gitのコマンドやブランチ名をタブで補完する
[このファイル](https://github.com/git/git/blob/master/contrib/completion/git-completion.bash)を`~/`にDLしてきて、`~/.bashrc`か`~/.bash_profile`に`source ~/git-completion.bash`と書けばターミナル上でのGitコマンドやブランチ名のタブ補完が効くようになる。
もう必須レベルに便利

# Log
## コミットグラフを見る
`git log --decorate --graph --name-status --oneline`
で`git log`コマンドを使ってコミットグラフを見ることが出来る。SourceTreeやGitKraken使えばいいんだけど、ターミナルから出たくないときに便利。
こんな感じ。（redux-sagaのリポジトリよりコミットグラフを拝借
![スクリーンショット 2016-12-20 21.43.52.png](https://qiita-image-store.s3.amazonaws.com/0/16629/0fd33691-f066-869c-85b8-c21d9bac32fc.png)

エイリアスに設定しておくとなお便利。

``` ~/.gitconfig
[alias]
  graph = log --decorate --graph --name-status --oneline
```

# Diff
## Diffを見やすくする
`git diff`を見やすくするために[diff-so-fancy](https://github.com/so-fancy/diff-so-fancy)入れた。
Macだと、Homebrewで入るから簡単（`brew install diff-so-fancy`）
あとは`~/.gitconfig`に以下を追加すれば`git diff`が素敵になる。

``` ~/.gitconfig
[alias]
  diff = diff --color | diff-so-fancy
```

# ブランチ
## ブランチを更新日降順で並べる
git-flowやgithub-flowで運用してくと、削除し忘れてトピックブランチがローカルに大量に残ってしまうことがよくある（私だけ？

大体よく似たネーミングでブランチをきるため、ちょっと目を話すと自分がどのブランチで作業してたか見つけられなくなることがよくある（私だけ？

そこで、以下のコマンドを叩くとブランチを更新日降順で確認することが出来る。
`git for-each-ref --sort='-authordate:iso8601' --format=' %(authordate:iso8601)%09%(refname)' refs/heads`

## ブランチを検索してチェックアウトする。
今日Git Advent Calendar 2016に上がってた[記事](https://tellme.tokyo/post/2016/12/20/git-tips/)の`git br`が超便利だったので紹介。

`git br`でブランチ名をインクリメンタルサーチ出来てそのままチェックアウトまで出来るという素敵ライブラリ。


# Bash
## 現在のブランチをBashに表示する
`~/.bashrc`に以下の設定を追加することで、Bashに現在のGitのブランチを表示することが出来る。

```~/.bashrc
export GIT_PS1_SHOWUPSTREAM=
export GIT_PS1_SHOWUNTRACKEDFILES=
export GIT_PS1_SHOWSTASHSTATE=
export GIT_PS1_SHOWDIRTYSTATE=
export PS1='\h\[\033[00m\]:\W\[\033[31m\]$(__git_ps1 [%s])\[\033[00m\]\$ '
```
どこかからパクってきた設定なので詳細は把握してない（汗

## FishShellの場合
`~/.config/fish/config.fish`に以下の設定を追加。カラー設定はよしなに。

```
set git_color red

function parse_git_branch
  set -l branch (git branch 2> /dev/null | grep -e '\* ' | sed 's/^..\(.*\)/\1/')
  set -l git_diff (git diff)

  echo (set_color $git_color)'['$branch']'(set_color normal)
end

function fish_prompt
  set -l git_dir (git rev-parse --git-dir 2> /dev/null)
  set propmt (set_color yellow)(pwd)

  if test -n "$git_dir"
    echo $propmt (parse_git_branch)
  else
    echo $propmt
  end
end
```

# Vim
## 現在のブランチをVimに表示する
Vimで[lightline.vim](https://github.com/itchyny/lightline.vim)というステータスバーのカスタマイズ用のライブラリを導入しているので、そこに現在のブランチを表示する。VimからGitを扱うための[vim-fugitive](https://github.com/tpope/vim-fugitive)も必要。

```~/.vimrc
    let g:lightline = {
          \ 'active': {
          \   'left': [ ['mode', 'paste'], ['fugitive'] ],
                :
          \ },
          \ 'component_function': {
          \   'fugitive': 'MyFugitive',
                :
          \ }
          \ }
    function! MyFugitive()
      try
        if &ft !~? 'vimfiler\|gundo' && exists('*fugitive#head') && strlen(fugitive#head()) && winwidth(0) > 100
          return "\ue0a0" . ' ' . fugitive#head()
        endif
      catch
      endtry
      return ''
    endfunction
```

# コミット & プッシュ
## 仮コミットを作る
こまめにコミットするのが面倒（主にコミットコメント作るのが）なので、[git-now](https://github.com/iwata/git-now)を導入している。
MacだとHomebrewで楽ちん。`brew install git-now`

この辺は[前の記事](http://qiita.com/k_tada/items/4b7ae126e6c5df2cb33c#rebase%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9%E3%81%AF%E5%88%86%E3%81%8B%E3%81%A3%E3%81%9F%E3%81%91%E3%81%A9%E3%81%93%E3%81%BE%E3%82%81%E3%81%AB%E3%82%B3%E3%83%9F%E3%83%83%E3%83%88%E3%81%99%E3%82%8B%E3%81%AE%E3%82%81%E3%82%93%E3%81%A9%E3%81%8F%E3%81%AD)に書いてあるので参照。

## 仮コミットをPushしないようにする
`git now`で作った仮コミットがPushされないようにPre-Push Hookを使っている。

これも[前の記事](http://qiita.com/k_tada/items/4b7ae126e6c5df2cb33c#git-nowgit-rebase--i%E3%81%8C%E4%BE%BF%E5%88%A9%E3%81%AA%E3%81%AE%E3%81%AF%E5%88%86%E3%81%8B%E3%81%A3%E3%81%9F%E3%81%91%E3%81%A9%E9%96%93%E9%81%95%E3%81%88%E3%81%A6%E3%83%97%E3%83%83%E3%82%B7%E3%83%A5%E3%81%97%E3%81%A1%E3%82%83%E3%81%86%E3%81%A8%E3%83%A4%E3%83%90%E3%81%8F%E3%81%AD)に書いてある。

# Git Worktreeが超便利だったので紹介
ツールでも設定でも無いけど、`git worktree`を使ってみたら色々と便利だったので紹介する。
２〜３日前の私と同じで、難しそうと思って手を出せてない人の役に立てばうれしい。
いつか詳細に別記事つくってまとめたい。

## worktreeとは
別のディレクトリを作って、そこに任意のブランチの作業スペースを用意してくれる的な感じのコマンド。

## 既存ブランチの作業スペースを作る
`git worktree add <作業スペースの場所> <ブランチ名>`
例えば `git worktree add ./hoge topic-hoge`でカレントディレクトリに`hoge`ディレクトリを作ってそこに`topic-hoge`ブランチの作業スペースが作られる。

## 新規ブランチの作業スペースを作る
`git worktree add -b <新規ブランチ名> <作業スペースの場所> <新規ブランチの生成元ブランチ>`
例えば `git worktree add -b topic-hoge ./hoge master`でカレントディレクトリに`hoge`ディレクトリを作ってそこに`topic-hoge`ブランチの作業スペースが作られる。`topic-hoge`は`master`ブランチから生成される。

## worktreeの削除
作業スペースのディレクトリごと削除して、`git worktree prune`を実行すればOK

##　よくある使い方
例えば、`hoge`ブランチで作業中に`fuga`ブランチの修正をしたくなった場合、

従来だと
1. `git stash`で作業内容を退避
2. `git checkout fuga`でブランチを切り替え
3. `fuga`ブランチで作業
4. `git checkout hoge`でブランチを戻す
5. `git stash pop`で作業内容を戻す
6. `hoge`ブランチの作業再開

という手順を踏む必要があったが、

`git worktree`を使えば
1. `git worktree add ./fuga fuga`で作業スペースを作成
2. `cd fuga`で`fuga`ディレクトリに移動して`fuga`ブランチで作業
3. `cd ../`で`hoge`ブランチの作業再開

と、これだけの手順で実現出来る

さらに、`fuga`ブランチの作業中もディレクトリを移動すればいつでも`hoge`ブランチの作業に移れるのも魅力的。

## エイリアス
コマンドが長かったのでエイリアス作ったった。

```~/.gitconfig
[alias]
  w = worktree
  nw = "!f(){ git worktree add ./$1 $1;};f"
  wa = "!f(){ git worktree add ./$1 $1;};f"
  nwm = "!f(){ git worktree add -b $1 ./$1 master;};f"
  wam = "!f(){ git worktree add -b $1 ./$1 master;};f"
  wrm = "!f(){ rm -rf $1 && git worktree prune;};f"
  wrmb = "!f(){ rm -rf $1 && git worktree prune && git branch -D $1;};f"
```

# 最後に
急遽書くことになったため、ほんとにツールや設定並べただけの記事になっちゃいましたけど、何か１つでも参考になるものがあれば幸いです。
他にオススメのツールや設定があれば教えてください＞＜