如何从git存储中提取单个文件(或更改文件)?

我想知道是否能够从git stash中提取单个文件或diff文件,而不会弹出存储变动集。 git

任何人均可以提供一些关于此的建议/想法吗? shell


#1楼

您可使用“ git show stash@{0} ”获取存储的差别(或者不管存储的数量是什么;请参阅“git stash list”)。 为单个文件提取diff的部分很容易。 app


#2楼

若是您使用git stash apply而不是git stash pop ,它会将存储应用于您的工做树但仍保留存储。 spa

完成此操做后,您能够add / commit所需的文件,而后重置其他更改。 code


#3楼

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}'


#4楼

要理解的最简单的概念,虽然可能不是最好的,可是您更改了三个文件,而且您但愿存储一个文件。

若是你使用git stash来存储全部内容, git stash apply再次将它们带回来而后git checkout fc对有问题的文件进行有效的重置。

当你想要解压缩该文件时,执行git reset --hard ,而后再次运行git stash apply ,利用git stash apply不会清除存储堆栈中的差别这一事实。


#5楼

简短的回答

要查看整个文件: git show stash@{0}:<filename>

要查看diff: git diff stash@{0}^1 stash@{0} -- <filename>

相关文章
相关标签/搜索