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

【Day 15】作業途中の緊急退避(git stash)

Git & GitHub 超入門 Day 15
👨‍🏫
皆さん、こんにちは! 本講座の専任講師です。
前回のDay 14では、コミット履歴を美しく一本道に整頓する「リベース(git rebase)」と、絶対に破ってはいけない公開ブランチの黄金律について詳しく学びましたね。
さて、開発の現場で日常茶飯事のように起きるのが、「新機能のコードを書いている最中に、本番環境で緊急バグが発覚した!」というトラブルです。
Visual Studioを開けば、画面には赤波線(コンパイルエラー)だらけの書きかけコード。この状態のままコミットしたくはないし、かといって別のブランチ(緊急修正用ブランチ)に切り替えようとすると、Gitに「未コミットの変更があるため切り替えできません」と怒られてしまう……。
Subversion (SVN) 時代なら、泣く泣く差分パッチファイルを手動エクスポートしたり、作業フォルダを丸ごとZIP圧縮してデスクトップに避難させていたのではないでしょうか?
ご安心ください! Gitには、そんな絶体絶命のピンチをわずか1秒で解決してくれる魔法のコマンド「git stash(スタッシュ)」が用意されています。
本日は、書きかけコードを安全な引き出しに一時退避し、何事もなかったかのように作業ツリーをクリーンにするプロの必須テクニックを徹底解説します!

① 導入・本日の達成目標

「stash」とは、英語で「(安全な場所に)隠す、一時的にしまい込む」という意味です。
Gitのstash機能を使えば、コミット前の変更(作業ツリーやインデックス)を丸ごと一時退避領域(スタック)へと退避させ、作業ディレクトリを直前のきれいな状態(直前のコミット直後)に一瞬でリセットできます。

本日の講義でマスターする達成目標は以下の3点です!

  • 作業途中のジレンマとSVN vs Gitの解決アプローチ: コンパイルエラー中のコードを壊さずに退避し、安全にブランチを切り替える仕組みを理解する。
  • git stash のスタック構造(LIFO)と主要コマンド: 退避(push)、復元(pop / apply)、一覧確認(list)、削除(drop / clear)の使い分けをマスターする。
  • TortoiseGitのGUI操作とC#新規ファイルの注意点(-u オプション): Visual Studioで追加した未追跡ファイル(Untracked)を取り残さない完全退避テクニックを習得する。

② 【ジレンマとSVN対比】作業途中でブランチを切り替えられない問題

機能実装の途中で「ちょっと別のブランチを見たい」「至急バグ修正してほしい」と頼まれた時、開発者が直面する典型的なトラブルと解決策を比較してみましょう。

作業途中のジレンマとSVN vs Gitの解決策
▲ 【図解①】書きかけの未コミットコードを抱えたジレンマと、git stash による安全な即座退避

1. なぜブランチを切り替えられないのか?

Gitでは、作業ディレクトリにコミットしていない変更が残っている状態で git switch other-branch を実行すると、衝突の可能性がある変更はブロックされ、ブランチの切り替えが拒否されます。
「とりあえず適当に『作業途中』とコミットしてしまおうか……」と誘惑に駆られますが、コンパイルが通らない壊れたコードをリポジトリのコミット履歴に残すのはアンチパターン(悪習)です。

2. SVN時代の苦肉の策 vs Gitの git stash

集中型バージョン管理(SVN / VSS)では、作業途中のコードを退避する専用の機構がなかったため、開発者は以下のような苦労を強いられていました:

  • 変更差分を「パッチファイル(.patch / .diff)」として手動でファイル出力し、修正後にパッチ適用する(パッチの紛失や適用漏れが頻発)。
  • プロジェクトフォルダ全体を別フォルダにコピー&ペーストしてバックアップを取り、手動でマージする(ファイル散乱の原因)。

これに対し、Gitは「コマンド1発でGit専用の一時格納庫(スタック)に退避し、作業ツリーを瞬時にクリーン化する」という極めて洗練されたソリューションを提供しています!

③ 【メカニズム】git stash のスタック構造(LIFO)と基本コマンド

退避された変更はどこへ行くのでしょうか? Gitはリポジトリ内部に「Stashスタック」と呼ばれる専用の棚(スタック領域)を用意しています。

git stash のスタック構造と基本コマンド
▲ 【図解②】LIFO(後入れ先出し)のスタック構造と、stash / pop / apply / list コマンドの関係

スタックはLIFO(Last In, First Out: 後入れ先出し)形式で管理されます。つまり、最後に退避した変更が常にスタックの一番上(stash@{0})に置かれます。

