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

时间:2012-10-01 21:40:26

标签: git git-stash

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

7 个答案:

答案 0 :(得分:98)

未跟踪的文件存储在存储提交的第三个父级中。 (这实际上没有记录,但是从The commit which introduced the -u feature, 787513...非常明显,以及rest of the documentation for 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}:)不包含来自第三个“未暂存”父级的任何更改。

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

答案 1 :(得分:19)

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

git rev-list -g stash

由于stashes表示为HEAD的3向合并提交,索引以及未跟踪文件的无父“root”提交,因此可以通过将上述输出汇总到以下内容来列出未跟踪的文件存储:

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>

列出所有藏匿的所有内容

git rev-list -g stash | git rev-list --stdin | xargs git show --stat

答案 2 :(得分:7)

列出藏匿处中未跟踪的文件:

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

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

git show stash@{0}^3

这些命令读取最后一个(最近的)存储。对于较早的藏匿处,请将&#34; stash @&#34;后面的数字增加,例如stash@{2},作为上一次藏匿的第二个。

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

部分解释了manpage under "Discussion"

答案 3 :(得分:4)

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

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 -"

您需要查看其中一个argument个藏匿处。请注意,它仍然会在两个背对背列表中显示。

如果没有传递if...fi部分changes the bash argument $ 1到0。

答案 4 :(得分:2)

<块引用>

但是,git stash show stash@{0} 根本不会显示上述未跟踪的文件。

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

git stash show 0

由于 git stash 用 C 重写,fixed in Git 2.22(2019 年第 2 季度)出现了一个更新的错误

<块引用>

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

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

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

参见commit 0af760ecommit d3c7bf7(2021 年 3 月 3 日),作者是Denton Liu (Denton-L)
(由 Junio C Hamano -- gitster --commit f5c73f6 合并,2021 年 3 月 22 日)

<块引用>

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

签字人:Denton Liu

<块引用>

可以通过 git stash push --include-untracked(man) 使用未跟踪的文件创建存储条目。

但是,由于未跟踪的文件存储在存储条目的第三个父项中而不是存储条目本身,因此运行 git stash show(man) 不包括未跟踪的文件作为差异的一部分。

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

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

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

git stash 现在包含在其 man page 中:

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

git stash 现在包含在其 man page 中:

<块引用>

--no-include-untracked

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

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

--only-untracked

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


而且你有一个配置来搭配这些新选项:

<块引用>

stash show:学习stash.showIncludeUntracked

签字人:Denton Liu

<块引用>

之前的提交教了git stash show --include-untracked(man)
用户可能希望始终启用 --include-untracked 行为。
教授 stash.showIncludeUntracked 配置选项,它允许用户以类似于 stash.showPatch 的方式执行此操作。

git config 现在包含在其 man page 中:

<块引用>

stash.showIncludeUntracked

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

默认为 false。

git stash 现在包含在其 man page 中:

<块引用>

您可以使用 stash.showIncludeUntrackedstash.showStatstash.showPatch 配置变量以更改默认行为。


在 Git 2.32(2021 年第 2 季度)中,处理最近添加到“git stash show(man) 的选项的代码围绕 stash 的未跟踪部分 segfaulted 当这些选项用于不记录未跟踪部分的存储条目时。

commit 1ff595dcommit aa2b05d(2021 年 5 月 12 日),作者 Denton Liu (Denton-L)
(2021 年 5 月 16 日在 Junio C Hamano -- gitster --commit a8a2491 合并)

<块引用>

stash show:使用 --{include,only}-untracked

修复段错误

签字人:Denton Liu

<块引用>

git stash show --include-untracked(man)git stash show --only-untracked(man) 在没有'不包括未跟踪的条目,则会发生段错误。

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

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

还有:

请参阅 commit af5cd44Denton Liu (Denton-L)(2021 年 5 月 21 日)。
(2021 年 5 月 22 日在 Junio C Hamano -- gitster --commit 378c7c6 合并)

<块引用>

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

签字人:Denton Liu

<块引用>

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

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

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

git config 现在包含在其 man page 中:

<块引用>

如果设置为 truegit stash show 命令将显示 隐藏条目的未跟踪文件。

默认为 false

git stash 现在包含在其 man page 中:

<块引用>

如果没有提供 <diff-option>,将给出默认行为 通过 stash.showStatstash.showPatch 配置变量。

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

答案 5 :(得分:1)

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

git add .
git stash save

注意:这种方式也为功能添加了交互式部分here is how 警告:确保您之前没有上班,或者您无法区分它。
这可能有用。

答案 6 :(得分: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 一起应用。

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