stash@{1}是含糊的吗?

141

我尝试获取有关我的暂存区的信息,但是Git告诉我stash@{0}stash@{1}是模糊的。 git stash list可以正常工作,而.git/logs/refs/stash似乎具有适当的内容(尽管我不是Git内部的专家)。

% git stash list
stash@{0}: On master: two
stash@{1}: On master: one
% git stash show stash@{1}
fatal: ambiguous argument 'stash@1': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions

仅使用git stash show命令是可以正常工作的。那么为什么git stash list给我的名称被认为是不明确的?


1
在我的情况下,我不知何故拥有了一个名为“stash”的分支,这是导致错误的原因。 - Zaz
在我的情况下,我有一个名为“stash”的远程,导致了错误! - Robert Muil
5个回答

268
你的命令行解释器误解了你的花括号,所以当你输入 stash@{1} 时,git 看到的是 stash@1,这对它来说没有意义。要么对参数加引号(使用 git stash apply "stash@{1}"git stash apply stash@"{1}";无论哪种方式都可以),要么重新配置你的命令行解释器,只在花括号之间有逗号时才展开(zsh 可以两种方式配置;bash 只在花括号之间有逗号或范围时才展开,而其他的解释器可能有不同的行为)。

1
@sehe:目前Uncommon使用的那个。引用的错误消息非常清楚地表明了这一点(不,它似乎不能是bash)。 - Jan Hudec
87
在 Windows 中,PowerShell 也会“吃掉”括号。您可以使用反引号进行转义 (git stash drop stash@`{1`}) - Xavier Poinas
8
谢谢,这种情况发生在鱼身上,我不确定是怎么回事。 - Elijah Lynn
4
@Sergey 在 PowerShell 中使用 stash@`{0`}(反引号)或 'stash@{0}'(单引号)中的任意一种方式。请注意,不要改变原意并尽可能让内容更通俗易懂。 - Hans
5
哦,一年多后我又回来了,因为我遇到了一个问题。这只是说明我很少使用它。然后看到我上面留下的评论,确实说这种情况会发生在 Fish 上。太有趣了。 - Elijah Lynn
显示剩余7条评论

25
我也遇到了同样的问题。我发现最简单的解决方法是:
$ git stash apply stash@"{2}"

我正在使用Windows的Git Shell。

3
也就是说,运行命令 git stash apply "stash@{2}"。该命令将应用第二个存储的代码片段到当前分支,恢复之前被暂存的更改。 - rsenna
1
适用于PowerShell。 - rsenna
同样的git stash apply "stash@{2}"对我也奏效了,当我尝试拉代码第三个存储时,我收到了“未知选项:-encodedCommand”的错误提示,因为我正在使用集成了PowerShell的Visual Studio Code作为终端。 - Rajan Chauhan

2

简单来说,将存储库 ID 放在单引号之间:

git stash apply 'stash@{1}'

3
这个回答如何回答问题?存储列表中没有#3索引。如果这是一个认真的回答,请解释一下为什么这个命令会解决问题。 - Brad
我为了更清晰地表达修改了我的回答:主要思想是在简单引号之间放置存储编号。它适用于“apply”或“drop”子命令。存储编号实际上并不重要。 - Adriano
虽然这段代码片段可能解决了问题,但包括解释真的有助于提高您的帖子质量。请记住,您正在为未来的读者回答问题,而这些人可能不知道您的代码建议原因。 - DimaSan

1
对于zsh用户:
$ git stash apply stash@'{'1'}'

1

如果你在Windows上使用Emacs和Magit时遇到了这个错误(就像我一样)
希望这个快速的解决方案能够帮助到你:

(if (eq system-type 'windows-nt)
    (defadvice magit-run-git (before magit-run-git-win-curly-braces (&rest args) activate)
      "Escape {} on Windows"
      (setcar (nthcdr 2 args) 
              (replace-regexp-in-string "{\\([0-9]+\\)}" "\\\\{\\1\\\\}" (elt args 2)))
    )
  )

这将在("stash", "cmd", "stash@{0}")的第三个参数中引用{},该参数由magit-run-git运行。


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