git stash push不会存储未进行的变更吗?

时间:2019-01-23 01:24:40

标签: git

git stash push是否不存储未分段的更改?

$ touch testfile
$ git stash push
No local changes to save

为什么现在可以用于分阶段的更改?

$ git add testfile 
$ git stash push
Saved working directory and index state WIP on mybranch: e5c1660  add note

谢谢。

1 个答案:

答案 0 :(得分:2)

git stash代码默认情况下完全保存 1 ,并且仅保存跟踪的文件。未跟踪的文件是在工作树中但不在索引中的文件。无论您是否立即在.gitignore中列出该文件,如果您现在进行一次提交,则该文件将不在您进行的下一次提交中。

一旦文件位于中,则该文件将会在您进行的下一次提交中,无论该文件是否在.gitignore中列出。因此,一旦您git add testfile,索引中就有某些内容与HEAD中的内容不匹配,并且git stash愿意从索引和工作树中进行提交。 git stash命令(不带任何其他选项)将在索引和工作树中分别保存{sup> 2 ,如果其中一个与HEAD不同,但是如果两者完全匹配{{ 1}}。


1 在这里,我故意忽略了运行HEADgit stash save -u的选项。它们构成一个包含三个提交而不是两个提交的存储区。它还会更改git stash save -a执行的清除操作。后三提交的git stash savegit stash apply的工作方式与后两次提交的git stash popgit stash apply的工作方式也有些不同,尽管此答案确实可以完全不解决后面的git stash popgit stash apply

2 git stash pop中的 push 动词与git stash push中的pop动词相反;与git stash pop无关。过去,git push没有git stash子命令。有人指出push存在一些奇怪的句法问题,而且这种不对称性-不按推就流行-因此最终git stash获得了语法更好的git stash子命令,可以隐藏文件的一部分。

请注意,在使用子集功能时,您提到的herepushI提交仍然是完整快照;只是W快照仅添加指定的子集文件,然后随后的W +检验git reset的运行也只会重置指定的子集。对于多个Git修订版,此新功能中存在一个非常讨厌的,破坏数据的错误:git stash将保存该子集,然后重置太多文件。