如果运行git stash -u
,则可以隐藏未跟踪的文件。但是,表示未跟踪的文件根本不会显示git stash show stash@{0}
。有什么方法可以在不应用隐藏的情况下显示未跟踪的隐藏文件?
如果运行git stash -u
,则可以隐藏未跟踪的文件。但是,表示未跟踪的文件根本不会显示git stash show stash@{0}
。有什么方法可以在不应用隐藏的情况下显示未跟踪的隐藏文件?
Answers:
未跟踪的文件存储在隐藏提交的第三个父级中。(这实际上没有记录,但是从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}:
不包含第三个“未暂存”父对象的任何更改。
这是由于重新应用隐藏方式所致:被跟踪的文件可以很容易地以补丁的形式应用,而从理论上讲,未跟踪的文件只能作为“整个文件”应用。
git log --graph --topo-order -m -u
。matthewlmcclure.com/s/2014/01/10/…–
fatal: ambiguous argument 'stash@{0}^3': unknown revision or path not in the working tree.
),如果你不确实有未跟踪文件在藏匿(但以为你做到了)。
git stash show
不不显示未跟踪文件(存在于至少git的2.7.4):
git stash pop
将首先尝试还原未跟踪的文件,然后尝试还原跟踪的文件。如果后一个操作失败(例如,冲突),则第一个操作不会回滚(untracked-file-stash将保持原样,但不会从磁盘上删除文件),因此,即使您解决了冲突,下一个弹出操作也会失败无论如何。
您可以使用以下命令列出所有隐藏提交:
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>
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
要在存储中列出未跟踪的文件:
git ls-tree -r stash@{0}^3 --name-only
要显示所有未跟踪文件的完整差异(包含内容):
git show stash@{0}^3
这些命令读取最后(最新)存储。对于较早的存储,请增加“ stash @”后面的数字,例如stash@{2}
从最后一个存储中增加第二个。
这样做的原因是git stash
为每个存储创建一个合并提交,可以将其称为stash@{0}
,stash@{1}
等等。此提交的第一个父级是存储时的HEAD,第二个父级包含对跟踪文件的更改,并且第三(可能不存在)对未跟踪文件的更改。
手册中“讨论”部分对此做了部分解释。
git stash show
似乎显示了工作副本和#1之间的差异(来自git-stash.sh:的相关代码git diff ${FLAGS:---stat} $b_commit $w_commit
,其中$ b_commit是#1,而$ w_commit是隐藏提交);是否有任何内置方法git stash show
来包含#3?