作業中の内容をコミットせずに変更を一旦退避したい、そんな場合に便利なgit stashの利用方法まとめです。
変更の退避
# とりあえず退避
$ git stash
# コメントをつけて退避
$ git stash save "コメント"
ステージングされたもの(Changes to be committed)と変更のあるファイル(Changes not staged for commit)が退避されます。
Untracked files は退避されません。
ちょっと別ブランチの作業してすぐ戻って来る、という場合でなければ簡単なコメントだけでもつけておく方が無難です。
$ git stash -u
Untracked files を含めた全てを退避します。
$ git stash -uk
ステージング(git add)したものだけ残り、stagingしていないファイルを全て退避します。
任意のファイルをstashする
上記を踏まえて、任意のファイルだけをstashする場合は下記のようにできます。
$ git add .
$ git reset (任意のファイルやディレクトリ) // 複数あればすべてresetしておく
$ git stash -uk
いずれの場合でも、退避したあとは想定通りに退避できているか git status を確認することをオススメします。
stashしたリストを確認
$ git stash list
stash@{0}: WIP on feature/11111-xxxxx: 4ad253e718 SQLインジェクション対策 #12345
stash@{1}: On enhancement/22222-xxxxx: セッション改善
stashの一覧を表示します。
stashがなければ何も出ません。
後述のpopなどをした際に引数を省略すると一番上のstash@{0}が自動的に選ばれます。
stashした内容を戻す
※直前のstashをpopする場合以外は基本的に一度listを確認しましょう。
$ git stash pop
or
$ git stash pop stash@{0}
stashした内容を戻して一覧から消します。コンフリクトなどがあった場合は消えません。
引数を省略した場合は直近のstashの内容に対して実行されます。
引数はgit stash listで表示されたものなので、stashやpopをするたびに数字はズレていきます。
一覧から消さずにstashした内容を適用したいなら下記です。
$ git stash apply
or
$ git stash apply stash@{0}
stashした内容を消す
stashした内容を適用せずにそのまま削除します。
$ git stash drop
or
$ git stash drop stash@{0}