git stash は、今の変更を一時退避して作業ツリーをきれいな状態へ戻すための Git コマンドです。
まだ commit したくない変更をいったん避けて、別の作業や git pull を進めたいときによく使います。
まず押さえたいポイント
- 変更を消すのではなく、あとで戻せる形で棚に上げるコマンド
git pullが「ローカルの変更があるので進められない」と止まったときの定番の逃げ道stash pop(取り出して棚から消す)とstash apply(取り出すが棚に残す)は別物
退避したつもりで消える典型的な事故
いちばん多いのは、新規追加ファイルが退避されないという事故です。
git stash は既定では Git が追跡しているファイルの変更しか対象にしないため、退避したつもりで branch を切り替えると、まだ git add していない新規ファイルだけが手元に取り残されます。防ぐには -u(--include-untracked)を付けます。
git stash push -u -m "問い合わせフォームの下書き"
もうひとつは git stash pop の途中失敗です。pop は「取り出し」と「棚から削除」を続けて行いますが、競合が出ると取り出しだけ行われて棚には残ります。ここで焦って git checkout . を打つと、取り出した側の変更を消してしまいます。競合が出たら、まず git stash list で棚の中身が残っていることを確認してから直すのが安全です。
apply と pop の使い分け
- 同じ退避を複数の branch に当てたい →
apply - 一度戻せば用済み →
pop - 迷ったら
applyで試し、動作確認できてからgit stash drop
実務で見るポイント
-mでメッセージを必ず付ける。無記名の stash が3つもたまると、どれが何の退避か分からなくなる- 退避は数時間〜1日の一時避難。数日残りそうなら作業用 branch を切って commit した方が安全
- pop のあとに merge conflict が出ることは普通にある
- pull が止まる状況の全体像はGitで unstaged changes があって pull できないときの対処法で整理しています