Jak*_*ski 1048
在git stash手册页中,您可以阅读(在"讨论"部分,在"选项"描述之后):
存储表示为提交,其树记录工作目录的状态,其第一个父节点是创建存储时HEAD的提交.
因此,您可以将存储(例如stash@{0},第一个/最顶层的存储)视为合并提交,并使用:
$ git diff stash@{0}^1 stash@{0} -- <filename>
Run Code Online (Sandbox Code Playgroud)
说明:stash@{0}^1快捷方式表示给定存储的第一个父级,如上面的解释所述,提交时将更改隐藏起来.我们使用这种形式的"git diff"(有两个提交),因为stash@{0}/ refs/stash是一个合并提交,我们必须告诉git我们要对哪个父进行区分.更神秘:
$ git diff stash@{0}^! -- <filename>
Run Code Online (Sandbox Code Playgroud)
也应该工作(有关语法的解释,请参阅git rev-parse联机帮助页rev^!,在"指定范围"部分中).
同样,您可以使用git checkout从存储中检查单个文件:
$ git checkout stash@{0} -- <filename>
Run Code Online (Sandbox Code Playgroud)
或者将其保存在另一个文件名下:
$ git show stash@{0}:<full filename> > <newfile>
Run Code Online (Sandbox Code Playgroud)
要么
$ git show stash@{0}:./<relative filename> > <newfile>
Run Code Online (Sandbox Code Playgroud)
(请注意,<full filename>是文件的完整路径名,相对于项目的顶级目录(想想:相对于stash@{0})).
您可能需要保护stash@{0}shell扩展,即使用"stash@{0}"或'stash@{0}'.
Tim*_*gan 41
如果您使用git stash apply而不是git stash pop,它会将存储应用于您的工作树但仍保留存储.
完成此操作后,您可以add/ commit您需要的文件,然后重置其余更改.
Lub*_*rek 23
要查看整个文件: git show stash@{0}:<filename>
看到差异: git diff stash@{0}^1 stash@{0} -- <filename>
Wal*_*alf 23
有一种简单的方法可以从任何分支中获取更改,包括stashes:
$ git checkout --patch stash@{0} path/to/file
Run Code Online (Sandbox Code Playgroud)
如果要在许多部分进行修补,可以省略文件规范.或者省略补丁(但不是路径)以获取对单个文件的所有更改.如果您有多个0隐藏号码git stash list,请替换为隐藏号码.请注意,这就像diff,并提供应用分支之间的所有差异.要从单个提交/存储中获取更改,请查看git cherry-pick --no-commit.
Ram*_*Ram 15
$ git checkout stash@{0} -- <filename>
Run Code Online (Sandbox Code Playgroud)
笔记:
确保在" - "和文件名参数后面加上空格
将零(0)替换为您的特定存储编号.要获取存储列表,请使用:
git stash list
Run Code Online (Sandbox Code Playgroud)根据JakubNarębski的回答 - 更短的版本
Nat*_*hen 10
您可以使用" git show stash@{0}" 获取存储的差异(或者无论存储的数量是什么;请参阅"git存储列表").为单个文件提取diff的部分很容易.
cam*_*ous 10
使用以下内容将更改应用于存储中的文件到您的工作树。
git diff stash^! -- <filename> | git apply
Run Code Online (Sandbox Code Playgroud)
这通常比使用更好,git checkout因为您不会丢失自创建存储以来对文件所做的任何更改。
要理解的最简单的概念,虽然可能不是最好的,但是您更改了三个文件,并且您希望存储一个文件.
如果你git stash要将它们全部藏起来,再将它们git stash apply带回来,然后再回到有git checkout f.c问题的文件上,以便有效地重置它.
当你想要释放该文件时,运行do git reset --hard然后git stash apply再次运行,利用git stash apply不清除存储堆栈中的差异的事实.