如何只取消隐藏某些文件?

问题描述 投票:0回答:9

我藏起了我的变化。现在我只想从存储中取消存储一些文件。我该怎么做?

git git-stash
9个回答
657
投票

如下文所述,并在“我如何从 git 存储中提取单个文件(或对文件的更改)?”中进行了详细说明,您可以使用

git checkout
git show
恢复特定文件。

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

使用 Git 2.23+(2019 年 8 月),使用

git restore
,它取代了 令人困惑的
git checkout
命令

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

那会 overwrite

filename
:确保您没有本地修改,或者您可能想要合并 stashed 文件而不是.

(正如 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>
”恢复了执行隐藏时文件的版本——它确实NOT应用(仅)该文件的隐藏更改。
做后者:

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

最后一点是允许您在隐藏其他文件的同时保留一些文件。
在“How to stash only one file out of multiple files that have changed”中有说明。


129
投票
git checkout stash@{N} <File(s)/Folder(s) path> 

例如。 仅从上次隐藏的 ./test.c 文件和 ./include 文件夹恢复,

git checkout stash@{0} ./test.c ./include

41
投票

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

git show stash@{0}:MyFile.txt > MyFile.txt

39
投票

首先列出所有藏品

git stash list

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'

然后显示存储中有哪些文件(让我们选择存储 1):

git stash show 1 --name-only

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

 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

它也可以在没有

--
的情况下工作,但建议使用它们。请参阅this post.

通常将双连字符识别为信号 停止选项解释并处理以下所有参数 从字面上看。


17
投票

另一种方式:

git diff stash@{N}^! -- path/to/file1 path/to/file2  | git apply -R

14
投票

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

git checkout 'stash@{0}' YourFile

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

Unknown switch 'e'


13
投票

如果您

git stash pop
(没有冲突),它将在应用后删除存储。但是如果你
git stash apply
它会应用补丁而不将它从隐藏列表中删除。然后您可以使用
git checkout -- files...

恢复不需要的更改

4
投票

例如

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

0
投票

Windows 用户要避免

Unknown switch 'e'
stash@{0}
需要包含在引号内,如下所示

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

© www.soinside.com 2019 - 2024. All rights reserved.