如何在Git 1.8.3中弹出特定的stash?

534

我刚刚升级了Git,现在使用的是1.8.3版本。

今天早上我尝试从堆栈中取出一次改动。

我输入了git stash pop stash@{1},然后收到了以下错误提示:

fatal: ambiguous argument 'stash@1': unknown revision or path not in the working tree. Use '--' to separate paths from revisions, like this: 'git [...] -- [...]'

我已经尝试了20多种不同的方法,包括将pop替换为apply,但都没有成功。这是什么问题?还有其他人遇到过吗?


2
你尝试转义 {} 吗? - AlexDev
52
从 Git 2.11 (Q4 2016) 开始,你现在可以使用 git stash pop 1 命令:参见下面我的回答 - VonC
10个回答

716
git stash apply n

适用于git版本2.11及以上

原始答案,可能有助于调试旧语法中涉及shell转义的问题:

正如之前指出的,花括号可能需要在您的操作系统、shell等方面进行转义或引用。

请参见“stash@{1} is ambiguous?”以获取一些详细提示,了解可能出现的问题以及如何在各种shell和平台上解决它们。

git stash list
git stash apply stash@{n}

git stash apply version


44
我对这个回答唯一的问题是,问题要求如何pop一个特定的stash,而这个命令是apply一个stash而不是将其弹出。区别在于,弹出既将stash应用于代码,又删除stash本身。 - Grant Humphries
对我不起作用。 出现错误“未知选项:-encodedCommand”。 - Yuvraj Patil
21
自从版本2.11之后,您可以输入以下命令:git stash apply n - Dwhitz
请更新您的答案,现在应该是 git stash apply n - Hafiz Temuri
1
另外,您可以输入 git stash pop '<stash-ref>',其中stash-ref类似于 stash{0}。不要忘记引号。 - A G
这对于像 git stash show 1 这样的命令也适用,它将使用存储栈中的第二个项目执行 git stash show - FreelanceConsultant

235

你需要转义大括号:

git stash pop stash@\{1\}

20
"git stash pop "stash@{1}"":取出存储在“stash@{1}”中的信息 - Harold Castillo

152

如果您想确保不必处理语法stash@{x}中的引号,请使用Git 2.11(2016年第四季度)。

请参见提交记录a56c8f5(由Aaron M Watson (watsona4)在2016年10月24日提交)。
(由Junio C Hamano -- gitster --提交记录9fa1f90于2016年10月31日合并)

stash:仅允许使用索引引用暂存区

可以通过简单地引用"n"而不是显式地引用"stash@{n}"来引用暂存区。
大多数用户只按照暂存区堆栈中的位置(我在这里称之为“索引”)引用暂存区。

典型暂存区的语法(stash@{n})略显烦人,容易被忘记,有时在脚本中难以正确转义

因此,通过简单地引用索引来处理暂存区是可取的。

所以:

git stash drop 1
git stash pop 1
git stash apply 1
git stash show 1

11
谢谢!对于任何在2019年访问这里的人来说,这可能是最相关的答案。 - Aaron Frary
1
这在2023年可行。 - Rickfdalton

75

更新

从 git 2.11 开始只需使用数字:

git stash apply 1

原文

在 Windows Powershell 上运行以下命令:

git stash apply "stash@{1}"

3
在Ubuntu Linux上也适用。 - Bouke Versteegh
1
也适用于 Mac OS X。我更喜欢这种方法,而不是逐个转义单个字符。 - Félix Adriyel Gagnon-Grenier

18

正如Robert所指出的,引号可能对您有帮助:

git stash pop stash@"{1}"

15
如果以上方法都无法奏效,可能将储藏库本身用引号括起来会对您有所帮助:
git stash pop "stash@{0}"

13

我已经安装了2.22版本,并且它可以正常工作。

git stash pop --index 1

无法工作。$ git stash pop --index 1 致命错误:模棱两可的参数 '1':未知的修订或路径不在工作树中。 使用 '--' 将路径与修订分开,像这样: 'git <command> [<revision>...] -- [<file>...]' - Dave Doga Oz
弹出你的存储警告 - shervinox

10

从版本2.11+开始,请使用以下内容:

git stash list

git stash apply n

n是数字 stash@{12}


9

首先检查列表:

git stash list

复制您想要从stash列表中删除的索引。

git stash pop stash@{index_number}

eg.:

git stash pop stash@{1}

3
我在这个列表中看到过几次这个答案,但为了明确起见,至少在 git 版本 2.33.0 中,git stash pop stash@{n} 有效的。不需要转义。

1
可能取决于您使用的Shell,对吧? - silverdr
@silverdr 是的,我想那是可能的。我只是在 VS Code 中使用 Git CLI for Windows 自带的工具。 - PaulBunion
是的,这就解释了。在某些 shell 中,花括号需要转义或整个参数需要加引号。除此之外,这通常是有效的。 - silverdr

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