背景
プルリクを出している最中に別の作業をしていたり、コミットしたくないけどとりあえずどこかに保存させておきたい場合に使えるstashを使うと便利なのを紹介したい
覚えて欲しいコマンドと効果
git stash -u # untracked file を含めて退避する
git stash list # 一覧表示をする
git stash pop # 最後のshashを退避から取り出し、対比場所から削除する
使ってみた
ブランチの準備
git switch -c branch_a
test_a.mdを作成後、以下のようにファイルを保存する。
# aでの作業
branch_aで作業しました
stashをする
git stash -u
# Saved working directory and index state WIP on branch_a: xxxxxx add workspace setting
これでworkspaceの変更分がstash領域に保存される。
ちなみにstashの一覧を確認するコマンドはこれ。
git stash list
続いて別のブランチに移動
git switch main # mainブランチに移動して
git switch -c branch_b # branch_b ブランチを切る
test_b.mdを作成後、以下のようにファイルを保存する。
# bでの作業
branch_bで作業しました
branch_bでの作業をコミットする
git add .
git commit -m "add test_b.md"
branch_aに切り替えて、退避した変更を戻す
git switch branch_a
git stash pop
すると退避させた変更がworkspaceに戻ってくる。
これを実行するとstashの一覧からは消えるので、git stash list
をしたらbranch_aのstashは削除される。
補足
stashにメモを残す
stashするだけだと最後のコミットのメッセージが表示されるが、任意のメモを残すこともできる。
コマンドは以下。
git stash save "任意のメッセージ" -u
listを確認すると
stash@{0}: On main: 任意のメッセージ
のようにstash@{ID}: ブランチ: "メッセージ"
と表示される。
退避した変更を戻すコマンドについて
退避した変更を戻す方法はもう一つあり
git stash apply stash{0}
でも可能。
applyとpopの差は
- apply: 退避した差分をworkspaceに戻してもstashした内容を削除しない
- pop: 退避した差分をworkspaceに戻してもstashした内容を削除する
個人的なおすすめとしてはapplyは使わないようにして、popを使うこと。
理由としては
- 削除するの忘れて大量のstashがあるとわからなくなる
- 複数の作業を並列するとはいえ1人で3つ以上の作業が同時に走らせることはあまりない
という感じで、最近は 覚えて欲しいコマンドと効果の3つだけで事足りるようにしている。
複数のstashがある時のpopの挙動について
pop は引数に名前を指定せずに使用可能で、複数のstashがある場合は最後にstashした内容がworkspaceに反映される。
つまり
$ git stash list
stash{0} ... # 後のstash
stash{1} ... # 先のstash
とある時に git stash pop
を実行すると stash{0}がworkspaceに反映される。