git stash createで作成されたstashを削除する方法は?


549

Git stashは、スクリプトを書くのが少し難しいことを除いて、私が望むことの多くを実行しているように見えgit stash; git stash popます。

それがそのgit stash create問題への答えであるように見え、1つを除いてすべてが機能します...作成されたスタッシュを取り除くことができません。隠し場所を取り除く方法はありますか?

私がやっていることを100%明確にするために:

スタッシュを作成します。

~/tmp/a(master) $ git stash create 
60629375d0eb12348f9d31933dd348ad0f038435
~/tmp/a(master) $ git st
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   new file:   b
#
~/tmp/a(master) $ git reset --hard
HEAD is now at 555d572 log message

stashを使用します。

~/tmp/a(master) $ git apply 60629375d0eb12348f9d31933dd348ad0f038435
fatal: can't open patch '60629375d0eb12348f9d31933dd348ad0f038435': No such file or directory
~/tmp/a(master) $ git stash apply 60629375d0eb12348f9d31933dd348ad0f038435
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   new file:   b
#

隠し場所を削除します(この最後のビットが機能しない場合を除く)。

~/tmp/a(master) $ git stash drop !$
git stash drop 60629375d0eb12348f9d31933dd348ad0f038435
'60629375d0eb12348f9d31933dd348ad0f038435' is not a stash reference

時間の経過にもかかわらず、git applyこの記事を書いている時点での2番目のコードボックスでの実行ではパッチが適用されなかったことを他の旅行者に指摘したいと思います。出力のエラーメッセージはこれを示しています。したがって、実際には、スタッシュを作成しようとしましたが(機能しませんでした。以下のコメントを参照)、作成されなかったスタッシュを適用してから、作成されなかったスタッシュをドロップしました。これが、あなたが何もしなかった理由です。
Tom

1
@ProfessorTomスタッシュが作成されました。それがハッシュコードを返した理由と、機能した理由git stash applyです。git apply存在しないローカルパッチファイルを読み込むしようとする試み。正直に言うと、それはおそらくそこにあるべきではなく、うまくいかなかったでしょう。私は漠然とそれを質問から削除したくなりますが、それが現在の形で多くの人を助けてきたので、私はそのままにしておきます。
Paul Wagland

回答:


369

で作成した通常のスタッシュを削除するにはgit stash、あなたがしたいですgit stash dropgit stash drop stash@{n}。詳細については、以下を参照してください。


で作成されたスタッシュを削除する必要はありませんgit stash create。ドキュメントから:

stashエントリ(通常のコミットオブジェクト)を作成し、ref名前空間のどこにも保存せずにオブジェクト名を返します。これはスクリプトで役立つことを意図しています。おそらく、使用したいコマンドではありません。上記の「保存」を参照してください。

stashコミットは参照されないため、最終的にはガベージコレクションが行われます。


git stashまたはgit stash saveで作成されたスタッシュはに保存されrefs/stash、で削除できますgit stash drop。すべてのGitオブジェクトと同様に、実際のstashの内容は、gcそれらのオブジェクトが期限切れになった後(デフォルトは2週間後)に整理されるまで、コンピューターから削除されません。

古いスタッシュはrefs/stash reflog(try cat .git/logs/refs/stash)に保存されgit stash drop stash@{n}、で削除できます。ここnで、はで示される番号git stash listです。


20
それは定評のある質問には答えません。その結果、Googleを介して質問にアクセスし、定型的な質問への回答を検索し、実際の詳細を特に気にしない私のような人々は、実際に回答した人に投票します。また、受け入れられた回答は役に立たないため、誤って反対票を投じる人もいます。私は個人的に私を助けた答えを賛成しました。
ArtOfWarfare 2013

15
つまり、1)Googleの「git delete stash」2)質問タイトルの前半に基づいてSOリンクをクリックします3)タイトルの後半に固有の正解に反対票を投じます。それは新しいものです。
dahlbyk 2013

10
@ArtOfWarfareこれは、読解力の欠如となるでしょう。これは、「定型的な質問」への明確な回答であるためです。
クリスヘイズ

1
けっこうだ。私はスタッシュを単に使用して作成しますgit stash-それが実際にgit stash create何か他のものにマップするかどうかはわかりません Gitは確かに私がまだ学んでいることです(そうでなければ、私はSO Q&Aをこのように読んでいませんでした。)
ArtOfWarfare 2013

1
@AdrianPronkこれはまさに私が実際に使用することをお勧めする種類のものgit stash createです。タイムスタンプ付きのパッチファイルに保存するのではなく、git reflogにカスタムリファレンス(例:)に保存させますrefs/backup。1)git stash create、2)新しいスタッシュのツリーをrefs/backup^{tree}、3)ツリーが異なる場合はと比較してみてくださいgit update-ref --create-reflog refs/backup <stash-sha>。最終的に古いバックアップスタッシュは自動的に整理されます。
dahlbyk 2016年

838

git stash drop: -トップスタッシュをドロップ-かのように見えるスタッシュ参照なしパラメータ負いませんstash@{n}どのn指名ドロップしたスタッシュを。にコミットIDを渡すことはできませんgit stash drop

git stash drop            # drop top hash, stash@{0}
git stash drop stash@{n}  # drop specific stash - see git stash list

スタッシュをドロップすると、スタックのさらに下にあるすべてのスタッシュの指定が変更stash@{n}されます。

