スタッシュとは?
スタッシュ(stash)は、現在の作業中の変更を一時的に保存する機能です。コミットせずに変更を退避させ、後で復元できます。
こんな時に便利
🚨 緊急の作業が発生
- 「機能開発中に緊急のバグ修正依頼が来た」
- 「今の変更をコミットするには中途半端」
- 「でもクリーンな状態で作業したい」
🔄 ブランチの切り替え
- 「別のブランチを確認したいが、現在の変更を失いたくない」
- 「コミットするほどではない実験的な変更」
🧪 一時的な実験
- 「この変更を試したいが、元に戻せるようにしたい」
- 「複数のアプローチを試して比較したい」
基本的な使い方
1. 変更を保存(stash)
# 現在の変更を保存
git stash
# メッセージ付きで保存
git stash save "作業中: ログイン機能の実装"
# 新規ファイルも含めて保存
git stash -u
# 無視ファイルも含めて保存
git stash -a
2. 保存した変更を確認
# stashリストを表示
git stash list
# 特定のstashの内容を確認
git stash show stash@{0}
# 詳細な差分を表示
git stash show -p stash@{0}
3. 変更を復元
# 最新のstashを適用(stashは残る)
git stash apply
# 特定のstashを適用
git stash apply stash@{2}
# 適用してstashから削除
git stash pop
# コンフリクトが発生した場合は手動で解決
4. stashの管理
# 特定のstashを削除
git stash drop stash@{1}
# すべてのstashを削除
git stash clear
# stashから新しいブランチを作成
git stash branch new-feature-branch stash@{0}
高度な使い方
部分的なstash
# 対話的に変更を選択してstash
git stash -p
# 特定のファイルだけstash
git stash push -m "一時保存" -- path/to/file.js
stashの内容を確認
# stashされたファイル一覧
git stash show --name-only stash@{0}
# stashの統計情報
git stash show --stat stash@{0}
よくある使用パターン
パターン1: 緊急対応
# 1. 作業中の変更を保存
git stash save "WIP: 機能開発中"
# 2. 緊急修正を実施
git checkout main
git pull origin main
# ... バグ修正 ...
git commit -m "fix: 緊急バグ修正"
git push origin main
# 3. 元の作業に戻る
git checkout feature/branch
git stash pop
パターン2: ブランチの確認
# 1. 現在の変更を保存
git stash
# 2. 他のブランチを確認
git checkout other-branch
# ... 確認作業 ...
# 3. 元に戻る
git checkout original-branch
git stash pop
パターン3: 実験的な変更
# 1. 実験1を保存
# ... 実験的なコード ...
git stash save "実験: アプローチ1"
# 2. 実験2を試す
# ... 別のアプローチ ...
git stash save "実験: アプローチ2"
# 3. 比較して選択
git stash list
git stash show -p stash@{0} # アプローチ2を確認
git stash show -p stash@{1} # アプローチ1を確認
git stash apply stash@{1} # アプローチ1を採用
注意点とトラブルシューティング
1. stashの競合
# popでコンフリクトが発生した場合
git stash pop
# CONFLICT発生
# 手動で解決
# ... コンフリクト解決 ...
git add .
# stashはまだ残っているので削除
git stash drop
2. 間違えてstashを削除した場合
# reflogから復元を試みる
git fsck --no-reflog | grep commit
git show <found-hash>
3. どのstashか分からなくなった
# 各stashの作成時刻と内容を確認
git stash list --date=relative
for i in $(git stash list | cut -d: -f1); do
echo "=== $i ==="
git stash show -p $i | head -20
done
実践演習
CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$
█
ファイルツリー
/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log
CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$
█
ファイルツリー
/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log
stashのベストプラクティス
1. 分かりやすいメッセージを付ける
# ❌ 悪い例
git stash
git stash save "一時保存"
# ✅ 良い例
git stash save "WIP: ログイン検証ロジックの実装中"
git stash save "実験: 新しいAPIエンドポイントのテスト"
2. 定期的にstashを整理
# 古いstashを確認
git stash list --date=relative
# 不要なstashを削除
git stash clear # 注意: すべて削除される
3. 重要な変更はブランチに
# stashが重要な変更になった場合
git stash branch feature/important-change stash@{0}
まとめ
git stashは、柔軟な作業フローを実現する強力なツールです。緊急対応や実験的な変更、ブランチ切り替えなど、様々な場面で活用できます。ただし、あくまで一時的な保存手段として使い、重要な変更は適切にコミットすることが大切です。
次のレッスンでは、外部リポジトリを管理する「サブモジュール」について学びます。