如何仅隐藏某些文件?


385

我藏了零钱。现在,我只想取消隐藏部分文件。我怎样才能做到这一点?


4
我认为您必须应用整个存储,但是您可以有选择地重新存储。
理查德

4
@AbdouTahiri藏匿处有什么问题?
Alex

32
@AbdouTahiri Uhhhh .. git stash是一项合法功能,非常有用。我每天都用。说,一个同事需要我进行检查,但我处于复杂的变更集中。我不会提交一堆损坏的代码,只是为了切换分支。我要隐藏,切换分支,查看,切换回去,取消隐藏。您是否想详细说明“不推荐” 为什么建议使用git stash?仅仅因为您的 git藏匿历史混浊并且难以阅读,并不意味着其他所有人都是。混乱的git存储集只是糟糕的工作流程,而不是Git的缺陷。
dudewad

6
@alex没事。git stash没有问题。继续使用它。
dudewad

Answers:


460

正如下面提到的,并在详细的“ 我怎么会提取一个混帐藏匿单个文件(或对文件的更改)? ”,你可以申请使用git checkoutgit show恢复特定文件。

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

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

(正如评论海梅M.,对于某些壳例如tcsh,你需要逃跑的特殊字符,语法为: 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 -p1在某些情况下,删除一个(p1)从传统的差异路径斜线)


如注释:“ unstash”(git stash pop),然后:

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

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


5
如果git stash pop由于文件冲突而无法运行,则此方法将无效。在这种情况下,Balamurugan A的回答对我有用。
Andrey 2014年

1
如果要手动选择要从该文件中应用的更改,则可以使用git difftool stash @ {0} ..
HEAD-

5
看起来像“ git checkout stash @ {0}-<filename>”恢复了执行存储时的文件版本–它不适用于(只是)该文件的隐藏更改。要执行后者:“ git diff stash @ {0} ^ 1 stash @ {0}-<filename> | git apply”
Vivek

1
@JaimeM。谢谢。我已将您的评论包含在答案中,以提高知名度。
VonC

1
假设这unstash意味着pop,在我看来,在大多数情况下,这可能仅部分回答了这个问题。然后,如何在弹出的其余更改中从存储中删除选择性应用的部分,以避免以后发生冲突和/或混乱?
DylanYoung '17

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

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

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

12
这是正确的答案!单行命令仅应用来自特定文件的隐藏更改,就像一个超级按钮!
2014年

1
要应用(只是)文件的隐藏更改:“ git diff stash @ {N} ^ 1 stash @ {N}-<文件名> | git apply”
Vivek

这也对我有用。只需从存储中有选择地检出需要使用的文件,就可以完成。我被困在-a创建存储区时使用过的标志中。
Rajeev Ranjan

1
@ 4levels我认为“应用隐藏的更改”不会发生,对吧?我认为会发生“用隐藏的副本覆盖所有内容”的情况。
msouth

35

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

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

4
在某些情况下,这可能是您想要的,但是请注意,此命令将覆盖而不是与任何工作目录更改合并。
Rhubbarb 2015年

这对我有用,因为我只想复制仅存在于存储中的文件,而不关心checkout任何文件。
汤姆·罗素

1
对于Windows PowerShell:git show stash@`{0`}:Path/To/MyFile.txt |sc Path/To/MyFile.txt-PS不能特殊地解释花括号,必须使用反引号,这sc是必须的,因为PS的>运算符默认为UTF-16(实际上是UCS-2),这可能不是您想要的。@Balamurugan A的答案不会受到这些问题的困扰。
伊恩·肯普

19

首先列出所有藏匿处

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

它也可以不使用--但建议使用它们。看到这篇文章。

还通常将双连字符识别为停止选项解释并按字面意义对待所有以下自变量的信号。


1
通过此编辑可以更清楚地看到。+1
VonC '18

1
我尝试了很多方法,而这正是我需要的方法。我遇到了一个问题,该问题git stash pop引发了未跟踪文件的错误。谢谢。
拉明·菲罗斯

10

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


2
为了弄清这篇文章中的冲突部分,如果您git stash pop和那里存在冲突,则必须手动修复它们,并且不会删除隐藏项。
Thomas McCabe

6

另一种方式:

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

2
这是IMO唯一正确的答案。使用checkoutshow将盲目地覆盖文件,而不仅仅是应用更改。轻描淡写是“另一种方式”。
雄辩的

1
我没有得到path/to/file2您想要与工作空间中的同一文件进行比较的。排除第二条路径对我来说很好。-使用-R选项(“反向应用补丁”,试图修补已隐藏的版本?!),我收到一条错误消息。所以我的工作版本看起来像git diff stash@{N}^! -- path/to/file | git apply -
ThomasH

“补丁失败”?尝试3向合并。...| git apply -3 -
John Mee

6

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

git checkout 'stash@{0}' YourFile

没有它,您可能会收到一个错误:

Unknown switch 'e'


3
对于本月我见过的最不有用的用户消息,PowerShell带有满分。
holdenweb '19
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.