スキップしてメイン コンテンツに移動

【Day 28】git add -p で必要な行だけを綺麗にコミットする部分ステージング技

Day 28 アイキャッチ
▲ 【Day 28】git add -p で必要な行だけを綺麗にコミットする部分ステージング技
👨‍🏫
皆さん、こんにちは! 本講座の専任講師です。
前回のDay 27では、巨大なC#ソリューションでの再ビルド待ちを完全ゼロにする神機能「git worktree」の内部構造と2画面並行デバッグの極意を学びました。
そして本日のDay 28は、プロの現場で毎日のように使われる超実践テクニック——【git add -p で必要な行だけを綺麗にコミットする部分ステージング技】を徹底解説します!
「C#のバグ調査や新機能開発の際、変数の値を確認するためにコードの途中に Console.WriteLine を差し込んだり、一時的なハードコード(テスト用の固定値やフラグ)を書き込むことはよくありますよね」
「しかし、いざコミットしようとしたとき、そのデバッグ行を手動で1行ずつ削除したりコメントアウトして、再度ビルド確認してからコミットしていませんか? あるいは、削除し忘れたデバッグログがそのまま本番リポジトリにコミットされ、Pull Requestのレビューで『不要なデバッグ出力が残っていますよ』と指摘されて恥ずかしい思いをしたことはありませんか?」
かつてのSubversion (SVN) では「ファイル単位」でしかコミット対象を選択できなかったため、そうした苦労は避けられませんでした。
しかしGitには、1つのファイル内にある変更箇所を行単位(Hunk:ハンク)で自由自在に選別し、必要な行だけをインデックス(ステージング)に載せる『git add -p (patch)』という強力無比な機能が備わっています!
ローカルのデバッグ用ログを残したまま、本番用修正コードだけを100%美しくコミットするプロの極意を、コマンドラインとTortoiseGit GUIの両面から完全マスターしましょう!

① 導入・本日の達成目標

現場で優れたエンジニアと評価される基準の1つに、「コミット履歴の美しさ(Atomic Commit:単一責務のコミット)」があります。
1つのコミットに「本番のバグ修正」と「関係のない一時デバッグコード」や「ついでに行った別機能のリファクタリング」がごちゃ混ぜになっていると、コードレビューの負担が跳ね上がり、将来障害が発生して git revert や git bisect を行う際にも大きな事故の原因になります。
本日は、1つのファイルから必要な行だけをピンポイントで切り出して美しいコミットを仕立てるプロの技術を習得します。

🎯 本日のゴール
  • SVNのファイル丸ごとコミットとGitの行単位部分ステージング(Hunk管理)の決定的違いを理解する
  • git add -p(パッチモード)の対話プロンプトと主要操作コマンド(y, n, s, e, q)を完全習得する
  • C#クラス内で発生する「本番修正ロジック」と「デバッグ用Console.WriteLine / 一時フラグ」を行単位で峻別する実践フローを身につける
  • 変更ブロックが隣接している場合に s (Split) や e (Edit) を駆使して極限まで細かく選別する技をマスターする
  • TortoiseGit(TortoiseGitMerge)のGUIを活用し、マウス右クリックで行単位ステージング・破棄を行う直感的手順を習得する
  • git diff --cached でコミット直前のステージング状態を100%安全に確認するプロの検証ルーティンを確立する

② 【図解】従来のファイル丸ごとコミットの悲劇 vs git add -p による部分ステージング

まず、従来のSubversion (SVN) や初心者が陥りがちな「ファイル丸ごとコミット」の落とし穴と、Gitの部分ステージングによる解決策を図解で対比してみましょう。

ファイル丸ごとコミットの悲劇 vs git add -p による部分ステージング
▲ 【図解①】従来のファイル丸ごとコミット(デバッグログ本番混入の悲劇) vs git add -p(行単位選別で美しいコミット)

Subversionでは、コミットの最小単位が「ファイル」でした。そのため、1つのファイルの中で作業していると、次のようなジレンマに直面していました。

