TigがWindowsにやってきたのでチュートリアルをまとめる

# はじめに

今年の新入社員向けの研修でGitの担当になったのですが，研修で使う環境をどうするかで迷っていました．Git本来の基本を押さえやすいように通常のCLIでGitを教えるか，とっつきやすいように何らかのGUIツールでGitを教えるか悩ましいところです．ちなみに研修自体はWindowsで行いますが，業務ではLinuxデスクトップ環境で開発しているグループもあるので，どちらでも使えるつぶしのきく環境がベストです。

そんな中ネットをあさっていると**「Git for WindowsにTigが組み込まれたよ！」**との情報を見つけました．
[Release Git for Windows 2.14.2 · git-for-windows/git](https://github.com/git-for-windows/git/releases/tag/v2.14.2.windows.1)

そこで今回はWindowsでもLinuxでも使えて，コミットツリーやDiff等の情報も見やすく，本来のGitコマンドともあわせて使いやすいCUIツールであるTigを採用しました．

Tigについて基本的な操作を一通りまとめていきます．
以降は[[Emacs] magitチュートリアル - Qiita](https://qiita.com/maueki/items/70dbf62d8bd2ee348274)の内容を参考にして，magitでの操作をTigに置き換えたものになります．

# Tigとは

CUIのGitクライアントツールです．特徴として以下のようなものがあげられます．

* コミット履歴がツリー構造で確認しやすいです．
* ツリーからファイルの差分も表示できます．
* 情報表示だけでなく，add や commitなどの操作にも対応しています．
* Tig上で外部のコマンドの実行ができ，それにキーバインドを設定することもできます．

<img width="810" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/45310/6a898188-f069-cc95-3cb4-55f12213e8ff.png">

# インストール

Windowsの場合は「Git for Windows」に同梱されています．インストーラをダウンロードしてインストールしてください．（Git for Windows 2.14.2以降のバージョンに組み込まれています．）
[Git for Windows](https://gitforwindows.org)

Linuxの場合はパッケージマネージャからインストールしてください．以下はDebianの場合です．

```console
$ sudo apt install tig
```

以降の内容はWindows環境でGit Bash上で動作を確認しながらまとめています．

* Windows 10 Pro
* git version 2.16.2.windows.1
* tig version 2.3.3

# リポジトリ作成

Tigは基本的にGitのリポジトリに移動してから立ち上げて使います．そこでまずGit Bashからリポジトリを作成します．ここではリポジトリの初期化を行ったあとに，`foo.txt`ファイルを作成して初回コミットを行っています．

```console
$ mkdir tig_tut
$ cd tig_tut/
$ git init
$ touch foo.txt
$ git add foo.txt
$ git commit -m "初回コミット"
```

# Tigへの入り口

Gitリポジトリができたら`tig`コマンドでTigを起動します．対象のディレクトリに移動して操作してください．（上記からの流れだとそのままの場所でOKです．）

```console
$ tig
```

Tigが立ち上がるとまずは「main view」が立ち上がってコミットツリーが表示されます．ここがTigへの入り口となります．

<img width="317" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/45310/26edbf72-da82-7d3d-f701-50eae11e5169.png">

また，デフォルトでは「main view」にはチェックアウトしているブランチのみを表示しますが，`--all`オプションを指定すると全てのブランチが表示されます．

```console
$ tig --all
```

Tigを終了する場合は<kbd>Q</kbd>キーを押します．また後述するようにTigでは様々なViewを表示することができますが，そのViewを閉じる（前のViewに戻る）には<kbd>q</kbd>キーを押します．

# <kbd>h</kbd>から始める

<kbd>h</kbd>キーを押すとショートカット一覧が表示されます．「迷ったらまず<kbd>h</kbd>」を覚えておくとよいです。

<img width="487" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/45310/a2941f71-bb87-38df-48c4-5abfe8981bf7.png">

# コミットしてみる

`foo.txt`を開いて以下の編集を行います．

```text:foo.txt
A
```

保存した後に<kbd>s</kbd>キーで「status view」を表示します．そこからカーソルを移動して`foo.txt`を選択し<kbd>Enter</kbd>キーで「diff view」が表示されます．

<img width="381" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/45310/8a4bd85f-e2f6-7d82-c4af-6cbd0e6e7aa3.png">

この状態でのカーソル移動まわりのキーバインドは以下のようになっています．ちなみに画面が1画面表示の場合はどちらのキーでもカーソル移動できます．

| Key | 内容 |
|:-----------|:------------|
| <kbd>Ctrl</kbd> + <kbd>n</kbd> | 画面左側のstatus viewのカーソルを下方向に移動 |
| <kbd>Ctrl</kbd> + <kbd>p</kbd> | 画面左側のstatus viewのカーソルを上方向に移動 |
| <kbd>j</kbd> | 画面右側のdiff viewのカーソルを下方向に移動 |
| <kbd>k</kbd> | 画面右側のdiff viewのカーソルを上方向に移動 |

「status view」で`foo.txt`を選択し<kbd>u</kbd>キーでstagingされます．取り消す場合はもう一度<kbd>u</kbd>キーです．

<img width="200" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/45310/a1bc57aa-93a0-945c-e6c2-b930892ea45f.png">

stagingした状態から<kbd>C</kbd>キーでコミットメッセージを入力するためのエディタが起動します．

<img width="278" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/45310/cd16c57b-31f8-b3ae-9169-7d328b73e688.png">

コミットメッセージの入力後<kbd>Enter</kbd>キーでコミットが完了します．

# コミットログを見る

<kbd>m</kbd>キーで「main view」を表示すると先ほどのコミットログが確認できるはずです．コミットを選択して<kbd>Enter</kbd>キー押すと「diff view」が表示されます．

<img width="539" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/45310/7e1017c2-82a1-f452-7aa5-e8443db59c69.png">

この状態でのカーソル移動まわりのキーバインドはコミット時のものと同じです．「main view」でのカーソルを移動すると「diff view」の表示も追従して更新されます．

| Key | 内容 |
|:-----------|:------------|
| <kbd>Ctrl</kbd> + <kbd>n</kbd> | 画面左側のmain viewのカーソルを下方向に移動 |
| <kbd>Ctrl</kbd> + <kbd>p</kbd> | 画面左側のmain viewのカーソルを上方向に移動 |
| <kbd>j</kbd> | 画面右側のdiff viewのカーソルを下方向に移動 |
| <kbd>k</kbd> | 画面右側のdiff viewのカーソルを上方向に移動 |

# ブランチを作成する

現在のmasterからブランチを作成してみます．ですがTigにはブランチを作成する機能は標準で用意されていないようです．そこでブランチの作成は通常のgitコマンドを使用します．ただしTig上から外部のコマンドの実行が可能なのでターミナルを切り替える必要はありません．<kbd>:</kbd>キーを押すと画面下部でコマンドを受け付けてくれます．`:!<command>`の形式でコマンドを実行します．

```console
:!git checkout -b <作成するブランチ名>
```

<img width="266" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/45310/8a0b8822-f781-f035-2cd8-61f8d9b0cb15.png">

<kbd>r</kbd>キーで「refs view」を表示すると作成したブランチが確認できます．新しいブランチが表示されない場合は<kbd>R</kbd>キーで画面を更新してください．ここでは`new-branch`ブランチを作成しています．

<img width="278" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/45310/2e7e6b52-99f9-9a69-9a2e-29392104abae.png">

また`.tigrc`ファイルに，上記のような操作に対してキーバインドを設定することができます．例えば以下のように設定すると「refs view」上で作成元となるブランチを選択している状態で<kbd>n</kbd>キーを押して新しいブランチ名を入力すると，その場所にブランチが作成されます．`?git checkout`とすることで実行前に確認メッセージを出すようにしています．
.tigrcの置き場はWindowsの場合は`%USERPROFILE%`，Linuxの場合は`$HOME`になります．ファイルを作成した後にTigを再起動して設定を反映させてください．

```text:.tigrc
bind refs n ?git checkout -b "%(prompt Enter new branch name: )" %(branch)
```

# ブランチをマージする

前準備として作成したブランチ上でコミットを行います．ここでは2件コミットしています．

1. foo.txtに`B`を追記（add B）
1. foo.txtに`C`を追記（add C）

<kbd>m</kbd>キーで「main view」を表示すると以下のようになっています．

<img width="279" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/45310/86361c6d-a708-64b5-f3a4-6837155f20dc.png">

この状態からmasterにnew-branchの内容をマージします．

まずはmasterに切り替えます．（チェックアウトします．）
<kbd>r</kbd>キーで「refs view」を表示して，masterを選択した状態で<kbd>C</kbd>キーを押してチェックアウトします．（本当に切り替えるかY/Nで聞かれるので<kbd>y</kbd>キーを押します．）

切り替えに成功すると「refs view」でmasterが一番上に来ているはずです．（masterがチェックアウトされた状態です．）

<img width="269" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/45310/4085009a-3521-6167-0c9c-68e1e69a8f72.png">

マージ機能も標準では用意されていません．<kbd>:</kbd>キーから下記のコマンドを入力してマージします．

```console
:!git merge new-branch
```

.tigrcに登録する場合は下記のようにするとよいです．「refs view」で<kbd>M</kbd>キーを押すと現在のブランチにカーソルが当たっているブランチをマージします．

```text:.tigrc
bind refs M ?git merge %(branch)
```

コンフリクト等が起きなければこれでマージが完了します．<kbd>m</kbd>キーで「main view」を見るとマージできていることがわかります．

<img width="331" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/45310/e45e790b-9775-602a-42bb-b1e85c638ef4.png">

# 不要ブランチの削除

マージして不要になった`new-branch`ブランチの削除を行います．まず<kbd>r</kbd>キーで「refs view」を表示して削除するブランチを選択します．

<img width="278" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/45310/1c2dbca0-0e54-dc0e-7b15-a3b51b54992a.png">

その状態で<kbd>!</kbd>キーを押すと本当に削除するかY/Nで聞かれるので，<kbd>y</kbd>キーを押して削除します．また現在チェックアウトしているブランチの削除はできません．その場合はあらかじめ<kbd>C</kbd>キーで別ブランチをチェックアウトしておく必要があります．

`new-branch`を削除すると「main view」と「refs view」の表示は以下のようになります．更新されない場合は<kbd>R</kbd>キーを押して表示の更新を行ってください．

main view
<img width="267" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/45310/e4d1a70a-ed01-5396-9773-018c100709e0.png">

refs view
<img width="271" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/45310/b5055b16-c78e-6c00-edeb-e0ec03e012cc.png">

# プッシュする

ここまでの作業をリモートのリポジトリにプッシュしてみます．今回はGitHubに`tig_tut`リポジトリを作成したものとして話を進めます．またSSH keyの登録なども事前に完了しているものとします．リモートの追加は<kbd>:</kbd>キーからGitのコマンドを使って行います．ちなみに`origin`とは慣習的に使用されるリモートのデフォルトの名前です．

```console
:!git remote add origin git@github.com:<アカウント名>/tig_tut.git
```

プッシュ機能も標準では用意されていません．<kbd>:</kbd>キーから下記のコマンドを入力してプッシュします．

```console
:!git push -u origin master
```

また.tigrcに登録する例も載せておきます．<kbd>r</kbd>キーで「refs view」を表示して，<kbd>P</kbd>キーを押すとカーソルが当たっているブランチをoriginにプッシュします．

```text:.tigrc
bind refs P ?git push -u origin %(branch)
```

プッシュに成功すると，<kbd>r</kbd>キーの「refs view」に`origin/master`が追加されています．

<img width="279" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/45310/ed9a45e9-fc2e-deee-8f21-9c2b741dc5b2.png">

<kbd>m</kbd>キーの「main view」でも`origin/master`が確認できます．

<img width="348" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/45310/1ac557c8-8d0b-80c6-038b-8103efa57eca.png">

# ログからのブランチ作成

「main view」のツリーの任意のコミットにブランチを作成します．そのための前準備としてコミットIDが表示されるように設定します．

```text:.tigrc
set main-view = id date author commit-title:graph=yes,refs=yes
```

各コミットの左にコミットIDが表示されるようになります．

<img width="384" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/45310/9cefda41-aa2a-c566-ec7a-d4cf7b321260.png">

<kbd>:</kbd>キーから下記のコマンドを入力して任意の場所に新しいブランチを作成できます．

```console
:!git checkout -b <作成するブランチ名> <ブランチを作成する場所のID>
```

また「main view」で選択している行のコミットIDをクリップボードにコピーするキーバインドの設定例を載せておきます．<kbd>x</kbd>キーに割り当ててあります．

```text:.tigrc
bind main x @bash -c "echo -n '%(commit)' | clip"
```

下図では`new-branch-2`ブランチを`133f12d`に作成しています．表示されない場合は<kbd>R</kbd>キーを押して表示の更新を行ってください．

<img width="384" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/45310/917ca031-b4d5-ff1f-4f5d-56a68e1477ec.png">

# マージコンフリクトに対処する

`new-branch-2`ブランチで`foo.txt`の内容を更新してコミットします．この編集内容が「add C」コミットとコンフリクトします．

```text:foo.txt
A
B
D
```

<kbd>m</kbd>キーから「main view」を表示すると，以下のようになっているはずです．

<img width="392" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/45310/6527c236-3d46-2f9e-72f3-73eb9de5d9c9.png">

`master`に戻って`new-branch-2`ブランチをマージしてみます．
<kbd>r</kbd>キーで「refs view」を表示して，masterを選択した状態で<kbd>C</kbd>キーを押してチェックアウトします．
チェックアウトに成功すると「refs view」でmasterが一番上に来ているはずです．（masterがチェックアウトされた状態です．）

<img width="281" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/45310/72de60c4-eb59-3c9f-18b7-9edac60ca8e5.png">

ここから，前回と同様に<kbd>:</kbd>キーから下記のコマンドを入力するか，「refs view」で`new-branch-2`ブランチを選択し，登録したキーバインドである<kbd>M</kbd>キーを押します．

```console
:!git merge new-branch-2
```

するとコンフリクトしたとのメッセージが表示されます．

<img width="377" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/45310/7f92fa70-fccb-8f86-96ef-93ee661584d0.png">

<kbd>Enter</kbd>キーを押してTigに戻り，<kbd>s</kbd>キーで「status view」を表示するとfoo.txtファイルに`U`の目印がついておりマージが完了していない状態です．foo.txtファイルを選択した状態で<kbd>Enter</kbd>キーを押すと「diff view」が表示されコンフリクトしている様子が見えます．

<img width="383" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/45310/c81c0292-d2a0-8825-d909-70bfddf09b27.png">

foo.txtファイルを選択した状態で<kbd>M</kbd>キーを押すとマージツールが起動します．または<kbd>e</kbd>キーを押すとエディタが立ち上がります．お好みのほうを立ち上げて手動で修正を行いコンフリクトを解消します．

今回は以下のように修正します．

<img width="441" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/45310/20b20ced-0e9a-adbe-a885-5f61934a298f.png">
　↓
<img width="196" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/45310/cbcc24ed-e3d8-72ae-3816-5dcae267c9dc.png">

修正後「status view」に戻ってfoo.txtファイルを選択し<kbd>u</kbd>キーでstagingします．

<img width="206" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/45310/fb4b6cf6-06b0-4a0a-7c3c-088700a99284.png">

stagingした状態から<kbd>C</kbd>キーでコミットを行います．

<img width="339" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/45310/733f1fa3-4c48-6709-5252-cb7325aeb34f.png">

<kbd>m</kbd>キーから「main view」を表示するとマージされていることが確認できます．

<img width="703" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/45310/285f741c-f36a-649d-1346-25ea319ed4dd.png">

# 編集の一部をコミット

masterで作業を続けます．`foo.txt`の内容を下記のように更新します．

```text:foo.txt
A
HOGE
PIYO
B
C
D
E
```

<kbd>s</kbd>キーで「status view」を表示します．foo.txtを選択して<kbd>Enter</kbd>キーを押して「diff view」を表示します．

<img width="400" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/45310/98a8b936-ca5f-fd34-531a-6c901e3892ce.png">

「diff view」でコミットしたい行（今回は+E）を選択した状態で<kbd>1</kbd>キーを押すとその行のみがstagingされます．

<img width="376" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/45310/89ba10a0-ceac-c4d3-b2ff-e7d773b18d85.png">

この状態で<kbd>C</kbd>キーでコミットすると「E」の追加だけをコミットすることができます．

<img width="653" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/45310/2b0bae7a-cdbc-2e92-fe20-1481c6cdcf6c.png">

# 不要な編集を戻す

先ほどコミットしなかった編集を削除します．<kbd>s</kbd>キーで「status view」を表示し，foo.txtを選択して<kbd>Enter</kbd>キーを押して「diff view」を表示します．コミットしなかった「HOGE」と「PIYO」が残っています．

<img width="381" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/45310/322b4b62-3ab2-951a-f6de-d6cb34090d13.png">

この状態で<kbd>!</kbd>キーを押すと本当に破棄するかY/Nで聞かれるので，<kbd>y</kbd>キーを押して変更を戻します．
<kbd>s</kbd>キーで「status view」を表示すると，編集内容が破棄されています．

<img width="224" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/45310/64d3b8be-ab38-9522-189e-630494ad94aa.png">

# ここまでをプッシュ

ここまでの状態を前回と同様の手順でプッシュしておきます．`.tigrc`にキーバインドを登録していれば，<kbd>r</kbd>キーで「refs view」を表示して，<kbd>P</kbd>キーを押すとカーソルが当たっているブランチをoriginにプッシュします．

<img width="381" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/45310/a595270d-9de5-7c37-d987-06b9a109a024.png">

# フェッチ・プルする

前準備としてGitHub側でファイルの編集を行います．GitHubで`foo.txt`を表示して鉛筆マークから編集画面を開いて，最終行に`F`を追加します．

<img width="740" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/45310/fcbd2fc0-6769-b579-a0a3-21d3ebfe26dc.png">

フェッチ機能はTigには標準では用意されていません．<kbd>:</kbd>キーから下記のコマンドを入力してフェッチします．

```console
!git fetch
```

.tigrcに登録する場合は下記のようにするとよいです．「main view」で<kbd>F</kbd>キーを押すとフェッチします．

```text:.tigrc
bind generic F none
bind main F ?git fetch
```

GitHubでの変更が取り込まれています．この時点ではローカルの`master`ブランチには反映されていません．

<img width="384" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/45310/bc2ca2ac-fc03-b1cc-6c2c-91d74ec469af.png">

プル機能もTigには標準では用意されていません．<kbd>:</kbd>キーから下記のコマンドを入力してプルします．

```console
!git pull origin master
```

.tigrcに登録する場合は下記のようにするとよいです．「refs view」で対象のブランチを選択した状態で<kbd>L</kbd>キーを押すとプルします．

```text:.tigrc
bind refs L ?git pull origin %(branch)
```

GitHubでの変更がローカルの`master`に取り込まれました．

<img width="388" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/45310/fded1aaf-13da-3b74-88b1-77d2ec6d12b1.png">

今回はフェッチしてプルという流れでしたが，フェッチせずいきなりプルしても問題ありません．

# おまけ

ここまでの手順で出てこなかったものについて付け加えておきます．

## クローンする

今回の説明ではローカルで作成したリポジトリをリモートのGitHubにプッシュする流れでしたが，すでにリモートに存在しているリポジトリをローカルにクローンすることもできます．

```console
$ git clone git@github.com:<アカウント名>/tig_tut.git
```

## ツリービューを見る

<kbd>t</kbd>キーで「tree view」を表示することができます．「main view」から移動する場合は，選択しているコミット時点のディレクトリ・ファイルの一覧が表示されます．

<img width="277" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/45310/418cd74d-9a1c-88f1-bff7-895e221bd680.png">

「tree view」でファイルを選択している状態から<kbd>e</kbd>キーを押すとテキストエディタでファイルを開くことができます．

## 各行ごとの変更履歴を見る

<kbd>t</kbd>キーの「tree view」でファイルを選択している状態から<kbd>b</kbd>キーを押すと「blame view」が表示されます．ファイルの各行ごとのコミット履歴を確認することができます．

<img width="497" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/45310/e2cdcd15-ba6d-c4ce-0cbd-4fb6d629526c.png">

## スタッシュする

作業中のファイルの編集を，いったん退避しておきたいときにスタッシュが便利です．
`foo.txt`の内容を下記のように「G」を追加して更新します．

```text:foo.txt
A
B
C
D
E
F
G
```

スタッシュする機能は標準では用意されていません．<kbd>:</kbd>キーから下記のコマンドを入力してスタッシュします．

```console
:!git stash save <スタッシュコメント>
```

.tigrcに登録する場合は下記のようにするとよいです．「main view」で<kbd>S</kbd>キーを押すと現在の作業中の内容がスタッシュされます．

```text:.tigrc
bind main S ?git stash save "%(prompt Enter stash comment: )"
```

<img width="398" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/45310/fafb13eb-514b-5494-b233-f9395c53c851.png">

「status view」を確認すると編集途中のファイルがなくなっています．

<img width="197" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/45310/3028a049-a310-c1a2-ca04-29115fef8c52.png">

スタッシュされている中身は<kbd>y</kbd>キーから「stash view」を表示して確認することができます．

<img width="413" alt="image.png" src="https://qiita-image-store.s3.amazonaws.com/0/45310/fb40172d-4e36-d54e-98e6-1c50c8b40107.png">

「stash view」からは以下の操作が標準で用意されています．

| Key | 内容 |
|:-----------|:------------|
| <kbd>A</kbd> | 選択しているスタッシュを適用します．（git stash apply） |
| <kbd>P</kbd> | 選択しているスタッシュを適用して削除します．（git stash pop） |
| <kbd>!</kbd> | 選択しているスタッシュを削除します．（git stash drop） |

## 直前のコミットを取り消す

コミットを取り消す系の操作はいろいろとありますが，ここでは直前のコミットIDに対して`git reset`することで，最新のコミットを取り消す方法を例にあげます．
以下の`.tigrc`の設定は，ファイルの編集などはそのままでstagingされたプッシュする直前の状態に戻すキーバインドを「main view」に<kbd>!</kbd>キーで割り当てています．

```text:.tigrc
bind main ! ?git reset --soft HEAD^
```

## Gitの管理から特定のファイルを除外する

除外設定を行いたいディレクトリ（トップでもOK）に`.gitignore`という名前でファイルを作成し，除外したいファイルの情報を記述しておくと，Gitの管理対象から外れます．
.gitignore自体をコミットしておくと，複数人で開発をするときに同じ除外ルールでGit管理をすることができます．
設定パターンの一例を下記に載せておきます．

```text:.gitignore
# 拡張子が.exeのファイルを除外する
*.exe
# Bin/binディレクトリとその中身を除外する
[Bb]in/
# 特定のディレクトリの中の特定の拡張子のファイルを除外する
out/*.log
```

## Tigのカスタマイズ

ここまでの説明で出てきた`.tigrc`の設定内容についてまとめておきます．

```text:.tigrc
bind generic F none
bind main F ?git fetch
bind main S ?git stash save "%(prompt Enter stash comment: )"
bind main ! ?git reset --soft HEAD^
bind main x @bash -c "echo -n '%(commit)' | clip"
bind refs n ?git checkout -b "%(prompt Enter new branch name: )" %(branch)
bind refs M ?git merge %(branch)
bind refs P ?git push -u origin %(branch)
bind refs L ?git pull origin %(branch)
set main-view = id date author commit-title:graph=yes,refs=yes
```

# おわりに

Git（Tig）を使いながら開発を進めるにあたって，必要最小限の操作は説明できたと思います．また`.tigrc`をカスタマイズすることでさらに便利に使っていけるようになると思うので，ぜひ使いこなしていってほしいです．