【问题标题】:How to unstash only certain files?如何仅取消存储某些文件?
【发布时间】:2013-02-22 06:13:48
【问题描述】:

我隐藏了我的更改。现在我只想从存储中取出一些文件。我该怎么做?

【问题讨论】:

  • 我认为你必须应用整个存储,但你可以有选择地重新存储。
  • @AbdouTahiri 存储有什么问题?
  • @AbdouTahiri Uhhhh.. git stash 是一个合法的功能,非常有用。我每天都用它。比如说,一位同事需要我审查一些东西,但我正处于一个复杂的变更集中。我不会为了切换分支而提交一堆损坏的代码。我要存储,切换分支,审查,切换回来,取消存储。您是否愿意详细说明 whowhy git stash 据说“不推荐”?仅仅因为你的 git stash 历史混乱且难以阅读并不意味着其他人都是。混乱的 git 存储集只是糟糕的工作流程,而不是 Git 的缺陷。
  • @alex 什么都没有。 git stash 没有任何问题。继续使用。

标签: git git-stash


【解决方案1】:

mentioned below,详细在“How would I extract a single file (or changes to a file) from a git stash?”,您可以申请使用git checkoutgit show来恢复特定文件。

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

对于 Git 2.23+(2019 年 8 月),使用 git restore,它替换了 confusing git checkout command

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

确实覆盖filename:确保您没有进行本地修改,或者您可能想要合并stashed file instead

(作为Jaime M.commented,对于需要转义特殊字符的某些shell(如tcsh),语法为:git checkout 'stash@{0}' -- &lt;filename&gt;

或以其他文件名保存:

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

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

yucer 建议in the comments

如果您想手动选择要从该文件中应用哪些更改:

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

Vivek 添加in the comments

看起来“git checkout stash@{0} -- &lt;filename&gt;”恢复了执行存储时的文件版本 - 它确实应用(仅)该文件的隐藏更改。
后者:

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

(如commented by 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”所示。

【讨论】:

  • 如果由于文件冲突而无法git stash pop,这将不起作用。在这种情况下,Balamurugan A 的回答对我有用。
  • 如果您想手动选择要从该文件应用的更改,您可以使用 git difftool stash@{0}..HEAD --
  • 看起来像 "git checkout stash@{0} -- " 恢复执行存储时的文件版本——它不应用(仅)隐藏该文件的更改。后者:“git diff stash@{0}^1 stash@{0} -- | git apply”
  • @JaimeM。谢谢你。我已将您的评论包含在答案中以提高知名度。
  • 假设unstash 表示pop,在我看来,在大多数情况下它可能会,这只是部分回答了这个问题。然后如何从存储中删除选择性应用的部分,以避免以后在弹出剩余更改时发生冲突和/或混淆?
【解决方案2】:

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

【讨论】:

  • 为了澄清这篇文章的冲突部分,如果你 git stash pop 并且存在冲突,你将不得不手动修复它们并且不会删除存储。
【解决方案3】:

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

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

【讨论】:

【解决方案4】:
git checkout stash@{N} <File(s)/Folder(s) path> 

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

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

【讨论】:

  • 这是正确答案!仅应用来自特定文件的隐藏更改的单行命令,就像一个魅力!
  • 应用(仅)隐藏的文件更改:“git diff stash@{N}^1 stash@{N} -- | git apply”
  • 这也适用于我。只需从 stash 中选择性地签出需要使用的文件即可。我被困在这个我在创建存储时使用-a 标志。
  • @4levels 我认为“应用隐藏的更改”不会发生,对吧?我认为“用 stash 中的副本覆盖你所拥有的一切”是会发生的。
【解决方案5】:

另一种方式:

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

【讨论】:

  • 这是 IMO 唯一正确的答案。使用checkoutshow 会盲目地覆盖您的文件,而不仅仅是应用更改。 “另一种方式”是轻描淡写的。
  • 我没有得到path/to/file2,因为您想对工作区中的同一个文件进行比较。省略第二条路径对我来说很好。 - 我使用-R 选项收到一条错误消息(“反向应用补丁”,试图修补隐藏的版本?!)。所以我的工作版本看起来像git diff stash@{N}^! -- path/to/file | git apply -
  • “补丁失败”?尝试 3 路合并。 ...| git apply -3 -
  • diff stash@{N}^! 已经产生了前向差异,所以省略 -R
  • ^!在我的情况下不起作用,所以我最终做了git diff stash@{N} -- path/to/file | git apply -R
【解决方案6】:

首先列出所有的存储

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'

然后显示哪些文件在 stash 中(让我们选择 stash 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 帖子。

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

【讨论】:

  • 我尝试了很多方法,这就是我需要的方法。我遇到了git stash pop 为未跟踪文件抛出错误的问题。谢谢。
【解决方案7】:

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

git checkout 'stash@{0}' YourFile

没有它,你可能会收到错误:

Unknown switch 'e'

【讨论】:

  • PowerShell 满分,这是我本月看到的最没有帮助的用户消息。
【解决方案8】:

例如

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

然后在特定文件中弹出 stash

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

其他相关命令

git stash list --stat
get stash show

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-07
    • 1970-01-01
    相关资源
    最近更新 更多