何が起こったのかよくわかりませんが、gitstashは悪い場所にあるようです。
% git stash list
stash@{0}: filter-branch: rewrite
stash@{1}: filter-branch: rewrite
stash@{2}: On mysolr: start mysolr stuff
大丈夫です、そしてgit show stash@{0}
正常に動作します。だが:
% git stash drop
'' is not a stash reference
% git stash pop
'' is not a stash reference
% git stash drop stash@{0}
'stash@{0}' is not a stash reference
私は過去にgitstashをたくさん使用しましたが、これに遭遇することはありません。最近、履歴を書き直して、githubに公開する前に履歴からファイルを削除しました。私が実行したコマンドは
git filter-branch --force --index-filter \
'git rm --cached --ignore-unmatch FILENAME' \
--Prune-empty --tag-name-filter cat -- --all
隠し場所を修正する方法はありますか?
filter-branch
があなたの隠し場所を壊したと思います。 git stash
への引数が スタッシュバッグ に十分に似ていない場合は、not a stash reference
の苦情があります。
git show stashref
はプレーンな古いgit show
を使用していることに注意してください。これは、引数として指定されたコミットが隠し場所に似ている必要はありません。 git stash show
が他のgit stash
コマンドと同じように失敗した場合、または問題の隠し場所を手動で調べた結果、2親または3親のマージコミットではなくなったことが示された場合、これは実際には場合。
ここでそれを行ったのはおそらく--Prune-empty
でした。スタッシュの時点で何もadd
していない場合、インデックスのコミットは空になります。一般に、スタッシュ参照のフィルタリングを避ける方がおそらく賢明です。
2つの異なるアプローチを試すことができます。
refs/original/
(filter-branch
が残した場所)および/またはreflogから回復します。それらを使用してrefs/stash
および/またはstashreflogを再構築するか、それらを直接使用してからstashrefとそのreflogを上書きします。git show
コマンドを使用してパッチを取得できます。(--all
または--untracked
で使用される3つの親フォームを含む、スタッシュバッグとスタッシュバッグの詳細については、 「gitstashsave-から回復する方法」を参照してください。 -すべて」? )
コンテンツを取り戻し、stash
参照を完全に消去したい場合は、これで問題ありません。これは "nuke it from orbit" オプションであることに注意してください。準備ができていることを確認するまでは実行しないでください。
git update-ref -d refs/stash
すべての隠し場所を破壊する必要はありません。 git reflog
を使用して、壊れたものだけを手動で削除できます。あなたの場合:
git reflog delete --rewrite stash@{1}
git reflog delete --rewrite stash@{0}
(ここでは、削除するたびに次のエントリの番号が減るので、これらを逆の順序で並べます。実際には、精神的に計算する必要はありません。削除するたびにgit stash list
を実行して、更新されたリストを取得し、残りのリストを選択してください。それから壊れたエントリ。)
上記のすべての答えは私には機能しません、以下のコマンドは機能します、それはあなたが望む1つの隠し場所を削除することができます。私はそれがあなたのために働くことを願っています。
```
git stash list
//--- apply target stash
git stash apply refs/stash@{n}
//---- delete target stash
git stash drop --index n
// or
git stash drop refs/stash@{n}
```