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

Max*_*asy 87 git git-stash

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

Wil*_*mer 106

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

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

git show stash@{0}^3
Run Code Online (Sandbox Code Playgroud)

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

git show stash@{0}^3:
Run Code Online (Sandbox Code Playgroud)

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

git show stash@{0}^3:<path/to/file>
Run Code Online (Sandbox Code Playgroud)

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

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

  • 请注意,您得到一个丑陋的错误(`致命的:模棱两可的说法"藏匿@ {0} ^ 3":未知修订或路径不在工作tree.`)如果你*不*实际上有在藏匿未跟踪文件(但是以为你做了). (4认同)
  • @antak:不,`git stash show` 不会*不*显示未跟踪的文件(至少在 git 2.7.4 中是这样): (2认同)
  • 注意(2.13.2-linux): `git stash pop` 将首先尝试恢复未跟踪的文件,然后尝试恢复跟踪的文件。如果后一个操作失败(例如冲突),则第一个操作不会回滚(untracked-file-stash 将保持原样,但文件不会从磁盘中删除),因此即使修复冲突,下一个弹出操作也会失败反正。 (2认同)

Ste*_*eve 20

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

git rev-list -g stash
Run Code Online (Sandbox Code Playgroud)

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

git rev-list -g stash | git rev-list --stdin --max-parents=0
Run Code Online (Sandbox Code Playgroud)

以上有用的应用:

仅显示未跟踪,隐藏的文件

git rev-list -g stash | git rev-list --stdin --max-parents=0 | xargs git show --stat
Run Code Online (Sandbox Code Playgroud)

当然,删除--stat以查看文件的内容.

查找特定文件

git rev-list -g stash | xargs -n1 git ls-tree -r | sort -u | grep <pattern>
Run Code Online (Sandbox Code Playgroud)

Grep未跟踪文件

git rev-list -g stash | git rev-list --stdin --max-parents=0 | xargs git grep <pattern>
Run Code Online (Sandbox Code Playgroud)

列出所有藏匿的所有内容

git rev-list -g stash | git rev-list --stdin | xargs git show --stat
Run Code Online (Sandbox Code Playgroud)


Von*_*onC 18

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

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

git stash show 0
Run Code Online (Sandbox Code Playgroud)

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

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

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

git stash show 0
Run Code Online (Sandbox Code Playgroud)

git stash show男子学会了选择性地显示藏匿处未追踪的部分。

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

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

签字人:刘丹东

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

但是,由于未跟踪的文件存储在存储条目的第三个父级中,而不是存储条目本身,因此运行( man )不会将未跟踪的文件作为差异的一部分包含在内。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>]
Run Code Online (Sandbox Code Playgroud)

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

--no-include-untracked

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

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

--only-untracked

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


并且您有一个与这些新选项相匹配的配置:

stash show: 学习stash.showIncludeUntracked

签字人:刘丹东

之前的提交教导了男人。 用户可能希望能够始终启用该行为。 教授配置选项,该选项允许用户以与 类似的方式执行此操作。git stash show --include-untracked
--include-untracked
stash.showIncludeUntrackedstash.showPatch

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

stash.showIncludeUntracked

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

默认为 false。

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

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


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

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

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

签字人:刘丹东

( 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 showstash.showIncludeUntracked:即使diff给出选项也使用

签字人:刘丹东

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

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

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

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

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

默认为false.

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

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

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


wis*_*cky 8

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

stash@{2}

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

git stash


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

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

这部分在"讨论"下联机帮助页中进行了解释.


Ran*_*all 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 -"
Run Code Online (Sandbox Code Playgroud)

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

如果没有传递,该if...fi部分会将 bash 参数$1更改为 0。


wes*_*man 6

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

git add .
git stash save
Run Code Online (Sandbox Code Playgroud)

注意:这种方式也提供了添加交互部分的能力,这里是.
注意:确保您之前没有上演过的作品,否则您将无法区分它。
这可能有用。