是否可以预览git中的隐藏内容?


554

我经常将工作放到以后,然后再进行其他处理,几周后,我想检查存储库,并找出如果将其应用于当前状态的工作树会对其进行哪些更改。

我知道我可以在存储区上执行git diff,但这向我展示了工作树和存储区之间的所有差异,而我只是想知道存储区将要应用的变化。

我怎样才能做到这一点?


1
彩色diff输出:(git stash show -p stash@{1} >~/.diff && vim ~/.diff不必是vim任何文本编辑器,只要您的文本编辑器具有对diff输出的语法突出显示支持)。
Trevor Boyd Smith,

Answers:


727

git stash show会向您显示最近存储中已更改的文件。您可以添加-p选项以显示差异。

git stash show -p

如果您感兴趣的存储区不是最新存储区,请在命令末尾添加存储区的名称:

git stash show -p stash@{2}

看起来不错,我在手册中也看到了,但是当我尝试时,它给了我fatal: unable to create temp-file: Invalid argument-知道为什么吗?
Benjol 2010年

29
使用git stash show -p stash@{0}看具体的藏匿处。0显示最后一个音调,1显示倒数第二个音调。等等,git stash list将显示所有可用音调。
brita_

6
如果使用PowerShell,则必须将存储名称放在引号中。(即git stash show -p 'stash@{0}'
:)


1
如果要保存文件差异,请使用git stash show -p stash@{0}> stash.txt
-S_K

87

要查看当前的存储列表:

git stash list

您会看到这样的列表:

stash@{0}: WIP on ...
stash@{1}: ...
stash@{2}: ...
...

要查看这些存储中的任何内容的差异:

git stash show -p stash@{n}

34

我是gitk的图形用户界面的粉丝,可以直观地查看git repos。您可以查看存放在以下位置的最后一项:

gitk stash

您还可以使用查看任何隐藏的更改(由列出git stash list)。例如:

gitk stash@{2}

在下面的屏幕截图中,您可以在左上角看到该存储区作为提交,它在提交历史记录中的时间和位置,在右下方显示了修改的文件列表,在下部显示了逐行差异-剩下。所有的东西都还藏起来了。

gitk viewing a stash


5
您可以stash@{X}在命令行上提供多个值以一次查看更多结果,但是我还没有找到一种简单的方法来在gitk中说“显示所有存储项”。
nobar 2014年

5
gitk stash似乎gitk stash@{0}
简而言之

3
以显示gitk中的所有存储,您可以使用gitk `git stash list --pretty=format:%gd`然后搜索“ WIP on”以跳转到下一个存储。
IkarPohorský16年

2
gitk --reflog让您看到所有的藏匿处,以及更多。
nobar

1
gitk是唯一一个直接向我显示存储项中保存了未跟踪文件的工具。所有其他人都只是告诉我“没有差异”。
马丁·邦纳

22

要查看未弹出的存储中的所有更改:

git stash show -p stash@{0}

要以未弹出的方式查看一个特定文件的更改:

git diff HEAD stash@{0} -- path/to/filename.php

万一忘记了文件名,它也适用于所有更改过的文件git diff HEAD stash @ {0}
Simeon

为了清楚起见:-p的缩写--patch。该选项来自git-diff。如果您喜欢长格式,则可以编写git stash show --patch
彼得诺

5

除了gitk中的建议之外,是否可以预览git中的隐藏内容?您可以安装tig并致电tig stash。这个免费/开放的控制台程序还允许您选择要比较的存储区


1
看起来是管理多个存储的完美工具!您也可以弹出掉落与储物箱P!分别键。
IkarPohorský16年

TUI替代方案总是很好,但是对于已经习惯或以某种方式更喜欢gitk 的人来说,破解它以显示所有隐藏项相对容易
1737973 '17


4

首次提出该问题时,可能不是一个选择,但是,如果您使用PyCharm,则可以使用该UnStash Changes工具(VCS-> Git-> UnStash Changes ...)。这使您可以查看隐藏的更改的列表,以及弹出,删除,清除或应用(如果需要,可以进入新分支):

取消隐藏更改窗口

并查看每个存储区更改的文件:

受影响的路径窗口

以及每个文件的差异。在差异中,您可以挑选单个更改以从隐藏的更改应用到工作分支(使用指向左的V形符号):

在此处输入图片说明


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

最新的存储是第一个。

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

git stash show -p stash@{3}

同样,

git stash show -p stash@{n}

您也可以使用以下命令检查diff:

git diff HEAD stash@{n} -- /path/to/file

3

是的,查看修改内容的最佳方法是将文件保存为:

git stash show -p stash@{0} > stash.txt

2

首先,我们可以使用git stash list获取所有存储项:

$git stash list
stash@{0}: WIP on ...
stash@{1}: WIP on ....
stash@{2}: WIP on ...

然后,我们可以利用git stash show stash@{N}来检查特定存储下的文件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.

2

查看隐藏的更改列表

git stash list

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

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

用于以隐藏方式查看特定文件

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

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

您将获得彩色的diff输出,可以使用spaceforward)和b向后q进行分页,并关闭当前存储区的分页器。如果您希望将其存储在文件中,请追加> stashes.diff到命令中。


1

除了建议使用的现有答案(显示倒数第二个隐藏的差异)

git stash show -p stash@{2}

请注意,在git-stash文档中,其写为

还可以通过仅指定存储索引来引用存储(例如,整数n等于stash@{n})。

因此也可以使用(这等效于上面的命令)

git stash show -p 2

这也应该避免一些Powershell问题


1

我喜欢 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^!"

0

以下命令可用于再次提取隐藏更改的差异,使其与任何其他隐藏,提交或分支或HEAD相同。

git stash show
git show
git diff
git difftool

让我们看看如何使用上述每个命令。

  1. git stash show

简单的命令git stash show给出了文件更改的非常简短的摘要,但不会显示与当前HEAD的更改差异。

  1. git show

git-show命令用于查看各种类型的对象。

git-show命令不仅用于可视化存储更改,而且还用于查看一个或多个对象(例如blob,树,标签和提交)。

  1. git diff

git-diff命令也是常用命令之一,用于显示提交,提交和工作树等之间的更改。

默认情况下,除非指定了其他隐藏引用或提交,否则git diff将显示所选存储与(已修改文件)存储库当前状态的差异。

要获得最高级的stash @ {0}和master分支之间的区别:

$ git diff stash @ {0}主

仅显示文件名称,不显示更改差异:

$ git diff-仅名称存储@ {0} master

查看选定文件的选定存储之间的差异:

$ git diff stash @ {0} ^ 1 stash @ {0}-

  1. 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}

参考文献:

https://howto.lintel.in/how-to-see-stashed-changes-using-git-stash/

https://git-scm.com/docs/git-show

https://git-scm.com/docs/git-stash

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.