7.3 Git Tools - Stashing and Cleaning

下载初始化仓库

$ 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
切换到`master`分支

打开hello.txt,作如上的修改
$ 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}
用drop stash命令丢弃无用的stash
$ 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里面的文件

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容