如何删除使用git stash create创建的暂存内容?

957
Git stash似乎可以完成我想要的大部分功能,但是它有点难以脚本化,因为如果你没有更改,那么“git stash; git stash pop”将与你在仓库中进行更改时做一些不同的事情。
看起来“git stash create”就是解决这个问题的答案,而且一切都很顺利,除了一个问题...我无法摆脱创建的stash。有没有办法摆脱stash?
为了让我的操作100%清晰明了:
创建stash:
~/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 没有应用补丁——输出中的错误消息告诉了你这一点。因此,实际上,你试图创建一个存储(但未成功,详见下面的评论),应用一个未创建的存储,然后放弃一个未创建的存储。这就是为什么你所做的一切都没有起作用的原因。 - Professor Tom
1
@ProfessorTom,存储区已创建,这就是为什么它返回哈希码以及为什么git stash apply有效的原因。git apply尝试读取本地补丁文件,但该文件不存在。说实话,它可能根本不应该存在,也永远无法工作。我有点想把它从问题中删除,但考虑到它以当前形式帮助了很多人,我将保持原样。 - Paul Wagland
13个回答

1324

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 的 man 页面。stash create 不会创建一个条目,只会为 stash 创建提交对象,因此在 stash 日志中没有条目可供删除。 - CB Bailey
3
创建:创建一个存储在 ref 命名空间中任何位置都不会存储的暂存区(它是一个普通的提交对象),并返回其对象名称。 - ruffin
81
注意:你可能不应该连续删除像1、2、3这样的数字,因为实际上你将会删除原来的1、3和5。正确的方法是按照3、2、1的顺序进行删除,或者使用1、1、1的顺序。此外,栈是从0开始索引的,0位于堆栈顶部。 - ArtOfWarfare
2
当按下“Stash Changes”按钮时,Git Extensions会发出未知命令,并且无论退出并重新启动应用程序,它所做的都会持续存在。在GUI中没有明显的方法可以摆脱stash,但是从命令行中,“git stash list”显示WIP stash,“git stash clear”将其清除。 - Dave
4
如果您正在PowerShell中执行此操作,请确保将stash@{n}用单引号括起来,否则会出现错误。 - Brian Surowiec
显示剩余3条评论

611

如果要删除使用 git stash 创建的普通存储区(stash),您可以使用 git stash dropgit stash drop stash@{n} 命令。详见下文。


不需要删除使用 git stash create 创建的存储区(stash)。根据文档:

创建一个存储区条目(它是一个常规提交对象)并返回其对象名称,而无需在 ref 命名空间中存储它。这旨在对脚本有用。它可能不是您想使用的命令;请参阅上面的“save”。

由于没有任何引用指向该存储区提交对象,因此它最终将被垃圾回收机制清理掉。


使用 git stashgit stash save 创建的存储区会保存到 refs/stash 中,并且可以使用 git stash drop 删除。与所有 Git 对象一样,在这些对象过期后(默认为 2 周后)进行 gc 清理之前,实际的存储区内容不会从计算机中删除。

较旧的存储区保存在 refs/stashreflog 中(尝试运行 cat .git/logs/refs/stash),可以使用 git stash drop stash@{n} 命令进行删除,其中的 n 是由 git stash list 显示的数字。


25
这篇文章没有回答标题中的问题。因此,像我这样通过谷歌搜索标题问题的答案并且不特别关心实际细节的人们,会给真正回答问题的人投赞成票。有些人也会因为得不到帮助而恶意地给被认可的答案投反对票。我个人只是给帮助了我回答的人点了赞。 - ArtOfWarfare
17
所以:1)搜索“git delete stash” 2)根据问题标题的前半部分单击SO链接 3)向下投票第二个标题特定的正确答案。这是一个新的做法。 - dahlbyk
13
那就需要进行翻译了:@ArtOfWarfare 如果这样理解有困难的话,那可能是阅读能力不足,因为这很明显是回答“标题问题”的。 - Chris Hayes
1
好的,我只使用 git stash 来创建我的存储区,我不知道它实际上是否对应于 git stash create 或其他什么。Git 绝对是我仍在学习的东西(如果不是的话,我就不会阅读像这样的 SO 问答了)。 - ArtOfWarfare
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
显示剩余3条评论

