📦
git stashを正しく使う
作業中にブランチ切替が必要なとき
作業中に急に別ブランチへ切り替えが必要になることがある。コミットするには中途半端、捨てるには惜しい変更。
そこでgit stashを使う。
基本動作
git stash pushはtrackedファイルの変更をスタックに退避し、working treeをHEAD状態に戻す。後でgit stash popで取り出せば変更が再適用される。
untrackedファイルを含めるには-u、ignoredまで含めるなら-a。
stashはスタック
複数積める。git stash listで確認、git stash apply stash@{2}で特定のものだけ取り出せる。popは取り出して削除、applyは取り出すだけ。
メッセージをつける
git stash push -m 'リファクタ中断'のようにメッセージをつけると、後でstash listで見たとき何が何か分かる。これをしないと3日後に『WIP on main』が3つあってどれか分からなくなる。
破壊コマンドの代わりにstash
git checkout -- .、git reset --hard、git clean -fdは全て変更を永久削除する。ブランチ作業が必要なら必ずstashから始める。作業後にstash popで復元すればいい。
動作フロー
1
`git stash push -m "メッセージ"` → 変更退避、working treeクリーン
2
`git stash list` → 積まれたstashの一覧
3
`git stash pop` → 最上位stashを復元して削除
4
`git stash apply stash@{N}` → 特定項目のみ復元(削除しない)
5
`git stash drop stash@{N}` / `git stash clear` → 削除
メリット
- ✓ working treeを安全に空にする
- ✓ reflogとは別にstash履歴を保持
デメリット
- ✗ 積もって忘れると見つけにくい
- ✗ pop時にマージ衝突が発生し得る
ユースケース
緊急bugfixで別ブランチへ切替
pull --rebase前にローカル変更を一時保管
cherry-pick、merge前の整理