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
谢谢。
答案 0 :(得分:2)
git stash
代码默认情况下完全保存 1 ,并且仅保存跟踪的文件。未跟踪的文件是在工作树中但不在索引中的文件。无论您是否立即在.gitignore
中列出该文件,如果您现在进行一次提交,则该文件将不在您进行的下一次提交中。
一旦文件位于中,则该文件将会在您进行的下一次提交中,无论该文件是否在.gitignore
中列出。因此,一旦您git add testfile
,索引中就有某些内容与HEAD
中的内容不匹配,并且git stash
愿意从索引和工作树中进行提交。 git stash
命令(不带任何其他选项)将在索引和工作树中分别保存{sup> 2 ,如果其中一个与HEAD
不同,但是如果两者完全匹配{{ 1}}。
1 在这里,我故意忽略了运行HEAD
或git stash save -u
的选项。它们构成一个包含三个提交而不是两个提交的存储区。它还会更改git stash save -a
执行的清除操作。后三提交的git stash save
或git stash apply
的工作方式与后两次提交的git stash pop
或git stash apply
的工作方式也有些不同,尽管此答案确实可以完全不解决后面的git stash pop
或git stash apply
。
2 git stash pop
中的 push 动词与git stash push
中的pop
动词相反;与git stash pop
无关。过去,git push
没有git stash
子命令。有人指出push
存在一些奇怪的句法问题,而且这种不对称性-不按推就流行-因此最终git stash
获得了语法更好的git stash
子命令,可以隐藏文件的一部分。
请注意,在使用子集功能时,您提到的here的push
和I
提交仍然是完整快照;只是W
快照仅添加指定的子集文件,然后随后的W
+检验git reset
的运行也只会重置指定的子集。对于多个Git修订版,此新功能中存在一个非常讨厌的,破坏数据的错误:git stash
将保存该子集,然后重置太多文件。