如何从 git stash 中提取单个文件或对文件的更改?

问题描述

git stash 手册页上,您可以阅读(在“讨论”部分中,就在“选项”描述之后):

存储被表示为一个提交,其树记录工作目录的状态,其第一个父级是创建存储时在 HEAD 的提交。

因此,您可以将存储(例如stash@{0},第一个/最顶层存储)视为合并提交,并使用:

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

解释:stash@{0}^1表示给定存储的第一个父级,如上面的解释中所述,是隐藏更改的提交。我们使用这种形式的“git diff”(有两个提交),因为stash@{0}/refs/stash一个合并提交,我们必须告诉 git 我们想要比较哪个父级。更神秘:

$ git diff stash@{0}^! -- <filename>

也应该可以工作(请参阅git rev-parserev^!手册页以了解“指定范围”部分中的语法解释)。

同样,您可以使用git checkout从存储中检查单个文件

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

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

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

要么

$ git show stash@{0}:./<relative filename> > <newfile>

请注意 ,这里的 是相对于项目顶级目录的文件的完整路径名(认为:相对于stash@{0}))。


您可能需要防止stash@{0}外壳扩展,即使用"stash@{0}"or 'stash@{0}'

解决方法

是否可以从 git stash 中提取单个文件或文件的差异而不弹出 stash 变更集?