如何在Git中预览隐藏内容?

我想检查一个藏匿点,并找出如果我将其应用于当前状态的工作树,它会做什么更改。

我知道我可以对stash做一个git diff,但这向我展示了工作树和stash之间的所有差异,而我只是想知道stash应用程序会发生什么变化。

153138 次浏览

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

git stash show -p

如果您感兴趣的stash不是最新的,请将stash的名称添加到命令的末尾:

git stash show -p stash@{2}

要查看当前的stash列表:

git stash list

你会看到这样的列表:

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

要查看任何这些藏匿的差异:

git stash show -p stash@{n}

我是gitk可视化git repos的图形UI的粉丝。您可以查看隐藏的最后一项:

gitk stash

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

gitk stash@{2}

在下面的屏幕截图中,你可以看到左上角的stash是一个提交,它在提交历史记录中的时间和地点,右下角的修改文件列表,以及左下角的逐行差异。而stash仍然隐藏着。

gitk查看存储

我用它来查看我所有的藏品,并使用颜色差异突出显示(在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的情况下查看stash中的内容

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

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

git stash show -p stash@{0}

要查看未弹出存储中某个特定文件的更改:

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

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

$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>...]'

这样做的原因可能是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.

您可以通过以下命令查看所有存储列表:

$ 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

显示所有藏品

仅文件名:

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输出,您可以使用空间向前)和b倒退)和q来关闭当前存储的寻呼机。如果您希望将其放在文件中,请将> stashes.diff附加到命令中。

查看隐藏更改列表

git stash list

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

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

用于查看stash中的特定文件

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

是的,查看修改内容的最佳方法是保存在这样的文件中:

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

当这个问题第一次被问到时,这可能不是一个选项,但是,如果您使用PyCharm,您可以使用UnStash Changes工具(VCS->Git->UnStash更改…)。这允许您查看隐藏的更改列表,以及弹出、删除、清除或应用(如果需要,可以应用到新分支中):

取消存储更改窗口

并查看每个藏匿更改的文件:

路径影响窗口

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

在此处输入图片描述

除了现有的答案之外,建议使用(显示第三个到最后一个藏匿的差异)

git stash show -p stash@{2}

请注意,在git-stash留档中,写到

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

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

git stash show -p 2

这也应该避免一些Powershell问题

我喜欢gitk如何准确地显示未跟踪或位于索引中的内容,但默认情况下,它会在当前分支上所有其他提交的中间显示这些隐藏“提交”。

诀窍是运行gitk,如下所示:

gitk "stash@{0}^!"

(引用是为了使它在Powershell中工作,但这样它也应该在其他shell中工作。

如果您在git修订帮助页面中查找此语法,您会发现以下内容:

r1^!表示法包括提交r1,但不包括其所有父级。此表示法本身表示单个提交r1

这显然会使gitk处于这样一种模式,即只显示所选提交的直接父母,这正是我喜欢的。


如果你想更进一步并列出所有藏匿,那么你可以运行:

gitk `git stash list '--pretty=format:%gd^!'`

(反引号中的单引号是安抚Bash所必需的,否则它会抱怨感叹号)

如果您在Windows上并使用cmd或Powershell:

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

以下命令可用于根据任何其他存储或提交、分支或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} master

仅显示文件名而不显示更改的差异:

git diff --name-only stash@{0} master

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

git diff stash@{0}^1 stash@{0} -- <filename>
  1. git difftool

命令git-diff也可用于查找差异 选定的存储和选定的提交或分支或存储

查看最近两个藏匿之间的区别:

git difftool stash@{0} stash@{0}^1


git difftool --dir-diff stash@{0} stash@{0}^1

总结:

用于从所选存储中提取差异的命令:git stash showgit showgit diffgit 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/

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

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

您可以使用gitlen扩展查看VSCode中隐藏的更改

gitlen存储的截图

有几个答案提到了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 show -p <index number of stash stack>

要查找索引号:

git stash list

示例:git stash show -p 1