下载初始化仓库
$ git status
当前位于test分支,并且修改啦两个文件,一个已经staged,还有一个没有
$ git stash
stash命令把当前`working directory`和`index`的内容都存储起来
$ git status
现在status命令查看,`working directory`已经没有修改啦,是干净的。
$ git stash list
`stash list`命令就是列出已经stash的内容,输出结果还包括啦stash时的分支和当时所在commit的SHA-1值
如果有新的stash时,会在老的列表上面新建,把现在的这个stash@{0}压下去,变成stash@{1}
$ git log --oneline --graph --decorate
分支结构图可知,`stash list`输出结果中的确实是stash时所在分支所指向的commit的SHA-1值
$ git checkout master
$ git stash apply
$ git stash apply stash@{0}
恢复stash的内容,用上面的命令就行,可以在apply后面声明是哪一个stash,
不声明,Git会默认选择最新的那个。
恢复stash并不一定要保持`working directory`干净,
也不一定要在同一个branch上(在test的stash可以恢复到master分支),
如果恢复时出现冲突,git停止恢复,提示冲突。
因为stash存储啦对hello的修改,所以恢复时提示冲突,停止恢复,
提示我们要先commit或者stash才可以继续恢复
但是,如果修改的是afternoon.txt文件(stash存储中没有对这个文件的修改),
那么可以直接`git stash apply`完成恢复,不会产生冲突
$ git add hello.txt
$ git stash apply
因为stash apply命令是把原来存储的修改都恢复到`working dirctory`,
所以可以先把当前对hello.txt的修改添加到`Index`,
然后在stash apply恢复
$ git checkout -- hello.txt morning.txt
$ git status
用checkout命令,把`working dirctory`中刚刚恢复的修改撤销掉,然后再查看status,只有index里面还有hello的修改
$ git stash apply --index
这个命令恢复stash的内容时,
会把原来已经staged的文件(就是在index中的文件)也恢复,
不加`--index`时,会把所有存储的操作都恢复到`working directory`,
因为index中有对hello的修改存在,所以恢复依然终止
$ git status
查看status,stash没有恢复,原来index中的修改也清楚啦,`working directory`的修改保留
$ git checkout -- hello.txt
$ git stash apply stash@{0} --index
撤销`working directory`的hello.txt修改,然后用加上`--index`的命令恢复stash,此时输出结果可以看到,跟刚开始在test分支时的状态是一样的,修改的hello.txt添加到index,morning.txt的修改没有添加
$ git stash list
$ git stash drop stash@{0}
$ git status
$ git stash
此时master分支仍然保留着恢复时的状态,再次用git stash存储状态
$ git stash list
$ git stash pop stash@{0}
$ git stash list
用`git stash pop`命令恢复stash后会立即从栈中删除对应的stash
`git stash list`没有输出结果
Stash命令的一些其他参数的使用
$ git add hello.txt
$ git status -s
把hello.txt添加到index,然后再复制一份hello.txt,名字是`hello (2).txt`
用git status -s查看状态,如上图
$ git stash --keep-index --include-untracked
$ git stash --keep-index -u //-u == --include-untracked
$ git status -s
参数`--keep-index`表示保留index里面的状态
`--include-untracked`表示包括没有追踪的文件(就是上面复制的hello (2).txt)
然后在用`status -s`查看,只剩下index中的状态啦
$ git checkout --f master
$ git status -s
`checkout --f master`撤销掉所有更改,打开hello.txt文件,前面两行添加(master1)(master2)最后两行加上(master19)和(master20)
$ git stash --patch
y
n
`--patch`参数用于存储部分的修改,如图,对前面两个修改进行存储,不存储后面两个修改
打开hello.txt,可以看到,上面两行的修改已经存储起来了,下面的两行依然保留
如果stash已经无法在当前分支上恢复,可以尝试从stash新建一个branch测试代码
$ git checkout -f HEAD //撤销掉上面剩下的所有修改
$ git stash branch testchanges stash@{0}
`stash branch testchanges`命令将新建testchanges分支,checkout执行stash存储命令时所在的那个commit,然后把存储的修改重新引用到那个commit上,testchanges分支指向那个commit
清除working dirctory里面的文件