我想检查一个stash,并找出如果将其应用到当前状态的工作树中会对其进行哪些更改。
我知道可以在stash上执行git diff,但这将显示工作树和stash之间的所有差异,而我只想知道stash apply将要更改的内容。
我使用这个工具来查看所有的存储库,并进行颜色差异突出显示(在 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:查看未应用的存储内容而不应用存储)
查看存储的更改列表
git stash list
查看特定存储中更改的文件列表
git stash show -p stash@{0} --name-only
查看Stash中的特定文件
git show stash@{0} path/to/file
我喜欢gitk
能够准确地显示未跟踪或存储在索引中的内容,但默认情况下,它会在当前分支的所有其他提交中显示这些贮藏的“提交”。
诀窍是按以下方式运行gitk:
gitk "stash@{0}^!"
gitk `git stash list '--pretty=format:%gd^!'`
如果您使用的是Bash,则反引号内的单引号是必需的,否则Bash会抱怨感叹号。
如果您使用的是Windows和cmd或Powershell:
gitk "--argscmd=git stash list --pretty=format:%gd^!"
$ 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}
git diff HEAD stash@{n} -- /path/to/file
有几个答案提到了在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}
$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.
仅文件名:
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
> stashes.diff
即可。
git stash show -p stash@{1} >~/.diff && vim ~/.diff
(不必使用vim
,只要您的文本编辑器支持diff
输出的语法高亮显示即可)。 - Trevor Boyd Smith