我想知道是否可以从git存储中提取单个文件或文件差异,而不会弹出存储变更集。
任何人都可以就此提出一些建议/想法吗?
答案 0 :(得分:959)
在git stash联机帮助页中,您可以阅读(在“讨论”部分,在“选项”说明之后):
存储表示为提交,其树记录了状态 工作目录,它的第一个父项是HEAD时的提交 藏匿被创造。
因此,您可以将stash(例如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-parse联机帮助页以获取rev^!
语法的说明,在“指定范围”部分中)。
同样,您可以使用git checkout检查隐藏的单个文件:
$ git checkout stash@{0} -- <filename>
或将其保存在另一个文件名下:
$ git show stash@{0}:<full filename> > <newfile>
或
$ git show stash@{0}:./<relative filename> > <newfile>
( note 此处&lt;完整文件名&gt;是相对于项目顶级目录的文件的完整路径名(想想:相对于stash@{0}
))。
您可能需要保护stash@{0}
免受外壳扩展,即使用"stash@{0}"
或'stash@{0}'
。
答案 1 :(得分:37)
如果您使用git stash apply
而不是git stash pop
,它会将存储应用于您的工作树,但仍保留存储。
完成此操作后,您可以add
/ commit
找到所需的文件,然后重置剩余的更改。
答案 2 :(得分:18)
要查看整个文件:git show stash@{0}:<filename>
要查看差异:git diff stash@{0}^1 stash@{0} -- <filename>
答案 3 :(得分:16)
有一种简单的方法可以从任何分支进行更改,包括stashes:
$ git checkout --patch stash@{0} path/to/file
如果要在许多部分进行修补,可以省略文件规范。或者省略补丁(但不是路径)以获取对单个文件的所有更改。如果您有多个,则将0
替换为git stash list
的藏匿号码。请注意,这与diff
类似,并提供在分支之间应用所有差异。要仅从单个提交/存储中获取更改,请查看git cherry-pick --no-commit
。
答案 4 :(得分:12)
$ git checkout stash@{0} -- <filename>
注意:
确保在“ - ”和文件名参数之后放置空格
将零(0)替换为您的特定隐藏号码。要获取存储列表,请使用:
git stash list
基于Jakub Narębski's answer - 更短的版本
答案 5 :(得分:10)
您可以使用“git show stash@{0}
”获取存储的差异(或者无论存储的数量是什么;请参阅“git存储列表”)。可以很容易地为单个文件提取差异部分。
答案 6 :(得分:5)
要理解的最简单的概念,虽然可能不是最好的,但是您更改了三个文件并且想要存储一个文件。
如果你git stash
要将它们全部存起来,git stash apply
将它们重新带回来,然后再git checkout f.c
对相关文件进行有效重置。
如果要取消暂存该文件,请执行git reset --hard
然后再次运行git stash apply
,利用git stash apply
无法清除存储堆栈中的差异这一事实。< / p>
答案 7 :(得分:1)
如果隐藏文件需要与当前版本合并,请使用以前使用diff的方式。否则,您可以使用git pop
打开它们,git add fileWantToKeep
用于暂存文件,然后执行git stash save --keep-index
,用于存储除舞台上的内容之外的所有内容。
请记住,这种方式与以前的方式的不同之处在于它会弹出&#34; pops&#34;来自藏匿处的文件。之前的答案保留git checkout stash@{0} -- <filename>
,以便根据您的需要进行调整。
答案 8 :(得分:0)
使用以下内容将更改应用于存储在工作树中的文件。
git diff stash^! -- <filename> | git apply
这通常比使用git checkout
更好,因为自创建存储以来,您不会丢失对文件所做的任何更改。