我想知道是否能够从git stash中提取单个文件或diff文件,而不会弹出存储变动集。 git
任何人均可以提供一些关于此的建议/想法吗? shell
您可使用“ git show stash@{0}
”获取存储的差别(或者不管存储的数量是什么;请参阅“git stash list”)。 为单个文件提取diff的部分很容易。 app
若是您使用git stash apply
而不是git stash pop
,它会将存储应用于您的工做树但仍保留存储。 spa
完成此操做后,您能够add
/ commit
所需的文件,而后重置其他更改。 code
在git stash手册页上,您能够阅读(在“讨论”部分,在“选项”描述以后): get
存储表示为提交,其树记录工做目录的状态,其第一个父节点是建立存储时HEAD的提交。 it
所以,您能够将stash(例如stash@{0}
是第一个/最顶层的存储)视为合并提交,并使用: io
$ git diff stash@{0}^1 stash@{0} -- <filename>
说明: stash@{0}^1
表示给定存储的第一个父节点,如上面的解释中所述,是存储更改的提交。 咱们使用这种形式的“git diff”(有两次提交),由于stash@{0}
/ refs/stash
是一个合并提交,咱们必须告诉git咱们要对哪一个父进行区分。 更神秘: 扩展
$ git diff stash@{0}^! -- <filename>
也应该工做(有关rev^!
语法的解释,请参阅git rev-parse手册页,在“指定范围”部分)。 file
一样,您可使用git checkout从存储中检查单个文件:
$ git checkout stash@{0} -- <filename>
或者将其保存在另外一个文件名下:
$ git show stash@{0}:<full filename> > <newfile>
要么
$ git show stash@{0}:./<relative filename> > <newfile>
( 请注意 ,此处<full filename>是相对于项目顶级目录的文件的完整路径名(想一想:相对于stash@{0}
))。
您可能须要保护stash@{0}
免受shell扩展,即便用"stash@{0}"
或'stash@{0}'
。
要理解的最简单的概念,虽然可能不是最好的,可是您更改了三个文件,而且您但愿存储一个文件。
若是你使用git stash
来存储全部内容, git stash apply
再次将它们带回来而后git checkout fc
对有问题的文件进行有效的重置。
当你想要解压缩该文件时,执行git reset --hard
,而后再次运行git stash apply
,利用git stash apply
不会清除存储堆栈中的差别这一事实。
要查看整个文件: git show stash@{0}:<filename>
要查看diff: git diff stash@{0}^1 stash@{0} -- <filename>