两次运行git stash的奇怪行为
我的开发分支中有一些修改过的文件,还有一些是新创建的,但没有被git跟踪。我想将这些更改移动到一个功能分支,所以我运行了两次运行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 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个索引也不是空的。