我经常把工作放在后面,然后其他东西出现,几周后,我想检查存储,看看如果我将它应用到当前状态的工作树会产生什么变化。
我知道我可以在 stash 上做一个 git diff,但这向我展示了工作树和 stash 之间的所有差异,而我只是想知道 stash 应用会发生什么变化。
我怎样才能做到这一点?
git stash show
将向您显示最近存储中更改的文件。您可以添加-p
选项以显示差异。
git stash show -p
如果您感兴趣的存储不是最新的,则将存储的名称添加到命令的末尾:
git stash show -p stash@{2}
要查看当前的存储列表:
git stash list
你会看到这样的列表:
stash@{0}: WIP on ...
stash@{1}: ...
stash@{2}: ...
...
要查看任何这些存储的差异:
git stash show -p stash@{n}
我是gitk
可视化 git repos 的图形 UI 的粉丝。您可以查看隐藏的最后一项:
gitk stash
您还可以使用查看任何隐藏的更改(如 列出的git stash list
)。例如:
gitk stash@{2}
在下面的屏幕截图中,您可以在左上角看到 stash 作为提交,它在提交历史中的来源和时间,右下角的修改文件列表,以及下方的逐行差异-剩下。一直以来,藏匿处仍然藏着。
要查看未弹出的存储中的所有更改:
git stash show -p stash@{0}
要查看未弹出的存储中某个特定文件的更改:
git diff HEAD stash@{0} -- path/to/filename.php
除了 gitk 建议之外,是否可以在 git 中预览存储内容?您可以安装tig并调用tig stash
. 这个免费/开放的控制台程序还允许您选择要比较的存储
我用它来查看我所有的带有颜色差异突出显示的存储(在 Fedora 21 上):
git stash list |
awk -F: '{ print "\n\n\n\n"; print $0; print "\n\n";
system("git -c color.ui=always stash show -p " $1); }' |
less -R
是的,查看修改内容的最佳方法是保存在这样的文件中:
git stash show -p stash@{0} > stash.txt
以下命令可用于提取隐藏更改与任何其他存储或提交或分支或 HEAD 的差异。
git stash show
git show
git diff
git difftool
让我们看看,我们如何使用上述每个命令。
git stash show
简单的命令 git stash show 给出了文件更改的非常简短的摘要,但不会显示更改与当前 HEAD 的差异。
命令 git-show 用于查看各种类型的对象。
命令 git-show 不仅用于可视化存储更改,还用于查看一个或多个对象,如 blob、树、标签和提交。
命令 git-diff 也是常用命令之一,用于显示提交、提交和工作树等之间的更改。
默认情况下,除非指定了其他存储引用或提交,否则 git diff 将显示所选存储与(修改的文件)存储库当前状态的差异。
stash@{0}
要获得最顶层存储和master
分支之间的差异:
git diff stash@{0} master
仅显示文件名而不是更改的差异:
git diff --name-only stash@{0} master
查看所选文件的所选存储之间的差异:
git diff stash@{0}^1 stash@{0} -- <filename>
git difftool
命令 git-difftool 也可用于查找所选存储与所选提交或分支或存储之间的差异
查看最近两次存储之间的区别:
git difftool stash@{0} stash@{0}^1
git difftool --dir-diff stash@{0} stash@{0}^1
概括:
从所选存储中提取差异有用的命令:git stash show
, git show
, git diff
, git difftool
.
使用命令查看差异git stash show
,
git stash show -p stash@{0}
使用命令查看存储中的更改git show
,
git show stash@{1}
使用命令查看最新存储和选定提交之间的区别git diff
,
git diff stash@{0} <commit-hash>
参考:
https://howto.lintel.in/how-to-see-stashed-changes-using-git-stash/
您可以通过以下命令查看所有 stash 的列表:
$ git stash list
stash@{0}: WIP on dev: ddd4d75 spelling fix
stash@{1}: WIP on dev: 40e65a8 setting width for messages
......
......
......
stash@{12}: WIP on dev: 264fdab added token based auth
最新的存储是第一个。
您可以简单地选择n
上面列表中提供的存储索引并使用以下命令查看存储详细信息
git stash show -p stash@{3}
相似地,
git stash show -p stash@{n}
您还可以使用以下命令检查差异:
git diff HEAD stash@{n} -- /path/to/file
View list of stashed changes
git stash list
For viewing list of files changed in a particular stash
git stash show -p stash@{0} --name-only
For viewing a particular file in stash
git show stash@{0} path/to/file
除了建议使用的现有答案(显示倒数第三个存储的差异)
git stash show -p stash@{2}
请注意,在git-stash
文档中,它写道
也可以通过仅指定存储索引来引用存储(例如,整数
n
等价于stash@{n}
)。
因此也可以使用(相当于上面的命令)
git stash show -p 2
这也应该避免一些 Powershell 问题。
首先我们可以使用 git stash list 来获取所有的存储项:
$git stash list
stash@{0}: WIP on ...
stash@{1}: WIP on ....
stash@{2}: WIP on ...
然后我们可以利用git stash show stash@{N}
来检查特定 stash 下的文件N
。如果我们解雇它,那么我们可能会得到:
$ git stash show stash@{2}
fatal: ambiguous argument 'stash@2': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'
造成这种情况的原因可能是外壳正在吃掉花括号,而 git 看到stash@2
而不是stash@{2}
. 为了解决这个问题,我们需要对大括号使用单引号:
git stash show stash@'{2'}
com/java/myproject/my-xml-impl.xml | 16 ++++++++--------
com/java/myproject/MyJavaClass.java | 16 ++++++++--------
etc.
我喜欢如何gitk
准确地向您显示未跟踪或位于索引中的内容,但默认情况下,它会在当前分支上的所有其他提交中间显示那些存储“提交”。
诀窍是按如下方式运行 gitk:
gitk "stash@{0}^!"
(引用是为了让它在 Powershell 中工作,但这样它也应该在其他 shell 中工作。)
如果您在gitrevisions 帮助页面中查找此语法,您会发现以下内容:
该
r1^!
符号包括提交r1但不包括其所有父项。该符号本身表示单个提交r1。
这显然会使 gitk 处于仅显示所选提交的直接父级的模式,这正是我喜欢的。
如果您想更进一步并列出所有存储,那么您可以运行以下命令:
gitk `git stash list '--pretty=format:%gd^!'`
(反引号内的那些单引号是安抚Bash所必需的,否则它会抱怨感叹号)
如果您在 Windows 上并使用 cmd 或 Powershell:
gitk "--argscmd=git stash list --pretty=format:%gd^!"
仅文件名:
for i in $(git stash list --format="%gd") ; do echo "======$i======"; git stash show $i; done
所有存储中的完整文件内容:
for i in $(git stash list --format="%gd") ; do echo "======$i======"; git stash show -p $i; done
您将获得彩色差异输出,您可以使用space ( forward ) 和b( backwards ) 进行分页,并q关闭当前存储的分页器。如果您希望将其保存在文件中,请附加> stashes.diff
到命令中。
几个答案都提到了-p
(或--patch
)标志git stash show
但是,可能还值得一提的是,您可以在显示 Git 存储(即。git stash show stash@{0}
)时将此设置为默认行为,方法是使用git config
:
git config --global stash.showPatch true
...或在您的 .gitconfig 文件中:
[stash]
showPatch = true
这使得默认情况下的git stash show
行为git show
。如果您确实只想查看 diffstat(即添加/删除的行的摘要),您仍然可以通过--stat
标志看到它(再次,如 with git show
):
git stash show --stat stash@{0}