如何仅解冻某些文件?

mor*_*eus 350 git git-stash

我把我的变化藏了起来.现在我想从存储中只取消一些文件.我怎样才能做到这一点?

Von*_*onC 415

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

git checkout stash@{0} -- <filename>
Run Code Online (Sandbox Code Playgroud)

(正如评论海梅M.,对于某些壳例如tcsh,你需要逃跑的特殊字符,语法为: filename)

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

git show stash@{0}:<full filename>  >  <newfile>
Run Code Online (Sandbox Code Playgroud)

(请注意,这git checkout 'stash@{0}' -- <filename>是相对于项目顶级目录的文件的完整路径名(想想:相对于<full filename>)).

yucer 在评论中建议:

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

git difftool stash@{0}..HEAD -- <filename>
Run Code Online (Sandbox Code Playgroud)

Vivek 在评论中补充道:

貌似" stash@{0}"恢复时进行藏匿在该文件的时间版本-它确实适用(只),该文件的藏匿变化.
做后者:

git diff stash@{0}^1 stash@{0} -- <filename> | git apply
Run Code Online (Sandbox Code Playgroud)

(正如peterflynn评论那样,git checkout stash@{0} -- <filename>在某些情况下,你可能需要| git apply -p1从传统的diff路径中删除一个()前导斜杠)


如评论:"unstash"(p1),然后:

  • 添加你想要保留的索引(git stash pop)
  • 藏匿其余的: git add

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

  • 如果由于文件冲突而无法"git stash pop",则此方法无效.在这种情况下,Balamurugan A的答案为我做了诀窍. (5认同)
  • 看起来像"git checkout stash @ {0} - <filename>"从存储执行时恢复文件的版本 - 它不会(仅)应用该文件的隐藏更改.要做后者:"git diff stash @ {0} ^ 1 stash @ {0} - <filename> | git apply" (5认同)
  • 关于` - `语法的@BlessedGeek,请参阅http://stackoverflow.com/a/1192194/6309 (2认同)

Bal*_*n A 114

git checkout stash@{N} <File(s)/Folder(s) path> 
Run Code Online (Sandbox Code Playgroud)

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

git checkout stash@{0} ./test.c ./include
Run Code Online (Sandbox Code Playgroud)

  • 这是正确的答案!单行命令仅应用特定文件中的隐藏更改,就像魅力一样! (12认同)
  • 要应用(仅)文件的隐藏更改:“git diff stash@{N}^1 stash@{N} -- &lt;filename&gt; | git apply” (2认同)

Mik*_*icz 35

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

git show stash@{0}:MyFile.txt > MyFile.txt
Run Code Online (Sandbox Code Playgroud)

  • 在某些情况下,这可能是您想要的,但请注意,此命令将覆盖**而不是与任何工作目录更改合并. (4认同)

Bla*_*ack 15

首先列出所有的藏匿处

git stash list
Run Code Online (Sandbox Code Playgroud)

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'
Run Code Online (Sandbox Code Playgroud)

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

git stash show 1 --name-only

//Hint: you can also write
//git stash show stash@{1} --name-only
Run Code Online (Sandbox Code Playgroud)

 ajax/product.php
 ajax/productPrice.php
 errors/Company/js/offlineMain.phtml
 errors/Company/mage.php
 errors/Company/page.phtml
 js/konfigurator/konfigurator.js
Run Code Online (Sandbox Code Playgroud)

然后应用您喜欢的文件:

git checkout stash@{1} -- <filename>
Run Code Online (Sandbox Code Playgroud)

或整个文件夹:

git checkout stash@{1} /errors
Run Code Online (Sandbox Code Playgroud)

它也可以使用,--但建议使用它们.看这篇文章.

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


Lac*_*mov 13

还有一种方法:

git diff stash@{N}^! -- path/to/file1 path/to/file2  | git apply -R
Run Code Online (Sandbox Code Playgroud)

  • 我没有得到“path/to/file2”,因为您想要与工作区中的同一文件进行比较。省略第二条路径对我来说效果很好。- 我使用“-R”选项收到一条错误消息(“反向应用补丁”,试图修补隐藏的版本?!)。所以我的工作版本看起来像`git diff stash@{N}^!-- 路径/到/文件 | git 应用 -` . (3认同)
  • 在我看来,这是唯一正确的答案。使用“checkout”或“show”将盲目地覆盖您的文件,而不是仅仅应用更改。“还有一种方法”是轻描淡写的。 (2认同)
  • “补丁失败”?尝试 3 路合并。`...| git 应用-3-` (2认同)

Ben*_*son 10

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

  • 为了澄清这篇文章中的冲突部分,如果您`git stash pop`并且存在冲突,则必须手动修复它们,并且不会删除隐藏项。 (2认同)

Jan*_*ena 8

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

git checkout 'stash@{0}' YourFile

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

Unknown switch 'e'

  • 本月我看到的最没有帮助的用户消息给 PowerShell 打满分。 (6认同)

归档时间:

查看次数:

135571 次

最近记录:

6 年,8 月 前