在混帐中,有没有办法显示未跟踪的存储文件,而不应用存储?

如果我运行git stash -u ,我可以隐藏未跟踪的文件。 但是,未跟踪的文件根本不会显示出来,用git stash show stash@{0} 。 有什么方法可以显示未跟踪的隐藏文件,而不应用隐藏?

未追踪的文件存储在隐藏提交的第三个父级。 (这实际上并没有logging,但是从引入了-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}: :)不包含来自第三个“unstaged”父级的任何更改。

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

您可以使用以下命令列出所有隐藏提交:

 git rev-list -g stash 

由于stash被表示为HEAD,索引和未跟踪文件的父级“根”提交的三向合并提交,未跟踪的文件stash可通过将上述输出pipe道化为以下内容来列出:

 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来查看文件的内容。

find一个特定的文件

 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 

要查看存储中的所有文件(包括跟踪和未跟踪),我将这个别名添加到我的configuration中:

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

它需要一个你想查看隐藏的参数 。 请注意,它仍将以两个背靠背列表的forms呈现。

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

要列出隐藏的未跟踪文件:

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

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

git show stash@{0}^3


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

这个工程的原因是, git stash创build一个每个隐藏的合并提交,可以被引用为stash@{0}stash@{1}等。这个提交的第一个父母是隐藏时的头,第二个父级包含对跟踪文件的更改,第三个(可能不存在)对未跟踪文件的更改。

这部分在“讨论”的手册中有所解释。

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

git add .
git stash save

注意:这种方式也赋予function增加交互部分, 这里是如何 。
小心:确保您以前没有上过工作,否则您将无法区分它。
这可能是有用的。