127

如果我运行git stash -u,我可以存储未跟踪的文件。但是,所述未跟踪文件根本不会显示为git stash show stash@{0}. 有没有办法在不应用存储的情况下显示未跟踪的隐藏文件?

4

7 回答 7

159

未跟踪的文件存储在存储提交的第三个父级中。(这实际上并没有记录,但是从引入 -u 功能的提交中很明显, 787513...,以及其他有关短语的文档的git-stash方式...或只是通过做git log --graph 'stash@{0}'

您可以通过以下方式仅查看存储的“未跟踪”部分:

git show 'stash@{0}^3'

或者,只是“未跟踪”树本身,通过:

git show 'stash@{0}^3:'

或者,树中的特定“未跟踪”文件,通过:

git show 'stash@{0}^3:<path/to/file>'

不幸的是,没有很好的方法来总结所有暂存+未暂存+未跟踪与“当前”状态之间的差异。即:git show 'stash@{0}'不能包含未跟踪的文件。这是因为存储提交本身的树对象(称为stash@{0}:)不包括来自第三个“未暂存”父级的任何更改。

这是由于重新应用存储的方式:跟踪的文件可以很容易地作为补丁应用,而未跟踪的文件在理论上只能作为“整个文件”应用。

于 2012-10-01T22:12:33.847 回答
27

您可以使用以下命令列出所有存储提交:

git rev-list -g stash

由于存储被表示为 HEAD、索引和未跟踪文件的无父“根”提交的 3 路合并提交,因此可以通过将上述输出传递到以下内容来列出未跟踪文件存储:

git rev-list -g stash | git rev-list --stdin --max-parents=0

上述有用的应用:

仅显示未跟踪的隐藏文件

git rev-list -g stash | git rev-list --stdin --max-parents=0 | xargs git show --stat

当然,去掉 就--stat可以看到文件的内容了。

查找特定文件

git rev-list -g stash | xargs -n1 git ls-tree -r | sort -u | grep <pattern>

grep 未跟踪的文件

git rev-list -g stash | git rev-list --stdin --max-parents=0 | xargs git grep <pattern>

列出所有 stash 的所有内容

git rev-list -g stash | git rev-list --stdin | xargs git show --stat
于 2014-05-17T13:55:04.320 回答
15

要列出存储中未跟踪的文件:

git ls-tree -r stash@{0}^3 --name-only

要显示所有未跟踪文件(包含内容)的完整差异:

git show stash@{0}^3

这些命令读取最后(最近的)存储。对于较早的存储,增加“stash@”后面的数字,例如stash@{2}从最后一个存储开始的第二个。

这样做的原因是git stash为每个存储创建一个合并提交,可以引用为stash@{0}stash@{1}。此提交的第一个父级是存储时的 HEAD,第二个父级包含对跟踪文件的更改,并且第三(可能不存在)对未跟踪文件的更改。

这在“讨论”下的联机帮助页中有部分解释。

于 2015-08-04T01:04:33.493 回答
8

但是,所述未跟踪文件根本不会显示为git stash show stash@{0}.

注意:自 Git 2.11(2016 年第四季度,OP 后 4 年)以来,您只能使用其索引来引用 stash

git stash show 0

git stash由于用 C 重写,最近出现了一个错误,已在 Git 2.22(2019 年第二季度)中修复

有没有办法在不应用存储的情况下显示未跟踪的隐藏文件?

为什么,是的,有 Git 2.32(2021 年第二季度,OP 后 9 年)。

" git stash show" ( man )学会了选择性地显示隐藏的未跟踪部分。

请参阅Denton Liu ( )的commit 0af760ecommit d3c7bf7 (03 Mar 2021 ) 。(由Junio C Hamano 合并 -- --提交 f5c73f6中,2021 年 3 月 22 日)Denton-L
gitster

stash show: 教--include-untracked--only-untracked

签字人:Denton Liu

可以通过( man )对未跟踪的文件进行存储条目。git stash push --include-untracked

但是,由于未跟踪的文件存储在 stash 条目的第三个父项中,而不是 stash 条目本身,因此运行( man )不会将未跟踪的文件包含在 diff 中。git stash show

使用--include-untracked,除了在存储库和存储库中的工作树之间有修改的路径之外,还会显示未跟踪的路径,如果存在,则记录在第三父级中。

可以手动制作格式错误的存储条目,其中存储条目中重复的未跟踪文件将掩盖跟踪文件。
在这种情况下,我们通过自定义unpack_trees()回调检测并出错:stash_worktree_untracked_merge().

此外,教 stash--only-untracked仅显示隐藏条目的未跟踪文件的选项。
这类似于( man ),但是为它提供一个方便的抽象是很好的,这样用户就不必考虑底层的实现。git show stash^3

git stash现在在其手册页中包含:

'git stash' show [-u|--include-untracked|--only-untracked] [<diff-options>] [<stash>]

git stash现在在其手册页中包含:

--no-include-untracked

pushandsave命令一起使用时,所有未跟踪的文件也会被隐藏,然后使用 git clean.

show命令一起使用时,将存储条目中未跟踪的文件显示为差异的一部分。

--only-untracked

此选项仅对show命令有效。
仅在 stash 条目中显示未跟踪的文件作为 diff 的一部分。


而且您有一个配置与这些新选项一起使用:

stash show: 学stash.showIncludeUntracked

签字人:Denton Liu

先前的提交教。 用户可能希望能够始终启用该行为。 教授允许用户以与.git stash show --include-untracked
--include-untracked
stash.showIncludeUntrackedstash.showPatch

git config现在在其手册页中包含:

stash.showIncludeUntracked

如果设置为 true,git stash show则不带选项的命令将显示存储条目的未跟踪文件。

默认为假。

git stash现在在其手册页中包含:

您可以使用stash.showIncludeUntrackedstash.showStatstash.showPatchconfig 变量来更改默认行为。


使用 Git 2.32(2021 年第二季度),当这些选项用于不记录未跟踪部分的存储条目时,处理最近添加到“ git stash showman中未跟踪部分周围的选项的代码会出现段错误。

请参阅Denton Liu ( ) 的commit 1ff595dcommit aa2b05d(2021 年 5 月 12 日(由Junio C Hamano 合并 -- --提交 a8a2491中,2021 年 5 月 16 日)Denton-L
gitster

stash show:修复段错误--{include,only}-untracked

签字人:Denton Liu

( man )( man )在不包含未跟踪条目的存储上运行时,会发生段错误。git stash show --include-untrackedgit stash show --only-untracked

发生这种情况是因为我们没有检查未跟踪的条目是否实际存在,只是试图盲目地取消引用它。

确保在实际尝试取消引用之前存在未跟踪的条目。

和:

请参阅Denton Liu ( ) 的提交 af5cd44(2021 年 5 月 21 日(由Junio C Hamano 合并 -- --提交 378c7c6中,2021 年 5 月 22 日)Denton-L
gitster

stash show:stash.showIncludeUntracked即使diff给定选项也使用

签字人:Denton Liu

如果向( man )提供了有关如何显示差异的选项,该命令将忽略配置变量,默认不显示任何未跟踪的文件。 这是不直观的行为,因为 diff 输出的格式以及是否显示未跟踪的文件是正交的。git stash showstash.showIncludeUntracked

stash.showIncludeUntracked即使给出了差异选项,也可以使用。
当然,这仍然可以通过命令行选项覆盖。

更新文档以明确说明在给出差异选项时将覆盖哪些配置变量。

git config现在在其手册页中包含:

如果设置为true,该git stash show命令将显示存储条目的未跟踪文件。

默认为false.

git stash现在在其手册页中包含:

如果没有<diff-option>提供,默认行为将由stash.showStat, 和stash.showPatchconfig 变量给出。

您也可以使用stash.showIncludeUntracked设置是否 --include-untracked默认启用。

于 2021-03-27T12:37:53.640 回答
6

解决方法:在存储文件之前暂存文件git stash show -p将按预期工作。

git add .
git stash save

注意:这种方式也可以增加互动部分,这里是如何
注意:确保您之前没有上演过的作品,否则您将无法区分它。
这可能有用。

于 2016-10-07T10:11:51.480 回答
6

要查看存储中的所有文件(已跟踪和未跟踪),我将此别名添加到我的配置中:

showstash = "!if test -z $1; then set -- 0; fi; git show --stat stash@{$1} && git show --stat stash@{$1}^3 2>/dev/null || echo No untracked files -"

它需要一个参数来说明您要查看哪个存储。请注意,它仍会在两个背靠背列表中显示它。

如果未传递任何参数,则该if...fi部分将 bash 参数$1 更改为 0。

于 2016-06-08T22:50:52.480 回答
0

我在 2.32 下使用 git 找到并使用未跟踪文件的正确存储时遇到了麻烦。

我使用该命令来查找包含未跟踪文件和日期的存储:

git rev-list -g stash | git rev-list --stdin --max-parents=0 | xargs git show --stat

在我使用另一个命令显示带有日期的存储列表以便找到具有特定日期的正确存储位置之后:

git stash list --date=local

之后,我再次使用git stash list以查找存储的名称并将其应用到git stash apply.

这对我有用。我希望这对其他人有用!

于 2021-07-07T13:24:47.300 回答