LoginSignup
6
1

More than 1 year has passed since last update.

作業中の変更を一時退避させる git stash ハンズオン

Last updated at Posted at 2022-12-06

背景

プルリクを出している最中に別の作業をしていたり、コミットしたくないけどとりあえずどこかに保存させておきたい場合に使えるstashを使うと便利なのを紹介したい

覚えて欲しいコマンドと効果

git stash -u # untracked file を含めて退避する

git stash list # 一覧表示をする

git stash pop # 最後のshashを退避から取り出し、対比場所から削除する

使ってみた

ブランチの準備

git switch -c branch_a

test_a.mdを作成後、以下のようにファイルを保存する。

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を作成後、以下のようにファイルを保存する。

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に反映される。

6
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
1