在git中,有没有一种方法可以显示未跟踪的隐藏文件而无需应用隐藏功能?


100

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

Answers:


121

未跟踪的文件存储在隐藏提交的第三个父级中。(这实际上没有记录,但是从The commit引入了-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}:不包含第三个“未暂存”父对象的任何更改。

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


因此,隐式提交的父级是(1.针对2.进行提交隐式存储。索引3.未跟踪的工作副本),并且隐式提交本身包含跟踪的工作副本吗? git stash show似乎显示了工作副本和#1之间的差异(来自git-stash.sh:的相关代码git diff ${FLAGS:---stat} $b_commit $w_commit,其中$ b_commit是#1,而$ w_commit是隐藏提交);是否有任何内置方法git stash show来包含#3?
Max Nanasy 2012年

正如您所说,我还没有找到一种方式来获取存储的单个摘要视图,但是您可以通过以下命令在一个命令中查看其完整信息:git log --graph --topo-order -m -umatthewlmcclure.com/s/2014/01/10/…–
Matt McClure

4
请注意,你得到一个丑陋的错误(fatal: ambiguous argument 'stash@{0}^3': unknown revision or path not in the working tree.),如果你确实有未跟踪文件在藏匿(但以为你做到了)。
兰德尔

2
@antak:不,git stash show显示未跟踪文件(存在于至少git的2.7.4):
诺伯特Bérci

1
注意(2.13.2-linux):git stash pop将首先尝试还原未跟踪的文件,然后尝试还原跟踪的文件。如果后一个操作失败(例如,冲突),则第一个操作不会回滚(untracked-file-stash将保持原样,但不会从磁盘上删除文件),因此,即使您解决了冲突,下一个弹出操作也会失败无论如何。
Marinos

22

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

git rev-list -g stash

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

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

10

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

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

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

git show stash@{0}^3

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

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

手册中“讨论”部分对此做了部分解释。


5

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

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

它只需要一个参数您要查看哪个存储区的。请注意,它仍然会在两个背对背列表中显示它。

如果未传递bash参数 $ 1,则本if...fi将其更改为0。


5

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

git add .
git stash save

注意:这种方式也可以增加交互部分的力量,这就是方法
警告:请确保您之前没有上演过的工作,否则您将无法区分它。
这可能有用。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.