peco と alias -g で git に便利革命おきた

`peco` と `alias -g` で `git` に便利革命がおきるので、ぜひご活用ください。

記事の一番下に[設定のまとめ](#1-7)があります。

# 目録

* [便利革命1](#1-2):

	`git commit` → `g c`

* [便利革命2](#1-3):

	`git checkout feature/something-great` → `g o B`

* [便利革命3](#1-4):

	`git push -u origin feature/something-great` → `g puu R B`

* [便利革命4](#1-5):

	`git remote add origin git@github.com/user/repo` → `g r add origin H`
	
* [便利革命5](#1-6):

	`git checkout -b feature/something-great remotes/origin/feature/something-great` → `g b LR`

# めんどいコマンド1: git commit
## Before
```console
$ git commit
```

## After
```console
$ g c
```

## 便利革命する設定例
1. .zshrc に追記

```sh
alias g='git'
```

2. git を設定

```console
$ git config --global alias.c 'commit -v'
```

### ポイント
 * エイリアス
 * git エイリアス
 * 短縮しつつも思い出しやすさを保つ


# めんどいコマンド2: git checkout
## Before
```console
$ git checkout feature/something-great
```

## After
```console
$ g o B
```

チェックアウトしたいブランチの一覧が peco に表示されるので、選択してチェックアウトできます。
なお、現在の branch を選択したい場合は `*` を入力すると一発で絞り込めます。

[tig](https://github.com/jonas/tig) でも同様の動作が可能ですが、`tig branch` とできないのが惜しいところです。

## 便利革命する設定例

1. [peco](https://github.com/peco/peco#mac-os-x--homebrew) をインストール

```console
$ brew tap peco/peco
$ brew install peco
```

2. git を設定

```console
$ git config --global alias.o checkout
```

3. .zshrc に追記

```console
alias -g B='`git branch -a | peco --prompt "GIT BRANCH>" | head -n 1 | sed -e "s/^\*\s*//g"`'	
```

### ポイント

 * グローバルエイリアス
 * peco
 * 大文字一字をグローバルエイリアスに割当てて、わかりやすさを保ちつつ誤爆を防止

zsh にはグローバルエイリアスという機能があり、コマンドの引数などでエイリアスを展開することができます。
たとえば、こんなこともできます：

```console
$ alias -g IS_GOD='`echo path/to/file`'
$ vim IS_GOD
    # vim path/to/file と等価
```

# めんどいコマンド3: git push/pull
## Before
```console
$ git pull
$ git push
$ git push -u origin feature/something-great
```

## After
```console
$ g p
$ g pu
$ g puu R B
```

## 便利革命する設定例
1. git を設定

```console
$ git config --global alias.p 'pull'
$ git config --global alias.pu 'push'
$ git config --global alias.puu 'push -u'
```

2. .zshrc に追記

```sh
alias -g R='`git remote | peco --prompt "GIT REMOTE>" | head -n 1`'
```

### ポイント
 * remote も peco しちゃう
 * 短縮系には派閥がある
 * 私は: `pull`/`push`/`push -u` → `p`/`pu`/`puu`

# めんどいコマンド4: git remote add
## Before
```console
$ git remote add origin git@github.com/my/repo
```

## After
```console
$ g r add origin H
```

自分の Github アカウントのリポジトリの一覧から選択できます。

## 便利革命する設定例
1. [jq](http://stedolan.github.io/jq/download/#os_x) をインストール

```console
$ brew install jq
```

2. git を設定

```console
$ git config --global alias.r 'remote'
```

3. .zshrc に追記

`YOUR_USERNAME` を自分の github アカウントに書き換えてください。

```sh
alias -g H='`curl -sL https://api.github.com/users/YOUR_USERNAME/repos | jq -r ".[].full_name" | peco --prompt "GITHUB REPOS>" | head -n 1`'
```

### ポイント
* [Github API](https://developer.github.com/v3/) を curl で叩いて [jq](http://stedolan.github.io/jq/) で抜き出す

# めんどいコマンド5: git checkout -b LOCAL REMOTE
## Before
```console
$ git checkout -b feature/something-great remotes/origin/feature/something-great
```

## After
```console
$ g b LR
```

### 便利革命する設定例

1. git を設定

```console
$ git config --global alias.b 'checkout -b'
```

2. .zshrc に追記

```sh
alias -g LR='`git branch -a | peco --query "remotes/ " --prompt "GIT REMOTE BRANCH>" | head -n 1 | sed "s/^\*\s*//" | sed "s/remotes\/[^\/]*\/\(\S*\)/\1 \0/"`'
```


# 設定まとめ

1. [peco](https://github.com/peco/peco#mac-os-x--homebrew) をインストール

```console
$ brew tap peco/peco
$ brew install peco
```

2. [jq](http://stedolan.github.io/jq/download/#os_x) をインストール

```console
$ brew install jq
```

3. git を設定

```console
$ git config --global alias.c 'commit -v'
$ git config --global alias.o 'checkout'
$ git config --global alias.b 'checkout -b'
$ git config --global alias.p 'pull'
$ git config --global alias.pu 'push'
$ git config --global alias.puu 'push -u'
$ git config --global alias.r 'remote'
```

4. .zshrc に追記

`YOUR_USERNAME` を自分の github アカウントに書き換えてください。

```sh
alias g='git'
alias -g B='`git branch -a | peco --prompt "GIT BRANCH>" | head -n 1 | sed -e "s/^\*\s*//g"`'
alias -g R='`git remote | peco --prompt "GIT REMOTE>" | head -n 1`'
alias -g H='`curl -sL https://api.github.com/users/YOUR_USERNAME/repos | jq -r ".[].full_name" | peco --prompt "GITHUB REPOS>" | head -n 1`'
alias -g LR='`git branch -a | peco --query "remotes/ " --prompt "GIT REMOTE BRANCH>" | head -n 1 | sed "s/remotes\/[^\/]*\/\(\S*\)/\1 \0/"`'
```

# これらの設定の問題点

* 便利すぎて失禁する
* 履歴で復元されるのは短縮系なので、一度選択したコマンドの再実行はちょっと不便