tigでgitをもっと便利に！ addやcommitも


皆さん、tigコマンドを活用していますか？
tigは、コンソール上で使えるgitブラウザです。実はずっと、ただのきれいな`git log`だと思っていたのですが、本当はそんなことはありません。かなり使えるやつなのです。

### インストール
ソースコード: https://github.com/jonas/tig
インストール方法: https://github.com/jonas/tig/blob/master/INSTALL.adoc
この辺りを参考にしてみてください。詳細は割愛します。

### 基本の使い方

この状態の差分を扱っていきます。いつものこれだとこんな感じ。

```
$ git status
```

![f1bca6c012df42ebc426f7f4eac745ea.png](https://qiita-image-store.s3.amazonaws.com/0/35965/2a66f8f4-92ec-d4ef-277c-e341b93736e5.png "f1bca6c012df42ebc426f7f4eac745ea.png")

```
$ tig
```

![7a006e8830d40d1ffb745b27963d743e.png](https://qiita-image-store.s3.amazonaws.com/0/35965/84c438e0-6dbe-8097-037c-2af5918eed95.png "7a006e8830d40d1ffb745b27963d743e.png")

`git log`が素敵にビジュアライズされてます。この画面を`main view`といいます。
ここでエンターを押すと、下半分に差分の詳細（`diff view`）が表示されます。

![8ce252eeb784be7d7bfa578b0396f98f.png](https://qiita-image-store.s3.amazonaws.com/0/35965/fa27f199-41ff-2be9-4b90-b2628b210ec6.png "8ce252eeb784be7d7bfa578b0396f98f.png")

下矢印で、Unstaged changesの差分を見てみるとこんな感じです。`git status`で `Changes not staged for commit`に表示されている部分の差分ですね。

![97115556f54cae445d3d369332e9d82b.png](https://qiita-image-store.s3.amazonaws.com/0/35965/998537a0-a52c-2054-b045-2b1c0bd59e6f.png "97115556f54cae445d3d369332e9d82b.png")

ちなみに、この画面で`Ctrl+u`、`Ctrl+d`、`j`、`k`で上下移動できます。vimと同じですね。

また、`main view`にて`d`を押すと、コミット毎の差分の詳細（`diff view`）が全画面で表示されます。画面分割では見辛い場合にはこちらをどうぞ。


### tigでaddする
##### ファイルごと `u`
`main view`にて、`S`（`shift+s`）を押すと、次のように、`git status`の結果が表示されます。

![kobito.1393148029.153820.png](https://qiita-image-store.s3.amazonaws.com/0/35965/c665f789-3cbd-0bc4-5827-e0b785add088.png "kobito.1393148029.153820.png")

この画面でも、エンターを押すとそのファイルの差分を閲覧できます。

好きなファイルを選択した状態で、`u`を押してみます。
![kobito.1393148516.326326.png](https://qiita-image-store.s3.amazonaws.com/0/35965/8b06b2a8-3e04-e896-1784-a4296abe0419.png "kobito.1393148516.326326.png")

`MusicLife/DetailViewController.m`が、`Changed but not updated:`から`Changes to be committed:`に移動しました。
これで、`git add MusicLife/DetailViewController.m`完了です！　超お手軽。

`Changes to be committed:`に表示されているファイル名の上で`u`を押すと、indexから外すこともできます。

##### 一部だけ `u`
さて、先ほどaddしたファイルの差分を見てみたら、まだcommitしたくない差分も混じっていました。

![kobito.1393150786.602393.png](https://qiita-image-store.s3.amazonaws.com/0/35965/6fd8be81-d105-eae4-9452-332b08b21569.png "kobito.1393150786.602393.png")

ここだけaddしなかったことにしたい…だけどそのためにファイルを修正するのは面倒です。
そんなときは、下の画像のように、「ここからここまで」の間の行（ **どの行でもOKです。** 自分で範囲選択する必要はありません）を選択して、`u`を押すと、その範囲だけadd/unstageすることができます。
![30bcdfbaace0731cb195eba7517e3506.png](https://qiita-image-store.s3.amazonaws.com/0/35965/aaf1545a-f0a1-0543-7c15-60b133b7de65.png "30bcdfbaace0731cb195eba7517e3506.png")

その後の様子。部分的にaddされているため、同じファイルが上段と中段の両方に表示されています。

![kobito.1393152062.891265.png](https://qiita-image-store.s3.amazonaws.com/0/35965/b21addc5-c1b1-7903-3be3-0aa6ef095e4f.png "kobito.1393152062.891265.png")


##### 1行だけ `1`

さっきの状態に戻って、今度は1行だけadd/unstageしてみようと思います。下の画像のように操作したい行を選択して、`1`を押します。

![kobito.1393157687.663358.png](https://qiita-image-store.s3.amazonaws.com/0/35965/06de468c-8f7d-b94c-30be-385dc5a007f3.png "kobito.1393157687.663358.png")

すると……

![kobito.1393157763.490650.png](https://qiita-image-store.s3.amazonaws.com/0/35965/1947dc47-8fc7-6e64-d1cd-a942b6ee801e.png "kobito.1393157763.490650.png")

1行だけunstageされました。画面上部の`Changed but not updated:`にもファイル名が表示されています。

このように、tigを使うことによって、細かなコミット管理が簡単に行えるようになります！

### tigでcommitする `C`

`status view`の画面で、`C`（`shift+c`）を押します。

![kobito.1393152373.682413.png](https://qiita-image-store.s3.amazonaws.com/0/35965/eada643b-e6ab-4da2-4da3-3e3576b880b2.png "kobito.1393152373.682413.png")

いつもの`git commit`の画面ですね！ いつも通り、1行目にコミットメッセージを書いて`:wq`すればokです。
なお、そこから`main view`に戻ってきても今作ったコミットは表示されていないと思うのですが、`R`（`shift+r`）か`F5`して更新すれば表示されます。

### tigでpushする

addとcommitが出来るならpushも、と思って調べてみたのですが、今のところ出来ません。

https://github.com/jonas/tig/issues/199

いいキーバインドがないこと、誤ってリモートリポジトリに修正を加えてしまうことへの不安などが、現在実装されていない理由のようですね。上記Issueで作者の方が書いている方法で、tig上でpushを行うこともできるようですので、tig上で全て完結させたい方は試してみてください。

### tigでbranch一覧を見る

`main view`で`H`（`shift+h`）を押すと、branchの一覧が表示されます。いちばん上が現在のブランチ、中央の青字がローカルブランチ、下のオレンジ色がリモートブランチです。右はそれぞれのブランチの最後のコミットメッセージです。

![kobito.1393155821.133033.png](https://qiita-image-store.s3.amazonaws.com/0/35965/7b180263-d8fb-0787-8021-8bf2b14259d7.png "kobito.1393155821.133033.png")


### 他にも色々できる！
`main view`にて`h`を押すとヘルプ画面になります。上に挙げた以外にも色々なことができるので、ぜひ試してみてください。

```
[-] status bindings
External commands:
    'C'                       `git commit`
[-] branch bindings
External commands:
    'C'                       `git checkout %(branch)`
[-] main bindings
External commands:
    'C'                       `git cherry-pick %(commit)`
[-] generic bindings
View switching
    'm'                       view-main            Show main view
    'd'                       view-diff            Show diff view
    'l'                       view-log             Show log view
    't'                       view-tree            Show tree view
    'f'                       view-blob            Show blob view
    'B'                       view-blame           Show blame view
    'H'                       view-branch          Show branch view
    'h'                       view-help            Show help view
    'p'                       view-pager           Show pager view
    'S'                       view-status          Show status view
    'c'                       view-stage           Show stage view

（以下略）
```