496

我隐藏了我的更改。现在我只想从存储中取出一些文件。我怎样才能做到这一点?

4

8 回答 8

600

如下所述,并在“如何从 git stash 中提取单个文件(或对文件的更改)? ”中进行了详细说明,您可以应用使用git checkoutgit show恢复特定文件。

git checkout stash@{0} -- <filename>

使用 Git 2.23+(2019 年 8 月),使用git restore替换令人困惑的git checkout命令

git restore --source='stash@{0}' -- <filename>

这确实会覆盖 filename:确保您没有进行本地修改,或者您可能想要合并隐藏的文件

(正如Jaime M.所评论的,对于像 tcsh 这样需要转义特殊字符的某些 shell,语法为 :)git checkout 'stash@{0}' -- <filename>

或将其保存在另一个文件名下:

git show stash@{0}:<full filename>  >  <newfile>

(请注意,这里<full filename>是相对于项目顶层目录的文件的完整路径名(想想:相对于stash@{0}))。

yucer在评论中建议:

如果要手动选择要从该文件应用的更改:

git difftool stash@{0}..HEAD -- <filename>

Vivek在评论中补充道:

看起来“ git checkout stash@{0} -- <filename>”恢复了执行存储时的文件版本——它不应用(仅)该文件的隐藏更改。
做后者:

git diff stash@{0}^1 stash@{0} -- <filename> | git apply

(正如peterflynn所评论的,在某些情况下,您可能需要从传统差异路径中删除一个 ( ) 前导斜杠)| git apply -p1p1


正如评论:“unstash”(git stash pop),然后:

  • 将要保留的内容添加到索引 ( git add)
  • 把剩下的藏起来:git stash --keep-index

最后一点是允许您在存储其他文件的同时保留一些文件。
它在“如何仅存储已更改的多个文件中的一个文件”中进行了说明。

于 2013-03-07T06:39:06.687 回答
124
git checkout stash@{N} <File(s)/Folder(s) path> 

例如。要仅恢复上次存储的 ./test.c 文件和 ./include 文件夹,

git checkout stash@{0} ./test.c ./include
于 2014-03-21T09:44:25.720 回答
38

我认为 VonC 的答案可能是您想要的,但这是一种选择性“git apply”的方法:

git show stash@{0}:MyFile.txt > MyFile.txt
于 2013-03-07T16:05:01.877 回答
32

首先列出所有的藏匿处

git stash list

↓</p>

stash@{0}: WIP on Produktkonfigurator: 132c06a5 Cursor bei glyphicon plus und close zu zeigende Hand ändern
stash@{1}: WIP on Produktkonfigurator: 132c06a5 Cursor bei glyphicon plus und close zu zeigende Hand ändern
stash@{2}: WIP on master: 7e450c81 Merge branch 'Offlineseite'

然后显示哪些文件在 stash 中(让我们选择 stash 1):

git stash show 1 --name-only

//Hint: you can also write
//git stash show stash@{1} --name-only

↓</p>

 ajax/product.php
 ajax/productPrice.php
 errors/Company/js/offlineMain.phtml
 errors/Company/mage.php
 errors/Company/page.phtml
 js/konfigurator/konfigurator.js

然后将您喜欢的文件应用于:

git checkout stash@{1} -- <filename>

或整个文件夹:

git checkout stash@{1} /errors

它也可以不--使用,但建议使用它们。看到这个帖子。

将双连字符识别为停止选项解释并按字面处理所有后续参数的信号也是常规的。

于 2018-06-07T08:31:20.957 回答
14

另一种方法:

git diff stash@{N}^! -- path/to/file1 path/to/file2  | git apply -R
于 2018-05-16T12:12:17.620 回答
12

如果您git stash pop(没有冲突)它将在应用后删除存储。但是,如果您git stash apply将应用补丁而不将其从存储列表中删除。然后你可以恢复不需要的更改git checkout -- files...

于 2013-03-07T06:44:15.427 回答
9

对于 Windows 用户:大括号在 PowerShell 中具有特殊含义。您可以用单引号括起来或用反引号转义。例如:

git checkout 'stash@{0}' YourFile

没有它,您可能会收到错误消息:

Unknown switch 'e'

于 2019-01-15T15:43:45.413 回答
1

例如

git stash show --name-only

结果

ofbiz_src/.project
ofbiz_src/applications/baseaccounting/entitydef/entitymodel_view.xml
ofbiz_src/applications/baselogistics/webapp/baselogistics/delivery/purchaseDeliveryDetail.ftl
ofbiz_src/applications/baselogistics/webapp/baselogistics/transfer/listTransfers.ftl
ofbiz_src/applications/component-load.xml
ofbiz_src/applications/search/config/elasticSearch.properties
ofbiz_src/framework/entity/lib/jdbc/mysql-connector-java-5.1.46.jar
ofbiz_src/framework/entity/lib/jdbc/postgresql-9.3-1101.jdbc4.jar

然后在特定文件中弹出存储

git checkout stash@{0} -- ofbiz_src/applications/baselogistics/webapp/baselogistics/delivery/purchaseDeliveryDetail.ftl

其他相关命令

git stash list --stat
get stash show
于 2020-12-11T05:10:18.660 回答