Answers:
在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-parse联机帮助页rev^!
,在“指定范围”部分中)。
同样,您可以使用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 checkout
手册页。它不能将文件拖放到另一个位置。在下面有对此的引用:stackoverflow.com/questions/888414/…–
git checkout
方法从存储中复制了确切的文件-不会像git stash apply
将文件与工作目录中的文件合并一样。(因此,如果您在创建存储的基础上进行了任何更改,则这些更改将丢失)。
git stash apply
合并自文件保存以来在工作树中已修改的文件中的更改,必须暂存工作树中的该文件。为了使自动合并生效,不能在工作副本和要合并的隐藏副本中修改相同的文件。最后,隐藏存储不会像从存储库中删除项目一样git stash pop
。
有一个简单的方法可以从任何分支(包括存储)获取更改:
$ git checkout --patch stash@{0} path/to/file
如果要在许多部分进行修补,则可以省略文件规范。或省略补丁(但不删除路径)以将所有更改更改为单个文件。如果您有多个,请0
用中的存储号替换git stash list
。请注意,这就像diff
,并提供了应用分支之间所有差异的功能。要仅通过一次提交/存储获得更改,请查看git cherry-pick --no-commit
。
git help checkout
。--patch
进行交互式合并,它将应用您在shell中批准的任何块(如果选择e
删除补丁,则保存任何块)。就像我写的那样,仅路径会覆盖文件“所有更改”。
git config --global alias.applydiffat '!git checkout --patch "$1" -- $(git diff --name-only "$1"^ "$1")'
-然后git applydiffat stash@{4}
只使用在存储库及其父目录之间更改的文件。
要查看整个文件: git show stash@{0}:<filename>
要查看差异: git diff stash@{0}^1 stash@{0} -- <filename>
diff
为difftool
以使用您喜欢的外部差异。
$ git checkout stash@{0} -- <filename>
笔记:
确保在“-”和文件名参数之后放置空格
用您的特定存储号替换零(0)。要获取存储列表,请使用:
git stash list
基于JakubNarębski的答案 -较短的版本
如果隐藏的文件需要与当前版本合并,请使用之前使用diff的方法。否则,您可能会使用git pop
它们来隐藏git add fileWantToKeep
文件,暂存文件,并执行git stash save --keep-index
,以存放除了舞台上的内容以外的所有内容。请记住,这种方式与以前的方式的不同之处在于,它从存储中“弹出”文件。先前的答案会保留它,git checkout stash@{0} -- <filename>
以便根据您的需要进行操作。