💥 SVN時代・ファイル丸ごとコミットの3大悲劇
  • デバッグコードの誤コミット: 調査のために入れた Console.WriteLine("DEBUG: user count=" + count); や、テスト用にコメントアウトした認証処理を戻し忘れ、本番コードに混入してしまう。
  • 手動削除による再デバッグの困難: コミット前にデバッグコードをわざわざ手で消し、もし後から再度バグ調査が必要になったら、また同じデバッグコードをゼロから打ち直すという二度手間が発生する。
  • 無関係な変更の混入(Dirty Commit): 本番バグを直している最中に、気になったコードのインデントを直したり関係ないコメントを追記してしまい、1つのコミットに関心の異なる変更が混在してレビューが難航する。

これに対してGitは、「ワーキングツリー(ローカル作業フォルダ)」と「インデックス(ステージング領域)」が完全に分離されています。
この構造のおかげで、「ローカルファイル上にはデバッグログや一時的な実験コードを残したまま、本番にコミットしたい行だけをインデックスにコピーする」という魔法のような芸当が可能になります。それをCLIで対話的に実行するコマンドが git add -p(または git add --patch)です!

③ 【図解】git add -p の対話モードとHunk操作コマンド完全図解

git add -p を実行すると、Gitはファイル内の差分をひとかたまりの変更ブロック(Hunk:ハンク)ごとに切り分けて画面に表示し、対話プロンプトで「このブロックをステージングしますか?」と尋ねてきます。

git add -p の対話モードとHunk操作コマンド完全図解
▲ 【図解②】対話プロンプトと主要操作コマンド(y: 採用 / n: スキップ / s: 分割 / e: 手動編集 / q: 中断)

対話プロンプトに表示される Stage this hunk [y,n,q,a,d,s,e,?]? の各コマンドの意味を完璧に整理しておきましょう。

📋 Hunk操作コマンドの決定版チートシート
キー 名称 動作と実務での活用法
y yes(ステージング) 表示されているHunkをステージング領域に追加します。本番修正コードのブロックで押します。
n no(スキップ) このHunkをステージングせずスキップします。作業フォルダのファイルは変更されずそのまま残ります(デバッグログ等)。
s split(さらに分割) 表示中のHunkの中に「本番修正」と「デバッグログ」が両方含まれている場合、間に未変更行があれば2つ以上の小さなHunkに自動分割します。
e edit(手動編集) 変更行が直結していて s で自動分割できない場合、エディタを開いて不要な + 行を削除し、手動でパッチを微調整します。
q quit(中断・終了) 途中でステージング処理を終了します。それまでに y を押したHunkはステージングされた状態で保持されます。
? help(ヘルプ) 使用可能な全コマンドの簡単な説明を表示します。

④ 【図解】C#現場での実践!デバッグ用Console.WriteLine混入防止フロー

それでは、実際のC#開発現場を想定した具体的なシナリオで git add -p の実践手順を見てみましょう!

C#現場での実践!デバッグ用Console.WriteLine混入防止フロー
▲ 【図解③】C#クラス(OrderService.cs)の本番修正とデバッグログを行単位で切り離す実戦フロー

💻 実例:OrderService.cs のバグ修正シナリオ

ECサイトの注文処理サービス OrderService.cs において、「割引額が負数になった場合に例外をスローする」というバグ修正を行いました。
しかし開発中、動作確認のために途中で Console.WriteLine による値の出力や、一時的なフラグ変数を書き加えています。

// OrderService.cs の現在の作業フォルダ内の状態 public decimal CalculateFinalPrice(Order order, decimal discount) { + // 一時デバッグ用: 渡ってきた注文IDと割引額をログ出力(本番不要!) + Console.WriteLine($"[DEBUG] Calculating discount for Order: {order.Id}, discount: {discount}"); + // ★ 本番修正コード: 負数の割引を弾くバリデーションガード + if (discount < 0) + { + throw new ArgumentOutOfRangeException(nameof(discount), "割引額を負数にすることはできません。"); + } decimal total = order.SubTotal - discount; return total > 0 ? total : 0; }

ここで git add OrderService.cs や git commit -am "fix" を実行してしまうと、赤色の一時デバッグログまで本番に混入してしまいます。
そこで、ターミナルで git add -p OrderService.cs を実行します!

