对于提出的问题(“stash是否将暂存文件转换为未暂存文件”),答案既是肯定的,也是否定的。
如果您使用git stash apply
(而不是git stash pop
)提交了申请,那么您就处于很好的状态,因为储藏仍然存在。但让我们退后一步,看看底层机制,因为它在这里很重要。
当您运行git stash push
(新动词)或git stash save
(旧动词)(或纯粹的git stash
执行push
/save
)时,Git会创建两个1未在任何分支上的提交。一个提交保存索引的状态,即您已经暂存的内容。第二个提交保存工作树的状态,即其他所有内容。
稍后,当您使用git stash apply
时,Git将更改压缩在一起,以便没有内容被暂存,除非您在apply
操作中添加了--index
2,在这种情况下,它会恢复(如果可以)您之前排列的已暂存与未暂存内容。
当您使用apply
时,储藏脚本也会保留储藏提交,因此如果应用程序没有按照您想要的方式进行-包括如果您忘记了--index
或拼错了它(请参见注释2)-您可以git reset --hard
(假设您开始时所有设置都干净)并重新执行apply
。
但如果您使用了pop
,并且Git认为申请成功,那么它就会放弃储藏。出于这个原因,我通常建议仅使用单独的apply和drop操作。
(顺便说一句:我实际上建议尽可能避免使用git stash
。它对于不谨慎的人来说有太多的陷阱,而且历史上还存在许多bug。但是如果你已经使用了它并且现在后悔了,可以考虑使用git stash branch
,它可以将保存的存储库转换成一个分支。请参见下面ADTC的评论。您可以使用已经弹出的存储库的原始哈希ID进行此操作,但通常需要处于“干净”的状态。新分支从您制作存储库时所在的提交分支出。)
1使用-u
或-a
选项,它不仅保存已暂存和未暂存的文件,还保存被忽略的和/或所有文件,因此存储库脚本会生成三个提交。如果没有这些标志,则这些文件都不会进入存储库的任何部分。
2令人困惑的是,存储库脚本还有一个--keep-index
标志,它允许您为apply
操作指定此选项,但在那里没有任何意义。相反,--keep-index
会影响stash
在生成其特殊的存储库提交后所做的操作。偶尔我会不小心使用了git stash apply --keep-index
而不是git stash apply --index
,把这两个选项搞混了。
应用
stash@{2}
并保留暂存/未暂存状态,请使用以下命令:git stash apply --index 2
。 - Neurotransmitterapply ... 2
而不是更长的apply ... stash@{2}
)的能力在某种程度上是相对较新的。如果你的 Git 版本比较古老,而你的git push
命令只有save
动词,那么你可能需要手动输入stash@{
和}
部分。 - torekgit stash branch
命令并将哈希 ID 作为参数,这可能会更简单和更容易。 - torek