两次运行git stash的奇怪行为

两次运行git stash的奇怪行为,git,git-stash,Git,Git Stash,我的开发分支中有一些修改过的文件,还有一些是新创建的,但没有被git跟踪。我想将这些更改移动到一个功能分支,所以我运行了git stash。 在检查了git状态后,我意识到git并没有隐藏未跟踪的文件。所以我运行了git stash-u 这里发生了一些奇怪的事情,因为在我签出我的功能分支并试图查看两个隐藏的更改后,使用git stash show stash{0}和git stash show stash{1},它没有显示第0个隐藏索引的任何内容,而第1个隐藏索引显示了未跟踪的文件。没有第二个指

我的开发分支中有一些修改过的文件,还有一些是新创建的,但没有被git跟踪。我想将这些更改移动到一个功能分支,所以我运行了
git stash
。 在检查了git状态后,我意识到git并没有隐藏未跟踪的文件。所以我运行了
git stash-u

这里发生了一些奇怪的事情,因为在我签出我的功能分支并试图查看两个隐藏的更改后,使用
git stash show stash{0}
git stash show stash{1}
,它没有显示第0个隐藏索引的任何内容,而第1个隐藏索引显示了未跟踪的文件。没有第二个指数

git存储列表
根本没有显示任何内容。我继续做了
git stash apply
,这只带回了未跟踪的文件更改,而不是修改的文件

应用未跟踪文件更改后,我再次运行
git stash show stash{0}
git stash show stash{1}
。这一次,第0个索引再次为空,修改后的文件更改移动到第1个索引。应用隐藏{1}会带回我所有的更改,但我无法理解隐藏的行为。以前有人看过吗?

为了清楚起见:

$ git stash; git stash -u
这是两个独立的
git stash
命令。由于末尾没有更具体的动词,所以每个人都执行一个
git stash save

第一个
git stash
保存了当前索引和当前工作树(通过进行两次单独的提交,两次提交都不在分支上)。在那之后,你的索引匹配了
提交,你的工作树是干净的,当然除了未跟踪的文件

通常情况下,如果您尝试重复
git stash save
,它只会告诉您没有要保存的内容,也不会执行任何操作,但是对于第二次
save
,您添加了
-u
标志:保存(然后删除)未跟踪的文件。因此,这进行了第二次隐藏,使用当前索引(第一次
save
HEAD
提交相等)和当前工作树(再次与
HEAD
提交相等),并使用第三次提交作为隐藏包的一部分:
u
提交。请参见中的图纸,但请注意,在您的特定情况下,有两个单独的储藏袋悬挂在同一(
头部
)commit上

当您使用一些活动存储保存一个存储时,
stash
脚本使用git的“reflogs”将当前存储“推”到“存储堆栈”中,使新存储成为最顶层的存储,
stash@{0}
。因此,此时,包含
u
commit的存储包是
stash{0}
,而包含修改后的索引和/或工作树(并且没有
u
commit包含未跟踪的文件)的存储包是
stash{1}

然后你做了:

git checkout feature
或类似于更改
头部
以指向其他分支。现在让我们通过假设隐藏在名为
X
的分支上来绘制情况:

... - o - o - o   <-- HEAD=feature
  \
    o - *         <-- X
        |\
        |  \
        |\   \
        i-w    \      <-- stash@{1}
                |\
                i-w   <-- stash@{0}
                 /
                u

我感谢你努力回答。但我确实看到了我所解释的确切行为,第0个索引为空,这让我感到困惑。我没有使用
git-show-stash{0}
,我使用了
git-stash-show-stash{0}
,并且
git-stash列表也没有显示任何隐藏。我希望看到实际的剪切和粘贴输出,尽管现在可能您已经没有任何隐藏了。特别是
git stash show
在基本提交(本例中标记为
*
的提交)和工作树提交之间运行
git diff
,因此您永远不会看到未跟踪的文件,并且显示stash 0应为空,而显示stash 1应产生任何工作树更改(如果您将所有的工作都添加到了
git-add
,这也将是空的,因为所有的更改都将在索引中)。顺便说一句,如果您仍然有这些更改,那么
git-stash-list
的输出也不应该是空的,无论输出是什么(尽管“空”并不是很好处理的:-),这可能有助于了解这是如何发生的。不,我已经没有了。它甚至不在我的机器上,而是发生在一个同事的机器上。不过我是那个开车的人。然而,当我试图在我的机器上复制时,我无法得到任何这种行为。我可以看到隐藏列表列出了这两个隐藏,在我的例子中,第0个索引也不是空的。