📦

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 --hardgit 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前の整理

参考資料