git stash show输出为空

问题描述

我有一个运行的升级脚本

git stash -k -u

在更新到最新版本之前。

通常,它输出No local changes to save 但是一段时间以来,它一直在输出Saved working directory and index state WIP on generated: build,即使未对工作副本进行任何更改。

当我尝试检查任何隐藏物的内容时,它也显得完全空白:

$ git stash list
stash@{0}: WIP on generated: bc0c9f6 build
stash@{1}: WIP on generated: 1d83819 build
stash@{2}: WIP on generated: 6aff261 build
stash@{3}: WIP on generated: ac3f8a9 build
stash@{4}: WIP on generated: bf0d020 build
stash@{5}: WIP on generated: ba972db build
stash@{6}: WIP on generated: 2c5cfe3 build

$ git stash show stash@{0}
$ git stash show stash@{1}

等等...所有存储的输出为空。如果我为-p命令指定stash show标志,则相同。

我需要帮助弄清楚这些存储的内容,以便推测为什么首先要创建它们。

解决方法

存储实际上是一个提交,或更准确地说,是两个或三个提交(取决于存储选项)。由于您使用的是-u,因此可以得到三个提交的变体。

我将这三个提交称为iwu(如果存在)。 i的提交是通过提交索引内容来进行的,与git commit相同,只是该提交不会进入任何分支。

u提交(如果存在)仅包含未跟踪但未被忽略的文件(使用-u;使用-a包含更多文件)。进行此u提交后,Git然后从您的工作树中删除此提交中存储的所有文件。

w提交始终位于最后,并且包含与i提交中相同的文件(文件名),但是 w提交中这些文件的内容与这些文件的工作树副本中的内容匹配,而不是索引副本中的内容。

git stash -uHEAD提交,当前索引和具有以下名称的工作树文件之间没有发现差异时索引中的副本,git stash拒绝进行新的存储,而是产生您提到的错误消息(No local changes to save)。但是,如果您确实有未跟踪的文件,则应进行存储,然后删除那些未跟踪的文件。这将导致iw内容匹配且都匹配运行HEAD时提交的git stash的存储。

git stash命令是在最近的Git中重写的,其某些极端情况的行为可能已更改。如果是这样,那就是一个错误,您应该向Git社区报告(理想情况下,是使用行为不同的复制器和特定Git版本)。

请注意,git stash show只是查看w提交。像所有提交一样,iuw提交中的所有三个都可以具有父提交i提交的(单)父级是您进行存储时的当前提交。 u提交(如果存在)是根提交(没有父提交)。 w提交有两个或三个父级:第一个是您进行存储时当前的提交,第二个是i提交,第三个(如果存在)是u提交。也就是说,我们可以这样绘制提交图:

...--F--G--H   <-- current-branch (HEAD)
           |\
           i-w   <-- stash
            /
           u

名称stash(全名refs/stash)指向w提交。当前分支,这里current-branch(全名refs/heads/current-branch)指向当前提交,特殊名称HEAD附加到名称current-branch上,以便Git可以找到提交H的哈希ID。

因此,提交Hi的父级,也是w的第一个父级。 Git通过u是否有第三父级来检测提交w是否存在。

git stash show -p等效于git diff stash stash~1,即将提交H中的文件内容与提交w中的文件内容进行比较。如果进行隐藏的原因是u存在,或者ii~1不同,则无需ww~1不同。