普段使用しているGitクライアントのTigが便利なので紹介したいと思います。

What is Tig?

Tig is an ncurses-based text-mode interface for git.

https://github.com/jonas/tig に記載された冒頭の一文です。 この文だけ見ても何のことやら分かりませんが、要はgitのログをターミナルでグラフィカルに表示できるツールです。

インストールからTig起動まで

前提

この記事は以下の前提条件で書いています。

  • OS X 10.11 El Capitan
  • Homebrew
  • Tig 2.2.2

インストール

Homebrewからインストールできます。

$ brew install tig

起動

適当なフォルダを作ってTigを試してみましょう。 1コミットもない状態だとTigを起動できないため、ダミーのコミットを追加しておきます。

$ mkdir hoge
$ cd hoge
$ git init
$ git commit -m "initial commit" --allow-empty
$ tig

このような画面が表示されるはずです。

1

単なるログビューアでない

Tigでコミットできちゃいます

適当なファイルを追加してコミットしてみます。

$ touch main.js

Tigの画面で s のキーを押すとこのような画面になります。

2

u のキーを押してみてください。

3

Shift + c を押すとコミットメッセージの入力画面に変わります。

4

この画面は、gitコマンドでコミットする時と同じものです。 私はvimを使っています。

5

コミットが完了してdiffがなくなると、下の青いバーの表示が「Nothing to update」に変わりました。 q のキーを押すと最初の画面に戻ります。

6

s とか u とか何なんだよ

私がTigを使い始めた当初の感想を章のタイトルにしてみました。 Tigはターミナル上で動作するツールですので、GUIツールのようにメニューバーやマウスクリックによる操作は存在しません。

操作は全てキー入力を通してTigに伝わります。 s は「メインビューを表示する」 u は「ファイルをステージング」といった操作を行っています。

ビューを切り替えるためのキーバインド

Tigには多くの「ビュー」が存在します。 私がよく使うものをピックアップして紹介します。

ビュー 用途 ビューを開くためのキー 画面
メインビュー コミットの一覧 m main
ステージビュー ステージ/アンステージ s stage
ログビュー ログの一覧 l log
リファレンスビュー ブランチの一覧 r refs

それぞれのビューには割り当てられたキーで移動し、q のキーを押すと前のビューに戻ります。 一番最初に表示されたビュー(メインビュー)まで戻って q を押すとTigが終了します。

それぞれのビューで共通するキーバインド

以下は多くのビューで共通したキーバインドです。 viに慣れている方はなじみのあるキーバインドで覚えやすいのではないでしょうか。

  • k j で行移動
  • でコミット移動
  • q でビューを閉じる
  • / で検索
  • Enter で決定(詳細ペインを開いたりする)
  • Shift + r で更新
  • Ctrl + c でTigを終了

キーバインドとビューを覚えるのに難航する

私の場合、つまづきポイントはここでした。 ビューとその用途を覚えきれないうちに間違えたキーを押してしまい、目的の操作にたどり着くまでにビューの中で迷子になっていた思い出があります。 最初は慣れないのもあってTigを操作するよりgitコマンドをタイピングするほうがダントツに早かったです。

ただ、普段よく使うgitコマンドの数はそれほど多くなく、それぞれに対応するTigの操作もそれほど多くありませんでした。 Tigを使い始めたきっかけはログを見るのに便利そうだからという理由でしたが、使っていくうちにタイプ量が激減している事に気づきました。

Tigって便利です

ログを見るのが便利

メインビュー(m)で Enter を押してみてください。 選択中のコミットのdiffが表示されます。

続けて矢印キー を押すと、コミットを移動しながら個々のコミットのdiffを表示する事ができます。(左ペイン) k j pageup pagedown を押すとdiffの行を移動できます。(右ペイン)

8

ステージ/アンステージが便利

ステージビュー(s)に移動します。 k j でファイルを選択し u を押すと、ファイル単位でステージ/アンステージができます。

9

続けて Shift + c を押すとコミットメッセージを入力する画面に切り替わります。 間違えてこの画面に入ってしまった時は :q で抜けられます。

10

ファイルの一部だけステージ/アンステージが便利

例えば以下のようなファイルがあり、コミットされているとします。

// service.js

var a = 1;

var service = function () {
  //
};
var foo = [1,2];
var service1 = service(foo);


var b = {
  name: 'test',
};

複数の行に変更を加えてみます。

// service.js

- var a = 1;
+ var a = 111;

var service = function () {
  //
};
var foo = [1,2];
var service1 = service(foo);


var b = {
-  name: 'test',
+  name: 'test123',
};

Tigでステージビュー(s)を見てみましょう。 k j でファイルを選択して Enter キーを押すと右ペインにdiffが表示されます。

11

ファイルの中に複数箇所の変更があった場合、Tigはそれぞれをコミットの候補としてグループ分けします。(@@ から始まる行がグループの先頭です) このグループ単位でコミットを行う事ができます。

j のキーを押して1番目のグループの中に移動します。

12

u のキーを押すと1番目のグループのみステージングされました。 あとは Shift + c でコミットすればOKですね。

13

ブランチ移動が便利

メインビュー(m)からリファレンスビュー(r)に移動します。 k j でブランチを選択して Shift + c キーを押すとブランチをチェックアウトできます。

14

チェリーピックが便利

メインビュー(m)からリファレンスビュー(r)に移動します。 矢印キー でブランチを選んで Enter キーを押します。

15

j kでコミットを選んで(右ペイン) Shift + c を押します。

17

画面の下のほうに「cherry-pickを実行しますか?」とメッセージが表示されるので、y キーを押します。

18

gitコマンドを登録できるのが便利

Tigの設定は .tigrc というテキストファイルに記述します。 https://github.com/jonas/tig/blob/tig-2.2.2/tigrc の内容をコピーしてホームディレクトリの直下に配置してみましょう。

このファイルを編集するとTigの設定のカスタマイズが可能です。 私は以下のようなオリジナルのgitコマンドを登録しています。

bind main       @ri     !git rebase -i %(commit)~
bind main       @rc     !git rebase --continue
bind main       @ra     !git rebase --abort
bind main       @rs     !git rebase --skip
bind main       @fc     !git commit -m "[ci skip]" --allow-empty

見ると何となく分かると思いますが、メインビューでのキーバインドを設定しています。 @ri を打つと git rebase -i が実行されます。 キーの先頭に @ を付けているのはデフォルトのバインドと重複しないキーを探すのが面倒だからです。

リモートにブランチをプッシュする前にコミットログをざっと眺める習慣があるのですが、時々コミットメッセージのタイポに気づいたりする事があります。 その時にTigで以下のような操作をしています。

  • @ri で編集開始
  • タイポを修正
  • @ad で修正ファイルをステージング
  • @rc でリベースを続行

Tigの操作に必要なのは @ri@ad@rc たった9回のキー入力です。

おわりに

Tigはとても多機能で、ここで紹介したのはほんの一部です。 gitコマンドを忘れてしまうくらい便利なので、ぜひ一度試してみてはどうでしょうか。