
2026/07/26 0:44
git add -p を使ってパッチをステージする
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
クリーンなバージョン履歴を維持するための最も重要なツールは、
git add -p コマンドであり、このコマンドによりファイルの変更に対してインタラクティブなハンクレベルでのステージングが可能になります。通常のステージングとは異なり、この機能ではレビューアや開発者が特定のコードセグメント(「ハUNK」または変更のブロックと呼ばれる)を検査し、無関係な変更を無視しながらコミットに選択的に追加することができます。実行中、インターフェースは差分を表示し、[y,n,q,a,d,s,e,?] などのオプションでステージング、破棄、分割、編集、全変更の追加、終了、または拡張ヘルプ表示(?)を提示します。その後、git status を実行することで、変更が正しくステージ済み領域と非ステージ済み領域に分配されていることを確認できます。この粒状なアプローチは、大規模なファイル内部に存在するバグやタイプミスを偶然コミットに含めるのを防ぎ、コミットを焦点を当てた状態かつ整理されたものに保つことを保証します。履歴の基準がある既存のファイルに対しては有効ですが、差分比較点が欠落している全く新しいファイルについてはあまり有用ではありません。もしユーザーが偶然内容をステージしてしまう場合、git restore --staged <file> を使用して直ちにその動作を逆転させることができます。ハUNK を分割したり早期に終了したりすることで、開発者はリポジトリの整合性に対して正確な制御を得ることができ、コラボレーションがより円滑になり、時間の経過とともにコード管理も大幅に容易になります。稀なケースとして、ユーザーが全体ディレクトリをコミットし、その内容について確信がある場合、インタラクティブなステージングよりも標準的な git add のアプローチの方が好まれる可能性があります。本文
Git の add -p
でインタラクティブなステージングを行う方法
add -p既に
git add -p を活用してコミットのステージングを行っている場合を除き、その機会を逃している可能性があります。このコマンドはファイルを全体ではなく部分的にインタラクティブにステージングすることを可能にし、Git コミットプロセスへの制御性を格段に高めます。
なぜ git add -p
を使うべきか?
git add -pワークフローで
git add -p を好んで使用する主な理由は以下の通りです。
- ミス発見: ファイルを変更する最中に差分を確認でき、多くのミスを早期に発見できます。
- バグ防止: コミット前のレビューにより、コーディングや作成初期で見逃されがちなバグ・スペルミスを未然に防げます。
- 部分ステージング: Git は変更箇所を「ハंक(hunk)」と呼びますが、特定のハंकだけをステージングしてコミットできます。
- コミットの整理化: 複数の変更点を別々のコミットへグループ化したい場合に特におすすめです。関連する変更があっても個別に選択し、クリーンで構造化されたコミットを実現できます。
ファイルの一部をステージングする方法
以下のように変更内容(diff)が表示され、「このハंकをステージしますか?」と促されます。
diff --git a/main.mts b/main.mts index e1132f2..8f7c279 100644 --- a/main.mts +++ b/main.mts @@ -1,2 +1,4 @@ export const add = (a, b) => a + b +export const div = (a, b) => a / b export const sum = (xs) => xs.reduce((acc, x) => sum(acc, x)) +export const avg = (xs) => div(sum(xs), xs.length)
プロンプトには
(1/1) Stage this hunk [y,n,q,a,d,s,e,]? と表示されます。
基本的な操作
- ステージング:
を入力y - 非ステージング:
を入力n
本例では
avg 関数はまだコミット準備ができていませんが、div 関数だけプッシュしたいため、「ハंकを分割する」 (s) を選択します。Git は次のように問いかけます。
Split into 2 hunks. @@ -1,2 +1,3 @@ export const add = (a, b) => a + b +export const div = (a, b) => a / b export const sum = (xs) => xs.reduce((acc, x) => sum(acc, x))
次にプロンプト
(1/2) が表示されるため、div 関数をコミットするため y を入力します。Git は残りのハंकを表示します。
@@ -2 +3,2 @@ export const sum = (xs) => xs.reduce((acc, x) => sum(acc, x)) +export const avg = (xs) => div(sum(xs), xs.length)
最後にプロンプト
(2/2) が表示されるので、div のみで終了したい場合は q を入力しインタラクティブな対話を終えます。その後、必要に応じて git commit を実行します。
動作の確認
git status で確認すると、ファイル main.mts は以下の両方に表示されます。
- Changes to be committed (コミット対象)
- Changes not staged for commit (コミット前のステータス変更)
これは、ファイルの一部のみをステージングしたための意図した動作です。
On branch main Your branch is ahead of 'origin/main' by 1 commit. Changes to be committed: modified: main.mts Changes not staged for commit: modified: main.mts
これにより、次のコミットに向けた単一のハंक(パッチ)を成功裏に準備できました。
その他のオプションプロンプト
表示される応答リスト
[y,n,q,a,d,s,e,?] は短縮表示ですが、? を入力することで詳細なヘルプが得られます。主な機能は以下の通りです。
| キー | 機能 |
|---|---|
| y | このハंकをステージする |
| n | このハंकをステージしない |
| a | ファイルの残りのすべてのハंकも合わせて一度にステージする |
| d | ハンク(およびその後のもの)をステージしない |
| g | 選択し、移動する (Move) |
| /** | 指定した正規表現で検索 |
| j | 次の待機中のハंकへ移動 |
| J | 次のハンクへ移動 |
| k | 前の待機中のハンクへ移動 |
| K | 前のすべてのハンクを表示 |
| s | 現在のハンを分割する |
| e | 手動で編集 (Edit) |
| ? | ヘルプを表示 |
使用しないケース
ほぼ毎日
git add -p を使用していますが、以下の場合は通常通り別の方法を使います。
- 新規作成されたファイルの場合
- 以前の実装がないため差分を比較する元が存在しません。
- したがって承認用の差分が表示できず、使えません。
- ディレクトリ全体をコミットする場合
- 自信がある場合は
の標準アプローチを採用します。git add <directory> - ただし、微調整や特定のカラム制御が必要な場合は、あえて
を使用することもあります。git add -p
- 自信がある場合は
まとめ
ワークフローに
を取り入れることで、Git のコミットプロセスをスムーズかつ正確に管理できます。私は変更セットをコミットする際、このテクニックをほぼ毎回使用しています。git add -p
この方法を使えば:
- コミット対象となるコードを容易に見直す(レビュー)
- 各コミットに含まれる内容を正確に制御できる