helen's blog

ずっとおもしろいことしてたいな。

stashしてpopして迷走した話

リモートの変更を取り込みたいなと思ったら

$ git pull
Cannot pull with rebase: You have unstaged changes.
Please commit or stash them.

commitかstashして変更を何とかしないとpullできないよ!!って言われました
なので一旦stashして退避

$ git stash # ローカルの変更が退避されたのでpullできる
$ git pull 

# pullしたから退避したのを戻します
$ git stash list
stash@{0}: WIP on develop: 123456 hoge_stash # 要らない
stash@{1}: WIP on develop: 789012 fuga_stash # こいつを戻したい
stash@{2}: WIP on develop: 345678 piyo_stash

$ git stash pop stash@{1} # 特定のstashを戻したい
fatal: ambiguous argument 'stash@1': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

指定の仕方がおかしい模様

結局こうなりました

$ git stash pop stash@\{1\}

エスケープしただけ

ローカルの変更をいい感じに使いたい
# stash popするけどstash listからは削除しない
$ git stash apply stash@{n}

# git stash popは適用して削除される

pullできなくてstashしてローカルが死んで...を繰り返していましたが
git stash save (name) で名前をつけて退避させ
applyで使い回すというセコ技(名前つけてこれを使い回すと明示)

stashするたびにローカルが死んでた問題をこれにて解決
gitignoreはそのうちいじる予定だけど一旦これで放置します

その他stash便利コマンド
# stashされてるファイル一覧
$ git stash show stash@{n} 

# untracking files も含めてstash
$ git stash -u

# unstaged filesも含めてstash
$ git stash -k

# stashの削除
$ git stash drop # 最後のstashを削除
$ git stash drop stash@{n} 

参考
git - stash@{1} is ambiguous? - Stack Overflow
色々な git stash - Qiita