はじめに
みなさんはGitを扱うときにどのようにステージングしていますか?
僕はいままで、git add <file名>
でファイルごとにステージングしていました。
しかし、開発をしていると、よくconsole.log
など自分の環境内だけで動かしたいコードを差し込んでいる時があります。一度コミットしたいけど、そのようなコードはステージングしたくないため、わざわざそのコードを消してからコミットしていました。
そんなときに使えるのが、Gitの対話的ステージングです。
では実際に見ていきましょう。
Gitの対話的ステージング
git add -p
git add -p
は、Gitが変更箇所を「hunk(ハンク)」と呼ばれるブロック単位で表示し、そのhunkをステージングするかどうかを対話形式で選択できるコマンドです。これにより、同じファイル内の一部の変更だけをステージングできます。
git add -p
コマンドを打ち込むと、以下のような表示が出てきて操作を尋ねられます。
diff --git a/<対象ファイルパス> b/<対象ファイルパス>
index <index番号>
--- a/<対象ファイルパス>
+++ b/<対象ファイルパス>
@@ <hunkとしてみている行> @@
+/- 差分のコード
Stage this hunk [y,n,q,a,d,j,J,g,/,e,?]?
末尾の ?
を入力すると、オプションのヘルプが表示されます。代表的なオプションは以下の通りです。
オプション | 説明 |
---|---|
y | はい (yes): この変更部分(hunk)をステージングします。 |
n | いいえ (no): この変更部分をステージングしません。 |
q | 終了 (quit): コマンドを終了します。これ以降の変更は何もステージングしません。 |
a | すべて (all): この変更部分と、このファイル内の残りのすべての変更部分をステージングします。 |
d | しない (don't): この変更部分と、このファイル内の残りのすべての変更部分をステージングしません。 |
s | 分割 (split): 現在の変更部分を、さらに細かい単位に分割します。 |
e | 編集 (edit): 現在の変更部分をテキストエディタで開き、手動で修正します。 |
j | 次の未決定へ (jump): この変更部分の判断を保留し、次の「未決定」の変更部分へ移動します。 |
J | 次へ (Jump): この変更部分の判断を保留し、次の変更部分へ(決定済みでも)移動します。 |
k | 前の未決定へ (jump): この変更部分の判断を保留し、前の「未決定」の変更部分へ移動します。 |
K | 前へ (Jump): この変更部分の判断を保留し、前の変更部分へ(決定済みでも)移動します。 |
g | 移動 (go to): 指定した番号の変更部分へ移動します。 |
/ | 検索 (search): 正規表現を使って、特定のコードが含まれる変更部分を検索します。 |
p | 表示 (print): 現在の変更部分を再度表示します。 |
? | ヘルプ (help): このヘルプメッセージを表示します。 |
e
を入力して手動編集モードに入ると、エディタが開きます。そこでステージングしたくない行(+
で始まる行)を削除したり、削除したくない変更(-
で始まる行)を
(スペース)に変えたりしてから保存して閉じると、その内容がステージングされます。
→ 後にでてくるgit add -e
と同じです。
git add -e
git add -e
は、ファイル全体の差分を直接テキストエディタで開き、パッチファイルを編集することでステージングする内容を決定するコマンドです。
git add -e <ファイル名>
このコマンドを実行すると、指定したファイルのすべての変更点が1つのファイルとしてエディタで開かれます。
ステージング操作は、以下のルールです。
対象の行 | ✅ ステージングする | ❌ ステージングしない |
---|---|---|
+ (追加した行) |
そのまま | 行ごと削除する |
- (削除した行) |
そのまま |
- をスペース に変える |
要するに、「ステージングしたい差分だけをファイルに残して保存する」ということです!
編集を終えてエディタを保存・終了すると、編集後のパッチの内容がステージングされます。git add -p
のe
オプションをファイル全体に適用するイメージで、より詳細に・広範囲の変更を一度に編集したい場合に適しています。
まとめ
これら2つの対話的ステージングを、シーンに応じて使い分けるのがおすすめです。
-
普段使いは
git add -p
で十分- ファイル内の一部の変更だけをhunk(チャンク)単位で素早くステージングしたい場合に、手軽で便利です。
-
細かく編集したいときは
git add -e
- 変更がファイル全体に及んでいたり、y/nで選ぶのが面倒なほど多かったりする場合に最適です。エディタで直接パッチを編集できるため、行単位でステージング内容を大胆に調整できます。
これらの機能を使いこなすことで、「このconsole.logだけ除外したい」といった日々の小さなストレスから解放され、よりクリーンなコミット履歴を効率的に作れるようになります!
おまけ: VSCodeでのステージング
コマンドライン操作が苦手な方でも大丈夫です。普段お使いのVSCodeでも、hunkごとのステージングが簡単に行えます。
- 左側のアクティビティバーから「ソース管理」パネル(Gitのアイコン)を開きます。
- 「変更」リストの中から、差分を確認したいファイルをクリックします。
- エディタが開き、変更前後の差分が並べて(またはインラインで)表示されます。
- ステージングしたいコードブロック(hunk)にマウスカーソルを合わせクリックすると、+アイコンが表示されます。
- +アイコンをクリックすると、そのhunkだけがステージングされます。
行単位でステージングしたい場合は、ステージングしたい行を選択して右クリックし、「選択した範囲をステージング」を選ぶことでも可能です。
VSCodeを使っているなら、コマンドを覚える必要がなく、視覚的に操作できるのでこちらの方が楽で分かりやすいかもしれませんね。
参考