`git add -i` 使ってますか？？　

# はじめに
最近、私が多用している`git add -i`について記事をまとめます。
この記事を読んで「`add`の`i`オプションすげぇ！！」って感じで、多くの人が使ってくれたら幸いです。

# `git add -i`って何？？
簡単に言うと、**`git add`の対話型インターフェース**です。
オプションを短縮せずに書くと`git add --interactive`です。
普通の`git add`とは全然違って、どのファイルを`add`するのかというやり取りをコマンドと対話しながら行うことができるものです。

:::note info
### おすすめポイント
#### 1. 細かい変更を選択できる
ファイル単位だけでなく、行単位で！「このファイルのこの部分だけaddしたい」というときにとても便利です。

#### 2. 直感的な操作
数字を入力するだけで、めちゃくちゃ簡単に変更の追加/削除ができます。
**初心者でも怖くない！**
:::

# 簡単な使い方説明
使い方はめちゃくちゃ簡単です！！
```bash
git add -i
```
これだけ！すると、こんな感じの対話モードに突入します：
```bash
*** Commands ***
  1: status	  2: update	  3: revert	  4: add untracked
  5: patch	  6: diff	  7: quit	  8: help
What now> 
```

#### おすすめの使い方

- `2` (update): 変更したファイルを選択
- `4` (add untracked): 未追跡状態のファイルを選択
- `5` (patch): 行単位で変更を選択
- `6` (diff): 変更内容を確認

## 対話モードで表示される各コマンドについて
### 1. status (ステータス)

- 機能: 現在のリポジトリの状態を表示
- 詳細:
    - 変更されたファイル
    - ステージングされたファイル
    - 未追跡のファイルなどを一覧表示


使用例:
```bash
What now> 1
```

### 2. update (更新)
- 機能: 変更されたファイルをステージングエリアに追加
- 特徴:
    - 対話的にファイルを選択可能
    - 数字で複数のファイルを選択できる

使用例:
```bash
What now> 2
           staged     unstaged path
  1:    unchanged        +1/-1 test1.txt
  2:    unchanged       +11/-0 test2.txt
  3:    unchanged       +14/-0 test3.txt
  4:    unchanged        +2/-1 test4.txt
  5:    unchanged       +18/-5 test5.txt
Update>> 1-3  # 1から3番目のファイルを選択
           staged     unstaged path
* 1:    unchanged        +1/-1 test1.txt
* 2:    unchanged       +11/-0 test2.txt
* 3:    unchanged       +14/-0 test3.txt
  4:    unchanged        +2/-1 test4.txt
  5:    unchanged       +18/-5 test5.txt
Update>>  # Enterで決定
updated 3 path
```

### 3. revert (元に戻す)

- 機能: ステージングされたファイルをワーキングディレクトリに戻す
- 注意点:
    - これは git reset HEAD <file> と同等の操作
    - ファイルの変更は保持される

使用例:
```bash
What now> 3
           staged     unstaged path
  1:        +1/-1      nothing test1.txt
Revert>> 1  # 戻すファイルを選択
           staged     unstaged path
* 1:        +1/-1      nothing test1.txt
Revert>>  # Enterで決定
reverted 1 path
```

### 4. add untracked (未追跡ファイルの追加)

- 機能: まだGitで追跡されていないファイルをステージングエリアに追加
- 特徴:
    - 新規作成されたファイルを簡単に追加可能
    - `.gitignore`で無視されているファイル以外


使用例:
```bash
What now> 4
           staged     unstaged path
  1: test1.txt
  2: test2.txt
  3: test3.txt
  4: test4.txt
Add untracked>> 1 4  # 新規ファイルを追加
           staged     unstaged path
* 1: test1.txt
  2: test2.txt
  3: test3.txt
* 4: test4.txt
Add untracked>>  # Enterで決定
added 2 paths
```

### 5. patch (部分的な変更)

- 機能: ファイル内の特定の行や部分的な変更をステージング
- 最も強力な機能:
    - 行単位で変更を選択
    - インタラクティブに `y/n` で各変更を選択


使用例:
```bash
What now> 5
           staged     unstaged path
  1:    unchanged       +11/-0 test1.txt
  2:    unchanged       +14/-0 test2.txt
  3:    unchanged        +2/-1 test3.txt
  4:    unchanged       +18/-5 test4.txt
Patch update>> 4
           staged     unstaged path
  1:    unchanged       +11/-0 test1.txt
  2:    unchanged       +14/-0 test2.txt
  3:    unchanged        +2/-1 test3.txt
* 4:    unchanged       +18/-5 test4.go
Patch update>>  # Enterで決定
diff --git a/test4.go b/test4.go
index d6d96db..4ba3706 100644
--- a/test4.go
+++ b/test4.go
@@ -3,7 +3,6 @@ package usecase
 import (
 	"context"
-	"github.com/test/domain/models"
 	"github.com/test/domain/repositories"
 )
 
(1/3) Stage this hunk [y/n/a/d/j/J/g/e/?]? y  #変更をステージングするので`y`

... # 今回の例の場合(3/3)になるまで変更するかを回答する
```
:::note info

- `y`: この部分を追加
- `n`: スキップ
- `a`: この後の全ての変更を追加
- `d`: この後の全ての変更をスキップ
- `j`: 現在の部分を保留にして次のステップへ
- `J`: 前回の部分に戻る（再度確認など）
- `g`: 特定の変更部分を直接選択して移動(`go to which hunk?`と聞かれるので数字で選択)
- `e`: 現在の変更部分を手動で編集
- `H`: ヘルプ表示
:::



### 6. diff (差分表示)

- 機能: ステージングされていない変更の詳細な差分を表示
- 特徴:
    - コードの変更箇所を詳細に確認可能
    - 色付きで表示され、追加/削除が分かりやすい

使用例:
```bash
What now> 6
           staged     unstaged path
  1:        +3/-0      test1.txt
  2:        +3/-0      test2.txt
Review diff>> 1  # 差分を見たいファイルを選択
```

### 7. quit (終了)

- 機能: 対話モードを終了
    - Ctrl+C や q でも終了可能

使用例:
```bash
What now> 7
```

### 8. help (ヘルプ)

- 機能: 利用可能なコマンドと使用方法を表示
- 特徴:
    - コマンドの詳細な説明を確認できる


使用例:
```bash
What now> 8
```

# おわりに
`git add -i`は多数の変更したファイルがある中で、全てではなく特定のファイルや行だけステージングしたいときにとても有効です。
この記事を機に使ってみてはいかがでしょうか？