ChatGPT解决这个技术问题 Extra ChatGPT

是否可以在 git 中预览存储内容?

我经常把工作放在后面,然后其他东西出现,几周后,我想检查存储,看看如果我将它应用到当前状态的工作树会产生什么变化。

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

我怎样才能做到这一点?

彩色差异输出:git stash show -p stash@{1} >~/.diff && vim ~/.diff(不必是 vim。任何文本编辑器,只要您的文本编辑器支持 diff 输出的语法突出显示)。
请注意,如果您使用 Visual Studio,您实际上只需双击 Git Changes 窗口中的 stash 条目即可预览 stash pop 所做的更改

W
Wayne Conrad

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

git stash show -p

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

git stash show -p stash@{2}

使用 git stash show -p stash@{0} 查看特定的存储。 0 显示最后一个音调,1 表示倒数第二个音调.. 等等。git stash list 将显示所有可用的音调。
如果您使用的是 PowerShell,则必须将存储名称放在引号中。 (即:git stash show -p 'stash@{0}'
如果您想在文件中保存差异,请使用 git stash show -p stash@{0}> stash.txt
在 2019 年,您只需输入 git stash show [-p] [stash index number]
m
mfaani

要查看当前的存储列表:

git stash list

你会看到这样的列表:

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

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

git stash show -p stash@{n}

J
Jeff Ward

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

gitk stash

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

gitk stash@{2}

在下面的屏幕截图中,您可以在左上角看到 stash 作为提交,它在提交历史中的来源和时间,右下角的修改文件列表,以及下方的逐行差异-剩下。一直以来,藏匿处仍然藏着。

https://i.stack.imgur.com/XyLyw.jpg


您可以在命令行上提供多个 stash@{X} 值以一次查看更多结果,但我还没有找到一种简单的方法来在 gitk 中说“显示所有存储条目”。
gitk stash 似乎是 gitk stash@{0} 的简写
要显示 gitk 中的所有存储,您可以使用 gitk `git stash list --pretty=format:%gd` 然后搜索“WIP on”以跳转到下一个存储。
gitk --reflog 可让您查看所有隐藏信息等。
gitk 是唯一直接向我显示存储区中保存有未跟踪文件的工具。所有其他人只是向我展示了“没有差异”。
V
Vadim Kotov

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

git stash show -p stash@{0}

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

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

万一不记得文件名,它也适用于所有更改的文件 git diff HEAD stash@{0}
为清楚起见:-p--patch 的缩写。该选项来自 git-diff。如果您喜欢长格式,您可以写 git stash show --patch
A
Anentropic

以下命令可用于提取隐藏更改与任何其他存储或提交或分支或 HEAD 的差异。

git stash show
git show
git diff
git difftool

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

git stash 显示

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

git 显示

命令 git-show 用于查看各种类型的对象。命令 git-show 不仅用于可视化存储更改,还用于查看一个或多个对象,如 blob、树、标签和提交。

混帐差异

命令 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>

混帐工具

命令 git-difftool 也可用于查找所选存储与所选提交或分支或存储之间的差异

查看最近两次存储之间的区别:

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


h
hlongmore

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

https://i.stack.imgur.com/Xm3ls.png

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

https://i.stack.imgur.com/AqefW.png

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

https://i.stack.imgur.com/r8ATv.png


谢谢你!我使用 PhpStorm 或 Intellij,我不知道这个功能。
C
Community

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


看起来像是管理多个存储的完美工具!您还可以分别使用 P!popdrop 存储。
TUI 替代品总是很好,但对于已经习惯或以某种方式更喜欢 gitk it is relatively easy to hack it to show all the stashes 的人来说。
W
Walterwhites

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

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

u
user202729

除了建议使用的现有答案(显示倒数第三个存储的差异)

git stash show -p stash@{2}

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

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

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

git stash show -p 2

这也应该避免some Powershell issues


C
Community

我用它来查看我所有的带有颜色差异突出显示的存储(在 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


B
Bharat Pahalwani

查看隐藏的更改列表

git stash list

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

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

用于查看存储中的特定文件

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

V
Vadim Kotov

您可以通过以下命令查看所有 stash 的列表:

$ 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 的索引 n 并使用以下命令查看 stashed 详细信息

git stash show -p stash@{3}

相似地,

git stash show -p stash@{n}

您还可以使用以下命令检查差异:

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

J
JBert

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

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

gitk "stash@{0}^!"

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

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

r1^!表示法包括提交 r1 但不包括其所有父项。该符号本身表示单个提交 r1。

这显然会使 gitk 处于仅显示所选提交的直接父级的模式,这正是我喜欢的。

如果您想更进一步并列出所有存储,那么您可以运行以下命令:

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

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

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

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

W
Wong Devrsion

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

screenshot of gitlen stashes


知道有用。不过,他们是专门在 git 中询问的,而不是在特定产品中询问。
a
akhil_mittal

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

造成这种情况的原因可能是 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.

N
Nick F

有几个答案提到了 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。如果您只是想查看 diffstat(即添加/删除的行的摘要),您仍然可以通过 --stat 标志看到它(再次,如 git show):

git stash show --stat stash@{0}

c
ccpizza

显示所有藏匿处

仅文件名:

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 (backwards) 进行分页,并且q 关闭当前存储的寻呼机。如果您希望将其保存在文件中,请将 > stashes.diff 附加到命令中。