我隐藏了我的更改。现在我只想从存储中取出一些文件。我怎样才能做到这一点?
8 回答
如下所述,并在“如何从 git stash 中提取单个文件(或对文件的更改)? ”中进行了详细说明,您可以应用使用git checkout
或git 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}
))。
如果要手动选择要从该文件应用的更改:
git difftool stash@{0}..HEAD -- <filename>
看起来“
git checkout stash@{0} -- <filename>
”恢复了执行存储时的文件版本——它不应用(仅)该文件的隐藏更改。
做后者:
git diff stash@{0}^1 stash@{0} -- <filename> | git apply
(正如peterflynn所评论的,在某些情况下,您可能需要从传统差异路径中删除一个 ( ) 前导斜杠)| git apply -p1
p1
正如评论:“unstash”(git stash pop
),然后:
- 将要保留的内容添加到索引 (
git add
) - 把剩下的藏起来:
git stash --keep-index
最后一点是允许您在存储其他文件的同时保留一些文件。
它在“如何仅存储已更改的多个文件中的一个文件”中进行了说明。
git checkout stash@{N} <File(s)/Folder(s) path>
例如。要仅恢复上次存储的 ./test.c 文件和 ./include 文件夹,
git checkout stash@{0} ./test.c ./include
我认为 VonC 的答案可能是您想要的,但这是一种选择性“git apply”的方法:
git show stash@{0}:MyFile.txt > MyFile.txt
首先列出所有的藏匿处
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
它也可以不--
使用,但建议使用它们。看到这个帖子。
将双连字符识别为停止选项解释并按字面处理所有后续参数的信号也是常规的。
另一种方法:
git diff stash@{N}^! -- path/to/file1 path/to/file2 | git apply -R
如果您git stash pop
(没有冲突)它将在应用后删除存储。但是,如果您git stash apply
将应用补丁而不将其从存储列表中删除。然后你可以恢复不需要的更改git checkout -- files...
对于 Windows 用户:大括号在 PowerShell 中具有特殊含义。您可以用单引号括起来或用反引号转义。例如:
git checkout 'stash@{0}' YourFile
没有它,您可能会收到错误消息:
Unknown switch 'e'
例如
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