这个命令用来将当前暂存区内容进行保存,然后整个工作区、暂存区、仓库恢复到上次提交的状态。
首先看一下当前git状态:
当前状态下只有一个README文件;
我们向工作空间加入一些文件或者文件夹,最后的状态如下:
整个工程目前由main.py空文件、README空文件、first/main.py空文件这几个部分组成。
然后再添加一些内容使得当前git状态如下:
即将main.py加入追踪后后再写入一行内容但不加入暂存区,新建两个文件test.py和__init__.py,其中test.py中增加一行内容,但均不放入暂存区;
然后执行git stash将内容保存:
这里有几个地方要注意:
1 执行保存时工作区或者暂存区至少有一处地方与头指针不同,否则提示“No local changes to save”导致失败;
2 可以直接使用git stash,不一定需要有save,但最好用save 然后后边加注释信息,方便stash过多时能区分;
3 默认情况下stash只会暂存已经添加到git的成员文件,为了将所有更改都添加(包括已经被gitignore的文件),需要在最后使用-u,表示所有文件都添加;这里使用了这个参数;
从上面的输出可以看到,当前分支已经很干净,所有内容均已被暂存,而stash记录使用了类似reset一样的reflog格式,所以切换是很方便的。
看一下stash中存储的这个对象的log:
这个log有点儿奇怪,一般情况下合并分支最多就是两个parent,但这个居然有三个,这三个parent能从下边的commit id上对应;首先045这个parent是stash之前head的commit id,第二个parent 0889b这个是暂存区的commit id,而第三个09ff则是工作区未追踪文件的commit id;而最新的commit则是stash时工作区的状态;
其实可以验证一下;
09ff5c这个commit指向的tree为a5341d,查看这个tree又能得到:
可以看到test.py中正是写入的’print(‘test’)’,而且这个tree只指向当时仅存在于工作区中的__init__.py和test.py两个文件;
而查看bdbc63这个对象可以看到:
main.py中的内容正是stash前写入的内容。
(因为测试,上面内容是在某个commit下操作的,然后会切换会master,但整体结论不受影响)。
最后将stash中的内容恢复,继续写代码: