Git Stash
Git Stash
概要(サマリー)
Git Stash(ギット・スタッシュ)は、Gitを使った開発において、現在書きかけの(コミットしていない)変更したコードを、一時的に別の場所に安全に「退避(避難)」させるための機能である。
「まだ作業が途中でコミットしたくないけれど、急ぎのバグ修正が入ったので、一時的に今の変更を隠して別のブランチに切り替えたい」という場面で非常に役立つ。Git操作のトラブルを防ぐための必須知識である。
詳細解説
Git Stashとは何か
「Stash(スタッシュ)」には、英語で「(安全な場所に)隠す、しまい込む」という意味がある。
Git Stashは、作業ディレクトリ内の「まだコミットされていない変更(変更されたファイルや新規追加されたファイル)」を、Gitが管理する一時的な待避所に退避させ、作業ディレクトリを一旦きれいな状態(前回のコミット直後と同じ状態)に戻してくれる。
なぜStashが必要なのか
Gitでは、変更された書きかけのコードが作業ディレクトリに残っていると、別のブランチへ切り替える(チェックアウトする)際に、「競合が発生して切り替えられない」というエラーが出ることがある。
だからといって、未完成の中途半端なコードをコミット(履歴に保存)するのは避けるべきである。このようなときにStashを使えば、コミット履歴を汚すことなく、一時的に変更を退避させてブランチを自由に切り替えることができる。
基本的な操作手順
Git Stashの基本的な流れは以下の通りである。
- 変更を退避する:
git stashコマンドを実行する。これで作業中のコードが隠され、ディレクトリがきれいになる。 - 別の作業を行う: ブランチを切り替えてバグ修正やマージなどを行う。
- 退避したコードを戻す: 元のブランチに戻り、
git stash popコマンドを実行して退避していたコードを現在の作業領域に復元する。
よく使うコマンド
Stashを使いこなすための主要なコマンドは以下である。
git stashまたはgit stash push: 現在の変更を退避する。git stash list: これまでに退避したStashの一覧を表示する。git stash pop: 最新の退避データを復元し、同時にStashリストからそのデータを削除する。git stash apply: 退避データを復元するが、リストにはデータを残したままにする。git stash drop: 退避データを復元せずに削除する。git stash clear: すべての退避データを削除する。
コード(コマンド)例
以下は、ターミナルで実際に Git Stash を使って作業を退避させ、復元する際の一連のコマンド操作例である。
作業途中で急ぎの別ブランチ作業が入った場合
# 1. 現在の変更状態を確認(ファイルが変更されているが、未コミット)
git status
# 2. 変更を一時退避させる
git stash
# 3. 作業ディレクトリがきれいになったことを確認
git status
# 4. バグ修正用の別ブランチに切り替えて作業を行う
git checkout hotfix-branch
# 5. 元のブランチに戻る
git checkout main
# 6. 一時退避させていた作業中のコードを復元し、元通りにする
git stash pop
# これで書きかけのコードが作業スペースに復元される
デフォルトの git stash では、Gitの追跡対象になっていない新規ファイル(Untracked files)は退避されない。新規ファイルも含めて退避したい場合は、git stash -u(--include-untracked オプション)を実行する必要がある。
AIコーディングとの関係
AIを使って開発していると、「コードが思った通りに動かなくなり、一旦前の状態に戻したいが、現在の変更も念のため残しておきたい」という場面がよくある。
このようなとき、AIに「現在の変更を壊さずに退避させ、前の状態と比較しながらバグを探したい」と相談すると、Git Stashを活用したトラブルシュート手順を提案してもらえる。
例えば、Stashの復元時に競合(コンフリクト)が起きた場合は、以下のようにAIに相談するとよい。
git stash pop を実行したところ、現在のファイルと競合(Conflict)が発生してしまい、マージエラーになりました。
退避していた書きかけのコードを安全に確認しつつ、競合を解決して作業を再開するためのGitコマンドと手順を教えてください。
AIは、競合が発生した箇所の見方や、Stashを削除せずに残したまま安全にマージを解決する具体的なステップを指示してくれる。
よくある勘違い
StashはPCをシャットダウンすると消えてしまう?
消えない。 Stashのデータは、メモリ上の一時キャッシュではなく、Gitのローカルリポジトリ(.git フォルダ内)にファイルとして安全に保存されている。そのため、PCを再起動したり、VS Codeを閉じたりしても、明示的に削除(pop や drop)しない限り残り続ける。
Stashしたデータは他のメンバーのPCにも共有される?
共有されない。 Stashは完全にローカル環境(あなたのPC内)限定の機能である。git push を行っても、Stashリストの内容がリモートリポジトリ(GitHubなど)に送信されることはない。他のメンバーと書きかけのコードを共有したい場合は、Stashではなく一時的な「作業用ブランチ(WIPブランチ)」を作ってプッシュする必要がある。
stash pop すると他のブランチでも復元できる?
復元できてしまう。 Stashはブランチに紐づいていないため、ブランチAで git stash したものを、ブランチBに切り替えた状態で git stash pop して復元することが可能である。意図して別ブランチにコードを移植したい場合は便利だが、うっかり間違ったブランチで復元して競合を起こさないよう、実行前に現在のブランチを必ず確認するべきである。
まとめ
- Git Stashは、未コミットの作業中コードを一時的に安全な場所へ退避させる機能である。
- コミット履歴を汚さずに、作業スペースをクリーンにして別ブランチへ切り替えることができる。
- 新規追加ファイル(未追跡ファイル)を退避する場合は
git stash -uを使う。 - Stashはローカル環境専用の機能であり、GitHubなどに共有されることはない。
情報ソース
より詳しくAIに聞いてみよう
- Gitで「git stash」を実行したとき、内部的にはどのような仕組みでデータが保存されているのか、初心者向けに解説してください。
git stash popとgit stash applyの明確な違いと、それぞれのコマンドをどのような場面で使い分けるべきか教えてください。- 新しいファイル(Untracked files)を含めて Stash する方法と、それを忘れてブランチを切り替えたときに発生するエラーの対処法を教えてください。
git stash popをした際に発生したコンフリクト(競合)を、VS Codeのエディタを使って安全に解消する具体的な手順を教えてください。- AIに「Gitの作業を一時退避し、別ブランチの変更を取り込んでから復元する一連の作業」のスクリプトを作成してもらうための指示の出し方を教えてください。