おはようございます、YASUです。
これまでステージング、ブランチ、コンフリクト解消と、Gitの基本操作を一通り触れてきましたが、実は基本中の基本と言えるgit stashをまだ扱っていませんでした。今日はこの「作業を一時的に退避する」コマンドについて整理します。
結論
git stashは、コミットするにはまだ早い、作業途中の変更を一時的に「棚上げ」して、作業ツリーをきれいな状態に戻すコマンドです。急に別のブランチに切り替える必要が出た時など、実務で頻繁に使われる場面があります。
どんな場面で困るのか
以前体験した通り、ブランチを切り替えるgit checkoutは、作業中の変更が残っていると失敗したり、意図しない形で影響したりすることがあります。例えばこんな状況を想像してみてください。
1. feature/login ブランチで作業中
2. まだコミットするには早い、中途半端な変更がある
3. そこに「至急、mainブランチの別の箇所を直してほしい」という依頼が入る
この時、中途半端な変更をわざわざコミットするのも変ですし、変更を消してしまうのはもったいない。こんな時に使うのがgit stashです。
基本の使い方
# 今の変更を、一時的に退避する
git stash
# 退避した一覧を確認する
git stash list
# 退避した内容を、元に戻す
git stash pop
git stashを実行すると、コミットしていない変更がすべて、一時的な保管庫(スタッシュ)に移動し、作業ツリーはまるで何も変更していないかのような、きれいな状態に戻ります。
実際の流れで確認する
# 1. 作業中、中途半端な変更がある状態
echo "作業中の内容" >> index.html
git status
# → modified: index.html
# 2. stashで退避する
git stash
# → Saved working directory and index state WIP on feature/login: ...
# 3. status を確認すると、きれいな状態に戻っている
git status
# → nothing to commit, working tree clean
# 4. 安心してブランチを切り替えられる
git checkout main
# (至急の作業をする)
# 5. 元のブランチに戻り、退避していた変更を復元する
git checkout feature/login
git stash pop
# → 退避していた変更が、元通り復元される
popとapplyの違い
調べていて気づいたのですが、退避した内容を戻すコマンドには2種類ありました。
- git stash pop:退避した内容を戻すと同時に、スタッシュの一覧からも削除する
- git stash apply:退避した内容を戻すが、スタッシュの一覧には残ったまま
普段はpopで十分ですが、同じ退避内容を複数のブランチに適用したい場合など、あえて一覧に残しておきたい時はapplyを使う、という使い分けがあるようです。
複数の作業を退避している場合
stashは、何度も実行して複数の退避内容を積み重ねることができます。
git stash list
# stash@{0}: WIP on feature/login: ...
# stash@{1}: WIP on feature/design: ...
この場合、特定の退避内容だけを指定して復元することもできます。
git stash pop stash@{1}
コミットとの違い
以前扱ったコミットとの違いを整理すると、こうなります。
- git commit:変更を、正式な履歴として記録する(意味のある区切りごとに行う)
- git stash:変更を、履歴には残さず一時的に退避するだけ(あくまで作業の中断・再開のための一時保管)
コミットメッセージのような「何をしたか」の記録を残す必要がなく、気軽に使える点がstashの特徴です。ただし、あくまで一時的な保管庫なので、長期間放置して何を退避したか忘れてしまう、という事故もよく起きるようです。
まとめ
git stashは、コミットするには早い作業中の変更を一時的に退避するコマンドgit stash popで復元(一覧からも削除)、git stash applyで復元(一覧には残す)- 複数の退避内容を積み重ねて管理することもできる
- コミットと違い、履歴には残らない一時的な保管庫という位置づけ
基本操作のはずなのに、これまで一度も使う場面がなかったので、今回初めて手を動かして体験できました。急な作業の切り替えが必要な実務の場面で、地味に役立ちそうなコマンドです。それでは、また明日!

コメント