如何删除使用git stash create创建的存储?


548

Git隐藏似乎做了很多我想做的事情,除了编写脚本有点困难,因为如果您没有更改,那么git stash; git stash pop它将做一些与您在存储库中进行更改的操作不同的操作。

看来这git stash create就是问题的答案,并且一切正常,除了一件事……我无法摆脱创建的存储。有什么办法摆脱藏匿处吗?

为了使其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

使用隐藏:

~/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间隔,但我想为其他旅行者指出,在撰写本文时,第二个代码框中的运行未应用补丁-输出中的错误消息告诉您这一点。因此,实际上,您尝试创建一个存储区(该存储区不起作用,请参见下面的注释)应用一个未创建的存储区,然后删除一个未创建的存储区。这就是为什么您什么都没做的原因。
汤姆教授(Tom)

1
@ProfessorTom隐藏已创建,这就是为什么它返回哈希码的原因,以及为什么这样git stash apply做有效。git apply尝试读取本地补丁文件的尝试,该文件不存在。老实说,它可能不应该在那里,而且它永远都不可能奏效。我隐约地想将其从问题中删除,但是鉴于它已经以当前的形式帮助了许多人,我将保持现状。
保罗·瓦格兰

Answers:


367

要删除使用创建的普通存储git stash,您需要git stash dropgit stash drop stash@{n}。请参阅下面的更多细节。


您无需删除使用创建的存储git stash create。从文档:

创建一个存储项(这是一个常规的提交对象)并返回其对象名称,而不将其存储在ref名称空间中的任何位置。旨在对脚本有用。它可能不是您要使用的命令;请参阅上方的“保存”。

由于没有内容引用存储提交,因此最终将收集垃圾。


git stash或创建的存储git stash save可以保存到refs/stash,也可以用删除git stash drop。与所有Git对象一样,直到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

10
@ArtOfWarfare那将是缺乏阅读理解力的原因,因为这显然是对“主题问题”的回应。
克里斯·海斯

1
很公平。我仅使用git stash- 创建隐藏项-不知道它是否实际映射到git stash create其他内容。Git当然是我仍在学习的东西(如果不是,我不会读这样的问答集。)
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

837

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 create存储,则不会为“存储”创建存储条目,因此没有要删除的内容。


好吧,该条目是使用“存储”创建的...在逻辑上,人们会认为将使用“存储”将其删除。
保罗·瓦格兰

2
查看手册页中的git stash。stash create不会创建条目,只会创建stash的提交对象,因此在stash日志中没有要删除的条目。
CB Bailey

3
来自mancreate创建一个存储区(它是一个常规的提交对象)并返回其对象名称,而不将其存储在ref名称空间中的任何位置。
鲁芬2012年

40
注意:您可能不应该丢弃像1、2、3之类的倍数,因为实际上您最终将丢弃最初的数字1、3和5。正确删除1、2和3的方法是:按3、2、1或1、1、1的顺序进行操作。此外,它的索引值为0,堆栈顶部为0。
ArtOfWarfare 2013年

2
当按下“隐藏更改”按钮时,Git Extensions会发出未知命令,并且无论退出或重新启动应用程序,该命令都会持续存在。没有使用GUI清除存储的明显方法,但是从命令行“ git存储列表”显示WIP存储,而“ git存储清除”将其删除。
戴夫

215

如果您100%确保只有一个存储区,或者要删除所有存储区(请git stash list确保为107%,请确保执行以下操作):

git stash clear

..然后忘记它们(它将删除所有存储)。

注意:为那些最终在这里寻找所有方法的人(如我)添加了此答案。


26
如果您只有一个藏匿处,我仍然建议使用git stash drop,因为那样只会丢弃一个藏匿处,并且您不必担心丢失过多的损失。
保罗·瓦格兰

在实际回答问题(无论是否这样做)的最佳实践时,都提出了建议。我实际上需要这个,因为我今天创建的隐藏物需要消失。
Alex McCabe 2014年

2
我已经使用藏匿了很长时间了。但是这次,我无法摆脱仅使用git stash drop常规方法所做的最后一次存储。我不确定我做了什么不同的事情。无论如何,git stash clear为我工作。不知道它的存在。+1
Konstantinos Gaitanis,2015年

3
1,因为混帐被拒绝放弃藏匿,由于藏匿创建的文件之一,现在已经存在..
蒂亚戈Barcala

12
具体来说,确定为107%。
levininja

84

来自git doc:http : //git-scm.com/docs/git-stash

放下[-q |-安静] []

从存储列表中删除单个存储状态。如果没有给出,它将删除最新的。即stash@{0},否则必须是格式为stash @ {}的有效隐藏日志引用。

例:

git stash drop stash@{5}

这将删除存储项5。要查看所有存储项列表,请执行以下操作:

git stash list

4
除了我在问题的底部明确指出git stash drop不能满足我的要求。
保罗·瓦格兰

1
我建议git stash show stash@{REPLACE_IT_WITH_STASH_INDEX}在执行之前使用-检查隐藏内容git stash drop。相信我,它将节省很多麻烦:)
realPK

71

您应该使用

git stash save

并不是

git stash create

因为这会创建一个存储区(这是一个常规的提交对象)并返回其对象名称,而不将其存储在ref名称空间中的任何位置。因此将无法使用隐藏应用程序访问。

使用git stash save "some comment"时,你有不分阶段的变化,你想复制/移动到另一个分支用于

git stash apply stash@{0}当您希望已保存(存放)的更改反映在当前分支上时,请使用(假设已保存的存放索引为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"
Tino

2

也可以

git stash drop <index>

喜欢

git stash drop 5

1

该文件在这里(中文),请单击。

您可以使用

git存储列表

git stash drop stash @ {0}

在此处输入图片说明


git stash create与有所不同git 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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.