ブランチ作業中に他のブランチでの作業が発生したとき、現在の作業内容を一時的に退避したい場合にgit stash
を利用します。git commit
だと間違えてプッシュしてしまった時のリカバリが大変なので作業途中の退避はgit stash
を使うようにしましょう。
変更を退避する
$ git stash
新規ファイルも退避する場合は-u
オプションをつけます。
$ git stash -u
ワーキングツリー(not staged
)の変更だけを退避する場合は-k
オプションをつけます。
$ git stash -k
メッセージの指定もできます。
$ git stash save "<メッセージ>"
// メッセージは日本語も入力可能
// git stash save "〇〇機能の登録処理のみ実装"
スタッシュ一覧を確認する
$ git stash list
stash@{0}: ...
stash@{1}: ...
スタッシュの内容を確認する
$ git stash show stash@{0}
// @{0}だけでもスタッシュの指定が可能です。
$ git stash show @{0}
// スタッシュの指定を省略すると最新のスタッシュを対象とします。
$ git stash show
スタッシュの指定はstash@{0}
でも@{0}
だけでもどちらでも大丈夫です。
また、最新のスタッシュを対象とする場合はstash@{0}
の省略が可能です。
この仕様は以降で紹介するコマンドでも同様なので覚えておくと便利です。
スタッシュを作業ブランチに戻す(リストから削除する場合)
$ git stash pop stash@{0}
// @{0}だけでもスタッシュの指定が可能です。
$ git stash pop @{0}
// スタッシュの指定を省略すると最新のスタッシュを対象とします。
$ git stash pop
なお、スタッシュを作業ブランチに戻すとインデックスの変更もワーキングツリーに戻ります。
(staged
からnot staged
の状態になります)
インデックスの変更を戻したくない場合は--index
オプションをつけます。
$ git stash pop stash@{0} --index
スタッシュを作業ブランチに戻す(リストに残す場合)
$ git stash apply stash@{0}
// @{0}だけでもスタッシュの指定が可能です。
$ git stash apply @{0}
// スタッシュの指定を省略すると最新のスタッシュを対象とします。
$ git stash apply
インデックスの変更を戻したくない場合はgit stash pop
と同じように--index
オプションをつけます。
$ git stash apply stash@{0} --index
スタッシュを削除する
$ git stash drop stash@{0}
// @{0}だけでもスタッシュの指定が可能です。
$ git stash drop @{0}
// スタッシュの指定を省略すると最新のスタッシュを対象とします。
$ git stash drop
スタッシュを全削除したい場合はdrop
ではなくclear
を使います。
$ git stash clear
スタッシュを復元して新しいブランチを作成する
$ git stash branch <ブランチ名>