是否可以在git中预览藏匿内容?

时间:2010-08-26 09:08:06

标签: git git-stash

我经常将工作放在以后,然后其他东西出现,几周后,我想检查存储,并找出如果我将其应用于当前状态的工作树会发生什么变化。

我知道我可以在藏匿处做一个git diff,但是这显示了工作树和藏匿之间的所有差异,而我只是想知道什么存储应用会发生变化。

我该怎么做?

17 个答案:

答案 0 :(得分:616)

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

git stash show -p

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

git stash show -p stash@{2}

答案 1 :(得分:81)

查看当前的藏匿列表:

git stash list

您会看到如下列表:

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

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

git stash show -p stash@{n}

答案 2 :(得分:32)

我是gitk图形用户界面的粉丝,可视化git repos。您可以使用以下内容查看最后一项:

gitk stash

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

gitk stash@{2}

在下面的屏幕截图中,您可以在左上角看到存储作为提交,在提交历史记录中显示的时间和位置,右下角修改的文件列表以及逐行差异在左下角。隐藏的东西一直隐藏起来。

gitk viewing a stash

答案 3 :(得分:20)

要查看未弹出的藏匿处中的所有更改:

git stash show -p stash@{0}

要查看未弹出的藏匿处中某个特定文件的更改:

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

答案 4 :(得分:5)

Is it possible to preview stash contents in git?中的gitk建议外,您可以安装tig并致电tig stash。这个免费/开放控制台程序还允许您选择要比较的存储

答案 5 :(得分:3)

我使用它来查看所有带有颜色差异突出显示的藏匿处(在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: see what's in a stash without applying stash

答案 6 :(得分: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

答案 7 :(得分:2)

首先,我们可以使用git存储列表来获取所有存储项:

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

答案 8 :(得分:2)

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

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

答案 9 :(得分:2)

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

Unstash Changes Window

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

Paths Affected Window

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

enter image description here

答案 10 :(得分: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 forward )和 b 向后)进行分页)和 q 关闭当前藏匿的寻呼机。如果您希望将其包含在文件中,请将> stashes.diff附加到命令中。

答案 11 :(得分:1)

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

诀窍是如下运行gitk:

gitk "stash@{0}^!"

(有引号可以使它在Powershell中工作,但是通过这种方式,它仍然应该在其他Shell中工作。)

如果您在gitrevisions help page中查找此语法,则会发现以下内容:

  

r1^!表示法包括commit r1 ,但不包括其所有父代。就其本身而言,此表示法表示单个提交 r1

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


如果您想进一步介绍并列出所有存储,则可以运行以下命令:

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

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

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

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

答案 12 :(得分:1)

查看隐藏更改列表

git stash list

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

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

用于在藏匿处查看特定文件

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

答案 13 :(得分:0)

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

git stash show -p stash@{2}

请注意,在git-stash documentation中写着

  

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

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

git stash show -p 2

还应避免使用some Powershell issues

答案 14 :(得分:0)

以下命令可用于再次提取隐藏更改的差异,使其不影响任何其他存储,提交或分支或HEAD。

git stash show
git show
git diff
git difftool

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

  1. git隐藏显示
  

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

  1. git show
  

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

     

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

  1. git diff
  

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

     

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

要获取最高级存储@@ {0}与主分支之间的区别:

$ git diff stash @ {0}主用户

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

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

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

$ 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

答案 15 :(得分:0)

您可以使用gitlen extension

查看VSCode中的隐藏更改

screenshot of gitlen stashes

答案 16 :(得分:0)

几个答案都提到了 -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 标志看到它(同样,与 git show 类似):

git stash show --stat stash@{0}