git stash で、作業中の変更をいったん横に退けておく
git には、作業途中の変更をいったん横に退けておける git stash という便利な機能があります。この git stash 機能について、コマンドラインと SourceTree での操作方法を紹介します。
どんなときに便利なの
1. 割り込み作業が発生したとき
なにかの作業中、急ぎで別のブランチを操作したり、サーバから pull しなきゃいけない割り込み作業が発生したりします。やりかけている変更がコミットできる状態なら、コミットしてブランチ移動なり pull なりすれば良いのですが、
- まだ中途半端な状態なので、コミットはしたくない。
- でも今の修正内容は捨てたくない。一時的に取っておいて、あとで戻してきたい。
そんなときに git stagh が便利です。git stash を使えば、
- 途中状態の変更を、stash 機能で横に退ける
- 作業ディレクトリは、きれいな(変更のない)状態になる
- ブランチ移動なり pull なり、割り込み作業をすませる
- (1) で退けておいた変更を元に戻してくる
こんな手順で、途中状態の変更をコミットせずに、割り込み作業を行えます。
2. ブランチを間違えて作業開始してしまったとき
ほんとは feature
ブランチで作業しないといけないのに、間違って master
ブランチで変更を行ってしまった! まだコミットはしていないものの、いろいろ変更してしまったのでこの作業はどうしたらいいものか……
という時にも使えます。
- 途中の変更を、stash 機能で横に避ける
- ブランチを本来のコミット先の
feature
に移動する - (1) で避けておいた変更を戻してくる (
feature
ブランチに適用する)
これで無事にリカバリ完了です。stash 機能は、変更の差分だけを退避してくれるので、内容を別のブランチに適用することができます。
つかいかた
コマンドラインから使う
コマンドラインだとこんな感じです。コミット前の変更がある状態で以下を入力すると、
git stash
コミット前の変更内容が、stashコマンドによって一時的に退避されます。
退避されていることを確認するには、
git stash list
これで退避されている内容がリスト表示されます。
退避した内容を元に戻してきたいときは、以下のどちらかのコマンドを使います。(退避した情報を消すか残すか、の違いです)
# 最新の退避内容を復元し、退避したデータは消す
git stash pop
# 最新の退避内容を復元し、退避したデータを残す
git stash apply
SourceTree から使う
ツールバーに「スタッシュ」ボタンがありますので、それを押すだけの簡単操作です。
退避内容はサイドバーの「一時退避」から確認できます。
復元するにはサイドバーの項目の右クリックメニューもしくはダブルクリックで。
新規ファイルも退避したいときは
git stash
コマンドは、デフォルトでは git 管理しているファイルのみが退避されます。新規に追加したコミット前のファイルがあっても、それは stash の対象になりません。
コマンドラインでは、-u
オプションをつけることで新規ファイルも stash の対象にできます。
git stash -u
SourceTree では、新規ファイルをいったん Index にステージした状態にして「スタッシュ」ボタンを押すことで、stash 可能となります。