$ git add -p OrderService.cs diff --git a/OrderService.cs b/OrderService.cs index a1b2c3d..e4f5g6h 100644 --- a/OrderService.cs +++ b/OrderService.cs @@ -10,6 +10,14 @@ public decimal CalculateFinalPrice(Order order, decimal discount) + Console.WriteLine($"[DEBUG] Calculating discount for Order: {order.Id}, discount: {discount}"); + + if (discount < 0) + { + throw new ArgumentOutOfRangeException(nameof(discount), "割引額を負数にすることはできません。"); + } decimal total = order.SubTotal - discount; Stage this hunk [y,n,q,a,d,s,e,?]? s ← ここで s (Split) を入力して分割! Split into 2 hunks. @@ -10,2 +10,4 @@ public decimal CalculateFinalPrice(Order order, decimal discount) + Console.WriteLine($"[DEBUG] Calculating discount for Order: {order.Id}, discount: {discount}"); Stage this hunk [y,n,q,a,d,s,e,?]? n ← デバッグログなので n (No) で除外! @@ -12,6 +14,6 @@ public decimal CalculateFinalPrice(Order order, decimal discount) + if (discount < 0) + { + throw new ArgumentOutOfRangeException(nameof(discount), "割引額を負数にすることはできません。"); + } Stage this hunk [y,n,q,a,d,s,e,?]? y ← 本番修正なので y (Yes) でステージング!

たったこれだけです!
これでインデックス(ステージング)にはバグ修正コードだけが登録され、作業フォルダには引き続き Console.WriteLine が残ったままになります。

🔍 プロの必須習慣:コミット直前に git diff --cached を叩け!

ステージングを終えたら、いきなりコミットするのではなく、必ず次のコマンドを実行しましょう:
git diff --cached(または git diff --staged)
通常の git diff は「作業フォルダとステージングの差分」を表示しますが、--cached オプションを付けると「ステージング領域と前回のコミットの差分(=今からコミットされる純粋な内容)」だけが表示されます。
ここで余計なデバッグ行や一時コードが含まれていないことを100%確認してから git commit -m "fix: ..." を実行するのが、プロエンジニアの鉄則です。

⑤ 【図解】TortoiseGitで行単位・ブロック単位にステージングする視覚的GUI操作

「黒い画面(CLI)での対話モードはちょっと敷居が高い……」「左右のカラー差分を見比べながらマウスで安全に選びたい」というWindowsエンジニアの方も安心してください。
エクスプローラー統合の定番GUIツール TortoiseGit を使えば、マウス操作だけでまったく同じ部分ステージングが可能です!

TortoiseGitで行単位・ブロック単位にステージングする視覚的GUI操作
▲ 【図解④】Windowsエクスプローラー&TortoiseGitMergeを活用した直感的マウス操作による部分ステージング
🖱️ TortoiseGitでの行単位ステージング 4ステップ手順
  1. コミットダイアログを開く: プロジェクトフォルダを右クリックし、「Git コミット(C) -> "ブランチ名"...」を選択します。
  2. 差分比較(TortoiseGitMerge)を起動: 変更されたC#ファイルをリストからダブルクリックします。左右に差分が表示されたTortoiseGitMergeウィンドウが開きます。
  3. 除外したい行・ブロックを選択して右クリック:
    • 変更を破棄して完全に元に戻したい場合: 該当ブロックを右クリックして「このブロックの変更を取り消す」を選択。
    • 作業フォルダに残したままコミット対象から外す場合: コミットダイアログ側の「ステージングを使用」機能(またはパッチ作成)を有効にし、コミット対象とするブロックだけを選択してステージングに移動。
  4. コミットと確認: コミットダイアログに戻ると、選択したブロックだけがステージング領域に反映されているため、メッセージを入力してコミットします。

📌 まとめ&明日の予告

🎓 本日の最重要チェックポイント
  • SVNとの決定的差: SVNのファイル丸ごとコミットと決別し、Gitのインデックス(ステージング)を活用して行単位(Hunk)で美しく選別コミットせよ!
  • 対話モードの3種の神器: git add -p を実行し、y(採用)、n(除外・ローカル維持)、s(細分化Split)を自在に使いこなせ!
  • コミット前の絶対防壁: コミット前には必ず git diff --cached を叩き、デバッグログや一時フラグが混入していないことを自分の目で100%確かめよ!

