如何在Git中预览stash的内容?

840

我想检查一个stash,并找出如果将其应用到当前状态的工作树中会对其进行哪些更改。

我知道可以在stash上执行git diff,但这将显示工作树和stash之间的所有差异,而我只想知道stash apply将要更改的内容。


8
彩色差异输出:git stash show -p stash@{1} >~/.diff && vim ~/.diff(不必使用 vim,只要您的文本编辑器支持 diff 输出的语法高亮显示即可)。 - Trevor Boyd Smith
1
请注意,如果您使用的是Visual Studio,实际上您可以从Git更改窗口中双击存储条目以预览stash pop所做的更改。 - bobobobo
18个回答

4

我使用这个工具来查看所有的存储库,并进行颜色差异突出显示(在 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:查看未应用的存储内容而不应用存储)


4

查看存储的更改列表

git stash list

查看特定存储中更改的文件列表

git stash show -p stash@{0} --name-only

查看Stash中的特定文件

git show stash@{0} path/to/file

4

我喜欢gitk能够准确地显示未跟踪或存储在索引中的内容,但默认情况下,它会在当前分支的所有其他提交中显示这些贮藏的“提交”。

诀窍是按以下方式运行gitk:

gitk "stash@{0}^!"

(The quoting is there to make it work in Powershell but this way it should still work in other shells as well.)
如果您在gitrevisions帮助页面中查找此语法,您会发现以下内容:
r1^!符号包括提交r1,但不包括其所有父项。单独使用此符号表示单个提交r1。
这显然会将gitk置于仅显示所选提交的直接父级的模式中,这正是我想要的。
如果您想进一步列出所有的储藏,那么您可以运行以下命令:
gitk `git stash list '--pretty=format:%gd^!'`

如果您使用的是Bash,则反引号内的单引号是必需的,否则Bash会抱怨感叹号。

如果您使用的是Windows和cmd或Powershell:

gitk "--argscmd=git stash list --pretty=format:%gd^!"

3

2
有用的知识。尽管他们特别询问了关于git的问题,而不是关于特定产品的问题。 - Jeremy Caney

3
您可以通过以下命令查看所有存储列表:
$ 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

最新的stash是第一个。

您可以简单地选择上面列表中提供的stash的索引n,并使用以下命令查看存储的详细信息:

git stash show -p stash@{3}

同样地,
git stash show -p stash@{n}

您可以使用以下命令来检查diff差异:
git diff HEAD stash@{n} -- /path/to/file

2

有几个答案提到了在git stash show命令中使用-p(或--patch)标志。

然而,值得一提的是,当显示Git存储时(即git stash show stash@{0}),您也可以通过使用git config将其设置为默认行为:

git config --global stash.showPatch true

…或在你的.gitconfig文件中:

[stash]
  showPatch = true

这将使git stash show默认的行为类似于git show。如果您只想查看差异统计信息(即添加/删除的行的概述),则仍然可以通过--stat标志查看(与git show一样):

git stash show --stat stash@{0}

2
首先,我们可以使用 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>...]'

可能的原因是 shell 吞掉了花括号,导致 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.

1

显示所有存储

仅文件名:

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向前)和 b向后)翻页,并按 q 关闭当前隐藏的分页器。如果您更愿意将其保存在文件中,则在命令后添加 > stashes.diff 即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接