はじめに
最近、私が多用しているgit add -i
について記事をまとめます。
この記事を読んで「add
のi
オプションすげぇ!!」って感じで、多くの人が使ってくれたら幸いです。
git add -i
って何??
簡単に言うと、git add
の対話型インターフェースです。
オプションを短縮せずに書くとgit add --interactive
です。
普通のgit add
とは全然違って、どのファイルをadd
するのかというやり取りをコマンドと対話しながら行うことができるものです。
簡単な使い方説明
使い方はめちゃくちゃ簡単です!!
git add -i
これだけ!すると、こんな感じの対話モードに突入します:
*** 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 (ステータス)
- 機能: 現在のリポジトリの状態を表示
- 詳細:
- 変更されたファイル
- ステージングされたファイル
- 未追跡のファイルなどを一覧表示
使用例:
What now> 1
2. update (更新)
- 機能: 変更されたファイルをステージングエリアに追加
- 特徴:
- 対話的にファイルを選択可能
- 数字で複数のファイルを選択できる
使用例:
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 と同等の操作
- ファイルの変更は保持される
使用例:
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
で無視されているファイル以外
使用例:
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
で各変更を選択
使用例:
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)になるまで変更するかを回答する
-
y
: この部分を追加 -
n
: スキップ -
a
: この後の全ての変更を追加 -
d
: この後の全ての変更をスキップ -
j
: 現在の部分を保留にして次のステップへ -
J
: 前回の部分に戻る(再度確認など) -
g
: 特定の変更部分を直接選択して移動(go to which hunk?
と聞かれるので数字で選択) -
e
: 現在の変更部分を手動で編集 -
H
: ヘルプ表示
6. diff (差分表示)
- 機能: ステージングされていない変更の詳細な差分を表示
- 特徴:
- コードの変更箇所を詳細に確認可能
- 色付きで表示され、追加/削除が分かりやすい
使用例:
What now> 6
staged unstaged path
1: +3/-0 test1.txt
2: +3/-0 test2.txt
Review diff>> 1 # 差分を見たいファイルを選択
7. quit (終了)
- 機能: 対話モードを終了
- Ctrl+C や q でも終了可能
使用例:
What now> 7
8. help (ヘルプ)
- 機能: 利用可能なコマンドと使用方法を表示
- 特徴:
- コマンドの詳細な説明を確認できる
使用例:
What now> 8
おわりに
git add -i
は多数の変更したファイルがある中で、全てではなく特定のファイルや行だけステージングしたいときにとても有効です。
この記事を機に使ってみてはいかがでしょうか?