stashを使用stash createする場合、stashエントリが「stash」用に作成されていないため、ドロップするものがないため、なぜstashをドロップする必要があると思うのかわかりません。


まあ、エントリは「stash」を使用して作成されます…「stash」を使用して削除されると論理的に考える人もいます。
ポールワグランド

2
git stashのmanページを見てください。stash createはエントリを作成せず、stashのコミットオブジェクトのみを作成するため、削除するstashログにエントリはありません。
CBベイリー

3
From mancreate stash(通常のコミットオブジェクト)を作成し、ref名前空間のどこにも保存せずにオブジェクト名を返します。
ruffin

40
注意:実際には1、2、3をドロップすることはできません。1、2、3をドロップする正しい方法は、 3、2、1、または1、1、1の順序でそれらを実行します。また、0がスタックの一番上にあり、0のインデックスが付けられています。
ArtOfWarfare 2013

2
Git Extensionsは、「Stash Changes」ボタンが押されたときに不明なコマンドを発行し、アプリケーションが終了して再起動しても何もしません。GUIを使用してstashを削除する明確な方法はありませんが、コマンドラインから「git stash list」はWIP stashを表示し、「git stash clear」はそれを削除します。
Dave

215

stashが1つしかないことを100%確信している場合、またはすべての stash を削除したい場合(a git stash listを107%確実にする)、次のことができます。

git stash clear

..そして、それらについて忘れます(すべての隠し場所を削除します)。

注:すべてをクリアする方法を探してここにたどり着いた人(このような)にこの回答を追加しました。


26
スタッシュが1つしかない場合でも、スタッシュが1つgit stash dropだけ減少するので、を使用することをお勧めします。予想以上に失うことを心配する必要はありません。
Paul Wagland 2014

それがベストプラクティスであるかどうかにかかわらず、質問に実際に回答するので賛成です。私が実際にこれを必要としているのは、今日作成した隠し場所をなくす必要があるためです。
Alex McCabe 2014年

2
stashを長い間使用しています。しかし今回はgit stash dropいつものように使うだけで最後に作った隠し場所を取り除くことができませんでした。私が何を別の方法で行ったかはわかりません。とにかく、git stash clear私のために働いた。それが存在することを知りませんでした。+1
Konstantinos Gaitanis

3
1スタッシュで作成されたファイルの1がすでに存在していた今ので、Gitは..スタッシュをドロップすることを拒否したため
チアゴコマルカ・ダ・バルカーラ

12
具体的には、107%確実です。
levininja 2017年

84

git docから:http : //git-scm.com/docs/git-stash

ドロップ[-q | --quiet] []

stashリストから単一のstash状態を削除します。noを指定すると、最新のものを削除します。つまりstash@{0}、それ以外の場合は、stash @ {}形式の有効なstashログ参照である必要があります。

例:

git stash drop stash@{5}

これにより、スタッシュエントリ5が削除されます。スタッシュのすべてのリストを表示するには、次のようにします。

git stash list

4
質問の最後で、git stash dropは私が望んでいることをしないと明示的に言っていることを除いて。
Paul Wagland 2015

1
git stash show stash@{REPLACE_IT_WITH_STASH_INDEX}実行する前に-を使用してスタッシュの内容を確認することをお勧めしますgit stash drop。私を信じて、それは多くのトラブルを救うでしょう:)
realPK

71

あなたは使うべきです

git stash save

ではなく

git stash create

これはstash(通常のコミットオブジェクト)を作成し、ref名前空間のどこにも保存せずにオブジェクト名を返すためです。したがって、stashの適用ではアクセスできません。

使用はgit stash save "some comment"あなたが別のブランチの上にあなたがしたいの複製/移動unstaged変更を持っているときに使用されます

git stash apply stash@{0}保存された(隠された)変更を現在のブランチに反映させる場合は、(保存されたstashインデックスが0であると想定して)を使用します

あなたはいつもあなたがgit stash listすべてのあなたの隠しインデックスをチェックするために使うことができます

そして、使用git stash drop stash@{0}(保存したスタッシュインデックス仮定は0であり、あなたはそれを削除したい)特定のスタッシュを削除します。


3
参考git stashまでにgit stash save
RBT

1
git stash createスクリプトで使用するためのものです。それがOPのユースケースです。したがって、推奨git stash saveは「通常の」使用には役立ちますが、OPの使用例には役立ちません。OPはドキュメントを確認したい場合があります。たとえば、スクリプトに関連するコマンドが他にもあるgit stash store
Adrian W

1
git stash save "message"今日は読むべきgit stash push -m "message"です。比較git commit -m "message"
ティノ


1

資料はこちら(中国語)をクリックしてください。

あなたは使うことができます

git stashリスト

git stash drop stash @ {0}

ここに画像の説明を入力してください


git stash creategit stash save特にとは異なり、作成フォームはリストに表示されず、ドロップできないため、質問です。
Paul Wagland

@PaulWagland返信に感謝し、回答を提供します。正直なところ、公式ドキュメントに「git stash create」はありません。しかし、これについては、私が興味を持っています。「git stash list」で「git stash create」を見つけたい場合は、上記でこれを行うことができます。
Longalei

0
git stash           // create stash,
git stash push -m "message" // create stash with msg,
git stash apply         // to apply stash,
git stash apply indexno // to apply  specific stash, 
git stash list          //list stash,
git stash drop indexno      //to delete stash,
git stash pop indexno,
stash pop = stash drop + stash apply
git stash clear         //clear all your local stashed code
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.