主要コマンド一覧と使い分け

コマンド 動作と解説
git stash
git stash push -m "メモ"
作業ツリーの変更をスタックの一番上に退避。
※メモ付き(-m)で退避するのが実務での鉄則!
git stash list 退避されているスタックの一覧を表示(stash@{0}, stash@{1} など)。
git stash pop 【一番よく使う】最新の退避(stash@{0})を作業ツリーに復元し、スタックから自動削除する。
git stash apply 最新の退避を復元するが、スタックには削除せず残しておく(複数のブランチに同じ退避を適用したい時に便利)。
git stash drop
git stash clear
不要になった特定の退避を破棄(drop)、または全スタッシュを一括消去(clear)。

④ 【Windows GUI】TortoiseGitで簡単!GUIでの退避と復元手順

Windows環境であれば、TortoiseGitを使うことでコマンドを打つことなく、マウス操作だけで安全確実に行えます。

TortoiseGitでのStashとPop操作
▲ 【図解③】Windowsエクスプローラーから右クリックで行う直感的な退避と復元の手順

1. 退避(Stash)の操作手順

  1. 作業フォルダの何もないところを右クリックし、「TortoiseGit」➔「変更を退避(Stash changes)...」をクリックします。
  2. 「コメント」欄に「ユーザー認証ロジックの書きかけ」など、後から思い出せる分かりやすいメッセージを入力します。
  3. 「OK」ボタンをクリックすると、一瞬で作業中の変更が吸い出され、エクスプローラーのアイコンが緑色のチェックマーク(クリーン状態)に戻ります!

2. 復元(Pop)の操作手順

  1. 緊急バグ修正を終えて元のブランチに戻ってきたら、右クリックして「TortoiseGit」➔「退避した変更を適用(Stash pop)...」を選択します。
  2. 適用したいスタッシュ(通常は一番上の最新スタッシュ)を選択し、「OK」をクリックします。
  3. 書きかけだったC#コードが見事にエディタ上へ蘇ります!

⑤ 【C#現場の実践】新規ファイル退避の落とし穴(Untracked)と安全復元

ここで、C#(.NET)開発の現場で非常によくある「Stashの落とし穴」について解説します。

C#現場の実践:新規ファイル退避(-u)と安全復元
▲ 【図解④】新規作成した未追跡C#ファイル(.cs)を置き去りにしない `-u` オプションの鉄則
⚠️ 罠:新規作成した .cs ファイルはデフォルトでは退避されない!

Visual Studioのソリューションで「新しい項目の追加」をして新規作成した OrderService.cs など、「まだ一度も git add やコミットをしたことがない新規ファイル(Untracked: 未追跡ファイル)」は、通常の git stash では退避対象になりません!
そのため、作業ツリーに新規ファイルだけが取り残され、緊急修正用ブランチに切り替えた際に「同じ名前空間でビルドエラーが起きる」「不要なファイルが混入する」といった事故が発生します。

✅ 解決策:-u(--include-untracked)オプションを使おう!

未追跡の新規ファイルも含めて完全に退避したい場合は、以下のコマンドを使用します:
git stash -u または git stash --include-untracked
TortoiseGitの場合は、退避ダイアログにある「未追跡ファイルも含める(Include untracked)」チェックボックスにチェックを入れるだけでOKです!

⑥ 📌 本日のまとめ・理解したい最重要ポイント

第15回の講義、お疲れ様でした! 作業途中の緊急退避(git stash)の要点を総復習しましょう。

  • 壊れたコードはコミットせず「stash」に退避する: 不完全なビルドエラー状態のコードをコミットに残さず、クリーンにブランチ移動するための必須技。
  • LIFO構造を理解し、復元は pop、保持は apply: 基本は pop で取り出して片付け、複数ブランチで再利用したい時は apply を活用。
  • 新規作成した .cs ファイルは `-u`(未追跡も含める)で退避: Visual Studioで追加した新クラスを取り残さないよう、必ずUntrackedオプションを意識する。
  • TortoiseGitなら右クリックで視覚的に安全管理: コメントを添えて退避し、作業完了後にいつでもワンクリックで復元可能。
次回【Day 16】は、「リリースポインタの記録(git tag) 〜C#アセンブリバージョンと連動した注釈付きタグ付け〜」をお届けします! リリース時点のソースコードを永遠に固定・再現できるプロのタグ管理手法を学びましょう。お楽しみに!

コメント

このブログの人気の投稿

【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版のオンラインプレーを楽しむ方法