前回の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対比】作業途中でブランチを切り替えられない問題
機能実装の途中で「ちょっと別のブランチを見たい」「至急バグ修正してほしい」と頼まれた時、開発者が直面する典型的なトラブルと解決策を比較してみましょう。
1. なぜブランチを切り替えられないのか?
Gitでは、作業ディレクトリにコミットしていない変更が残っている状態で git switch other-branch を実行すると、衝突の可能性がある変更はブロックされ、ブランチの切り替えが拒否されます。
「とりあえず適当に『作業途中』とコミットしてしまおうか……」と誘惑に駆られますが、コンパイルが通らない壊れたコードをリポジトリのコミット履歴に残すのはアンチパターン(悪習)です。
2. SVN時代の苦肉の策 vs Gitの git stash
集中型バージョン管理(SVN / VSS)では、作業途中のコードを退避する専用の機構がなかったため、開発者は以下のような苦労を強いられていました:
- 変更差分を「パッチファイル(.patch / .diff)」として手動でファイル出力し、修正後にパッチ適用する(パッチの紛失や適用漏れが頻発)。
- プロジェクトフォルダ全体を別フォルダにコピー&ペーストしてバックアップを取り、手動でマージする(ファイル散乱の原因)。
これに対し、Gitは「コマンド1発でGit専用の一時格納庫(スタック)に退避し、作業ツリーを瞬時にクリーン化する」という極めて洗練されたソリューションを提供しています!
③ 【メカニズム】git stash のスタック構造(LIFO)と基本コマンド
退避された変更はどこへ行くのでしょうか? Gitはリポジトリ内部に「Stashスタック」と呼ばれる専用の棚(スタック領域)を用意しています。
スタックはLIFO(Last In, First Out: 後入れ先出し)形式で管理されます。つまり、最後に退避した変更が常にスタックの一番上(stash@{0})に置かれます。
主要コマンド一覧と使い分け
| コマンド | 動作と解説 |
|---|---|
git stashgit stash push -m "メモ" |
作業ツリーの変更をスタックの一番上に退避。 ※メモ付き(-m)で退避するのが実務での鉄則! |
git stash list |
退避されているスタックの一覧を表示(stash@{0}, stash@{1} など)。 |
git stash pop |
【一番よく使う】最新の退避(stash@{0})を作業ツリーに復元し、スタックから自動削除する。 |
git stash apply |
最新の退避を復元するが、スタックには削除せず残しておく(複数のブランチに同じ退避を適用したい時に便利)。 |
git stash dropgit stash clear |
不要になった特定の退避を破棄(drop)、または全スタッシュを一括消去(clear)。 |
④ 【Windows GUI】TortoiseGitで簡単!GUIでの退避と復元手順
Windows環境であれば、TortoiseGitを使うことでコマンドを打つことなく、マウス操作だけで安全確実に行えます。
1. 退避(Stash)の操作手順
- 作業フォルダの何もないところを右クリックし、「TortoiseGit」➔「変更を退避(Stash changes)...」をクリックします。
- 「コメント」欄に「ユーザー認証ロジックの書きかけ」など、後から思い出せる分かりやすいメッセージを入力します。
- 「OK」ボタンをクリックすると、一瞬で作業中の変更が吸い出され、エクスプローラーのアイコンが緑色のチェックマーク(クリーン状態)に戻ります!
2. 復元(Pop)の操作手順
- 緊急バグ修正を終えて元のブランチに戻ってきたら、右クリックして「TortoiseGit」➔「退避した変更を適用(Stash pop)...」を選択します。
- 適用したいスタッシュ(通常は一番上の最新スタッシュ)を選択し、「OK」をクリックします。
- 書きかけだったC#コードが見事にエディタ上へ蘇ります!
⑤ 【C#現場の実践】新規ファイル退避の落とし穴(Untracked)と安全復元
ここで、C#(.NET)開発の現場で非常によくある「Stashの落とし穴」について解説します。
Visual Studioのソリューションで「新しい項目の追加」をして新規作成した OrderService.cs など、「まだ一度も git add やコミットをしたことがない新規ファイル(Untracked: 未追跡ファイル)」は、通常の git stash では退避対象になりません!
そのため、作業ツリーに新規ファイルだけが取り残され、緊急修正用ブランチに切り替えた際に「同じ名前空間でビルドエラーが起きる」「不要なファイルが混入する」といった事故が発生します。
未追跡の新規ファイルも含めて完全に退避したい場合は、以下のコマンドを使用します:
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なら右クリックで視覚的に安全管理: コメントを添えて退避し、作業完了後にいつでもワンクリックで復元可能。
コメント
コメントを投稿