不太确定发生了什么,但是git stash似乎处于一个不好的地方。
% 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
过去我曾经使用过git stash,但并没有遇到过这种情况。我最近重写了历史记录,以便在发布到github之前从历史记录中删除文件。我跑的命令是
git filter-branch --force --index-filter \
'git rm --cached --ignore-unmatch FILENAME' \
--prune-empty --tag-name-filter cat -- --all
有关如何修复藏匿的想法吗?
答案 0 :(得分:23)
我认为filter-branch
打破了你的藏匿处。如果git stash
的参数与stash bag不够相符,则会得到not a stash reference
投诉。
请注意git show stashref
使用普通的旧git show
,它不要求作为参数提供的提交类似于存储。如果git stash show
以与其他git stash
命令相同的方式失败,或者如果对有问题的存储的人工检查表明它不再是两个或三个父合并提交,那么这实际上是情况下。
--prune-empty
很可能在这里做到了。如果您在存储时没有add
任何内容,则索引提交将为空。一般来说,避免过滤隐藏引用可能更明智。
您可以尝试两种不同的方法:
refs/original/
(其中filter-branch
离开他们)和/或reflogs恢复原始存储SHA-1;使用它们来重建refs/stash
和/或隐藏的reflog,或直接使用它们然后破坏stash ref及其reflog。git show
命令获取补丁。(有关藏匿袋和藏匿袋的更多信息,包括与--all
或--untracked
一起使用的三父形式,请参阅How to recover from “git stash save --all”?。)
假设您已收回内容并希望完全删除stash
引用,则可以执行此操作。请注意,这是"nuke it from orbit"选项 - 在您确定准备就绪之前不要这样做:
git update-ref -d refs/stash
答案 1 :(得分:5)
您不必将所有的藏匿处都记录下来。您可以使用git reflog
手动删除损坏的那些。在你的情况下:
git reflog delete --rewrite stash@{1}
git reflog delete --rewrite stash@{0}
(我在这里以相反的顺序放置这些,因为每次删除都会减少以下条目的编号。实际上,不要费心去做数学,只需在每次删除后执行git stash list
以获得更新的列表,选择另一个剩余的破碎条目。)
答案 2 :(得分: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}
```