次回【Day 29】のテーマは、【git blame & git log -L でC#コードの「犯人・導入理由」を完全特定】です!
「この怪しいif文は一体誰が何のために書いたのか?」「このC#メソッドの過去5年間の変更履歴をピンポイントで追跡したい!」という疑問を瞬時に解決するコード考古学の必須ツール git blame と git log -L の奥義を解説します。お楽しみに!

コメント

このブログの人気の投稿

【Perfume】Perfume 3rd Tour 「JPN」さいたまスーパーアリーナに行って参りました~

Perfume 3rd Tour 「JPN」1月28日、29日の2daysで参戦して参りました。 ファンクラブ会員の選考抽選会に28日、29日の両日で申し込んでいたんですが、両方とも当選していたという嬉しい誤算。 仕事だぁ、なんだかんだと紆余曲折ありまして28日の参戦は危ぶまれていたのですが、なんとかかんとか28日は40分遅刻しながらも参戦、29日はフル参戦する事が出来ました(∩´∀`)∩

Perfume、2025年末で“コールドスリープ(活動休止)”へ──東京ドーム2daysの記録と、公式・各界・ファンの声

  1) 公式発表・基本情報 活動休止(コールドスリープ)を正式発表 2025年9月21日、公式サイト「 Perfumeより 」で、2026年から一度コールドスリープに入ると発表。再始動の意思(“新しいPerfume”として戻る)も明記。 Perfume Official Site 今後の運用告知(配信・上映など) 同21日付の「 今後のPerfumeに関して 」で、9/23(火・祝)東京ドーム公演の LIVESHIP全世界生配信 および 全国ディレイビューイング 決定を案内。特設サイトも併記。 Perfume Official Site +1 公式グッズ **「Perfume Calendar 2026」**発売決定(B2壁掛け/表紙+2カ月1枚×6枚+ポスター)。テーマは“フルーツ”。 Perfume Official Site 2) 東京ドーム2days(9/22・23)要点 公演タイトル: ZO/Z5 Anniversary “ネビュラロマンス” Episode TOKYO DOME 。日程・開場/開演・会場・物販等の実務情報は特設で公開。 Perfume Official Site 9/23公演を世界配信(LIVESHIP) /ディレイビューイング実施。 Perfume Official Site 海外向け報道(英語)も「 indefinite hiatus 」として広く配信。 The Times of India 国内英字メディアも速報。 朝日新聞 3) 現地レポ( メリ爺 )から見える空気 あなたの現地記録(9/24公開)を、ファクトと現場情景の両面で反映: 両日参戦 。22日は アリーナ 、23日は 1階席から俯瞰 。前日の発表を受け、開演前のザワつき→MC後に“いつもの一体感”へ。開演は22日 18:45 頃。オープニングは**P³ツアー東京ドーム(2020/2)**と同趣向で“回収”の演出。 メリ爺のゲーム万歳 MC所感 :解散ではなく前向きな休止で不安を和らげる内容。 かしゆか の涙、 のっち の気丈さ、 あ〜ちゃん の思い出語り──3人の結束と「 また戻る 」約束が強く刻まれた。 メリ爺のゲーム万歳 体感時間 : “3時間弱”級のボリューム ながら“過去一...

ニンテンドースイッチでオンラインゲームを遊ぶには?

モンスターハンターライズが発売になって、家族でモンハン楽しみたい人が増えたみたいですね。 某ブログの検索キーワードを調べると、モンハンを家族でやるにはどうしたらいいのか?を調べている人が沢山いるのがわかります。 ※これでも一部  家族で協力するにはSwitch2台、ソフトも2つ購入する必要があります。 1台のスイッチでは遊べませんし、ソフト1つでも遊べません。 でも、1台のスイッチで別々アカウントがあれば交代で遊ぶこともできますよ。セーブデータもしっかり分かれます。 Switchのオンラインゲームを家族で遊ぶ方法については以下の記事にまとめてますのでよろしければ参考にしてみてくださいね。 家族でモンスターハンターライズDL版のオンラインプレーを楽しむ方法