導入
コードを書きかけのまま、急に別の用事(別ブランチの緊急修正など)が入ることがあります。でも中途半端な状態でコミットはしたくない。そんなときに、作業中の変更を いったん棚に上げて 、きれいな状態に戻せるのが git stash(stash=しまい込む)です。
説明
まず最初のコミットを作り、そのあと README.md を書きかけにして「作業中」の状態を作ります。
git init
git add .
git commit -m "Initial commit"
echo "書きかけのメモ" >> README.md
git status
README.md が modified(変更あり)と出ています。ここで git stash を打つと、この変更が棚に上げられ、作業ツリーは 直前のコミットのきれいな状態 に戻ります。
git stash
git status
cat README.md
working tree clean になり、README.md から書きかけの行が消えました。消えたのではなく 退避されただけ です。棚の中身は git stash list で確認できます。
git stash list
stash@{0} が退避した変更です。用事が済んだら git stash pop で 元に戻します(棚から取り出して、棚からは消す)。
git stash pop
cat README.md
書きかけの行が戻ってきました。pop の代わりに git stash apply を使うと、戻したうえで棚にも残せます(同じ変更を複数ブランチに当てたいとき)。棚を捨てるだけなら git stash drop、全部空にするなら git stash clear です。
flowchart LR
A["作業中の変更"] -->|"git stash"| B["棚に退避<br/>作業ツリーはきれいに"]
B -->|"別の作業をする"| B
B -->|"git stash pop"| C["変更を元に戻す"]
典型的な使い方は「stash → 別ブランチで緊急修正 → 戻ってきて
git stash pop」の流れです。メッセージを付けて退避したいときはgit stash push -m "説明"と書けます。あとでgit stash listを見たときに中身が分かって便利です。
やってみよう
README.md を書きかけにして git stash で退避し、git status が clean に、cat README.md から書きかけが消えることを確認しましょう。git stash list で棚の中身を見てから git stash pop で元に戻し、書きかけが復活することを確かめてください。
演習
書きかけの変更(README.md)を、いったん棚に退避してください。
ヒント1を見る
作業を一時退避するコマンドは git stash です。
ヒント2を見る
git stash