Git储藏应用版本

829

我有两个分支:master | design

在design分支中,我进行了一些工作并进行了stash,然后切换到master分支做了一些调整。然后又切换回design分支,只使用了stash apply,结果失去了所有在design分支中的更改。

我希望我的所有工作都可以从stash中恢复,因为我没有清除或删除这些stash。

如果我执行stash列表,会得到4个结果:

stash@{0}: WIP on design: f2c0c72... Adjust Password Recover Email
stash@{1}: WIP on design: f2c0c72... Adjust Password Recover Email
stash@{2}: WIP on design: eb65635... Email Adjust
stash@{3}: WIP on design: eb65635... Email Adjust

如果我尝试运行git stash apply f2c0c72,会出现错误:

fatal: Needed a single revision
f2c0c72: no valid stashed state found

我该如何应用特定的存储?


53
请注意,现在(2016年第四季度,Git 2.11),语法为git stash apply 0(而不是git stash apply stash@{0})。请参见我在这里的答案 - VonC
8个回答

1418

在存储库中,stash的键实际上是左侧的stash@{n}项。所以尝试:

git stash apply stash@{0}
注意,在一些Shell中你需要引用"stash@{0}",比如zsh、fish和powershell。
自2.11版本开始,使用N个堆栈号替代使用"stash@{n}"非常容易。现在,你可以使用以下语法:
git stash apply "stash@{n}"
你可以输入:
git stash apply n

获取存储列表:

git stash list

实际上,stash@{0} 是 git 中的一个修订版本,您可以切换到该版本...但是git stash apply ... 应该能够找出如何 DTRT(Do The Right Thing)以将其应用于当前位置。


113
请注意,在某些 shell 中,必须对 stash@{n} 进行引用。 - Senjai
9
另一个提示:你可以执行例如 gitk stash@{0} 来展示你在特定stash中所做的更改。 - antinome
12
zsh用户需要双引号,例如 git stash apply "stash@{0}" - mynameistechno
9
除了创建自己的别名或函数外,是否有其他快捷方式可以执行stash@{n}命令?这是最难以键入的命令。 - Dylanthepiguy
7
“git stash apply n” 是一种平和的操作。 - Victor
显示剩余6条评论

293

要应用一个存储并将其从存储列表中移除,请运行以下命令:

git stash pop stash@{n}

应用stash并将其保留在stash缓存中,请运行:

git stash apply stash@{n}

9
太好了,感谢您区分这两个选项。我刚刚尝试了一下,发现如果你将一个存储在branch-a中的stash弹出到branch-b上,该stash仍将保留在stash缓存中。我猜这是为了在未来某个时间仍然可以将该stash弹出/应用到branch-a。希望我的解释清楚明白。非常方便! - longda
48
PowerShell命令:git stash pop "stash@{n}"翻译:git stash pop "stash@{n}" 表示弹出指定编号的储藏(stash)。 - ankitjaininfo
1
PowerShell 对花括号在引号/单引号中很满意:git stash apply stash@"{n}" - m1kael
PowerShell 也会接受 git stash apply stash@\{n`}`(注意大括号前面的反引号)。 - Ian Kemp

77
自从版本2.11以后,你可以使用N代替"stash@{n}",这变得非常容易了。 因此,现在你可以使用以下命令:
git stash apply "stash@{n}"

你可以输入:

git stash apply n
例如,在您的列表中:
stash@{0}: WIP on design: f2c0c72... Adjust Password Recover Email
stash@{1}: WIP on design: f2c0c72... Adjust Password Recover Email
stash@{2}: WIP on design: eb65635... Email Adjust
stash@{3}: WIP on design: eb65635... Email Adjust

如果你想应用stash@{1},你可以输入:

git stash apply 1
否则,即使您的目录自1.7.5.1以来发生了一些更改,您仍然可以使用它,但必须确保stash不会覆盖您的工作目录更改,否则您将收到一个错误:
error: Your local changes to the following files would be overwritten by merge:
        file
Please commit your changes or stash them before you merge.

在1.7.5.1版本之前,如果工作目录发生变化,它将拒绝工作。


Git发布说明:

用户总是需要在默认位置的存储中命名单个元素时使用“stash@{$N}”,即在refs/stash中的reflogs。 "git stash" 命令学会了接受“git stash apply 4”作为“git stash apply stash@{4}”的简写

即使更改未与存储记录中的更改重叠,“git stash apply”过去会拒绝工作,如果工作树有任何更改。


46

如果用户正在Windows机器上使用PowerShell,需要对参数加引号,例如:

If one is on a Windows machine and in PowerShell, one needs to quote the argument such as:

git stash apply "stash@{0}"

...或者应用更改并从存储中删除:

git stash pop "stash@{0}"
否则,如果没有引号,您可能会收到以下错误信息:

fatal: ambiguous argument 'stash@': unknown revision or path not in the working tree.



显然,在Mac OSX 10.11上使用fish shell时,这就是你必须要做的。 - lps

29
git stash list 

列表将显示所有存储的项目,例如:stash@{0}:,stash@{1}:,..,stash@{n}:。

然后选择数字n,表示stash@{n}:。

git stash apply n 
例如:
git stash apply 1 

将应用特定的存储更改到当前分支


22

如果您有更多的藏品,我建议您在使用它们之前进行检查。使用:

git stash show -p

要查看最后一个包裹的详细信息。如果您有更多的包裹并且想要查看特定的一个,那么在结尾添加包裹的编号即可:

git stash show 1

然后当你找到正确的藏匿处时,通过键入以下内容应用:

git stash apply 1

再次说明这个数字是一个例子,如果你没有数字,你将应用最后一个数字。


16

要查看您最近的工作以及它所在的分支,请运行

git stash list

然后选择要应用的stash,并仅使用数字:

git stash apply n

在上述示例中,n是与“正在进行的工作”相对应的数字。


1

你需要引用字符串,因为你的 shell 会将 {} 的内容作为扩展而消耗掉。所以使用 git stash apply 'stash@{index}'。或者你可以使用存储的 SHA,或者下次应用时,你可以自己命名存储。


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