271

如果您百分之百确定只有一个藏匿点,或者您想要删除所有的藏匿点(请先执行git stash list指令确认),可以执行以下操作:

git stash clear

忘记这些储藏(它会删除所有的储藏)。

注意:为了那些像我一样想要清除所有储藏的人,我添加了这个答案。


33
如果你只有一个存储堆栈,我仍然建议使用 git stash drop,因为它只丢弃一个存储堆栈,你不必担心会丢失更多的。 - Paul Wagland
1
因为它确实回答了这个问题,不管是否最好的做法,所以我给它点赞。我实际上需要这个,因为我今天创建的藏匿需要被删除。 - Alex McCabe
3
我长期以来一直在使用stash。但这次我无法像平常那样使用git stash drop来清除上一个stash。我不确定我做了什么不同的事情。不过,git stash clear对我有效。我不知道它的存在。+1 - Konstantinos Gaitanis
3
+1 是因为 Git 拒绝丢弃储藏,由于储藏创建的其中一个文件已经存在。 - Thiago Barcala

87

来自Git文档:http://git-scm.com/docs/git-stash

drop [-q|--quiet] <stash>

从存储列表中移除单个暂存状态。如果未指定<stash>,则会删除最新的暂存状态,即stash@{0}。否则,<stash>必须是stash@{}形式的有效暂存日志引用。

例如:

git stash drop stash@{5}

这将删除贮藏的入口5。要查看所有贮藏的列表:

git stash list

4
除了我在问题底部明确说明git stash drop不能满足我的需求。 - Paul Wagland
1
我建议在执行 git stash drop 命令之前,使用 git stash show stash@{REPLACE_IT_WITH_STASH_INDEX} 命令来检查暂存区的内容。相信我,这会避免很多麻烦 :) - realPK

73

你应该使用

git stash save
并且不是
git stash create
因为这会创建一个stash(它是一个常规的提交对象)并返回其对象名称,而不将其存储在ref命名空间中。因此,将无法使用stash apply访问它。
当您有未暂存的更改想要复制/移动到另一个分支时,请使用git stash save "一些注释"。
当您想要在当前分支上反映已保存(藏匿)的更改时,请使用git stash apply stash@{0}(假设您保存的stash索引为0)。
您始终可以使用git stash list来检查所有存储的stash索引。
并使用git stash drop stash@{0}(假设您保存的stash索引为0且想要删除它)来删除特定的stash。

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" nowadays should read git stash push -m "message". Compare git commit -m "message" - Tino

49

处理stash的最佳方式是首先检查stash列表。

git stash list

然后确定是否存在你关心的隐藏物,然后再行动。

git stash drop

它会逐个删除存储(从顶部开始)

git stash drop <index>

它将删除特定索引5的存储

但如果您确定不需要列表中的任何内容,那就执行此操作

git stash clear

它将删除所有它们。


47

删除一个保存的进度 git stash drop

删除所有保存的进度 git stash clear

显示你的保存进度 git stash show

移除特定的保存进度 git stash drop 索引号,例如git stash drop 4


删除会丢弃最近的存储吗? - seralouk
git stash drop 将会移除栈中最近的储藏。 - Vinicius Cardoso

37
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,
git stash pop = stash drop + stash apply
git stash clear         //clear all your local stashed code

6

它也能正常工作。

git stash drop <index>

喜欢

git stash drop 5

6

对于想要在 VS Code 中通过 UI 操作存储区的用户,请使用以下方法:

  1. 确保您已经安装了GitLens扩展。
  2. 进入源代码管理选项卡(Source Control)。
  3. 检查“STASHES”部分。您将找到所有的存储区(与 git stash list 相同)。
  4. 针对每个存储区,您会找到直接的应用存储区(Apply Stash)与HEAD比较(Compare with HEAD)删除存储区(Delete Stash)按钮。

图片描述

  1. 要放弃特定的存储区,请单击“删除存储区”按钮并确认删除它。

图片描述


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接