stash类似于数据结构的栈区,主要应用场景是当想切换分支时,工作目录是脏的(即有修改,还未提交),此时可以临时存储在栈区中,之后分支切换回来,在恢复为之前的工作空间。
注:临时存储的栈区容易被遗忘,所以创建时指定message选项。
栈区的操作有:元素的增,删,查。栈区的清空。
官网链接:https://git-scm.com/docs/git-stash,或者在本地输入git stash --help。
1、元素
增,删,改,查
1.1 保存
执行git stash命令或git stash save命令会存储元素。它的语法格式如下:
git stash [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet] [-u|--include-untracked] [-a|--all] [-m|--message <message>] [--pathspec-from-file=<file> [--pathspec-file-nul]] [--] [<pathspec>…]]
显示的结果如下:
$ git stash saved working directory and index state WIP on master: cf58f6f 解决dev分支合并到master分支的冲突
冒号之前的部分为固定的字符串,表示stash存储了工作目录和索引中变更。冒号后面的部分为参照版本库对应的Commit信息,ID,msg。
WIP全称为work in progress,指进行中的工作
选项:
-q,quiet, -p patch, -pathspec-from-file, -pathspec-from-nul, -pathspec是公共的选项
-m:stash的操作日志信息。
文件类型有三种,被忽略的,未追踪的,已追踪的。
-a:包含所有的文件,包括被忽略的文件。
-u:包含未追踪的文件。
-k:不缓存已经暂存的内容
1.2 查看
执行git stash show查看单个元素,它的语法格式为:
git stash show [<options>] [<stash>]
stash标识,执行git stash show stash@{0}的结果如下:
A.txt | 1 + 1 file changed, 1 insertion(+)
显示的结果与git diff --cached差不多,是索引与当前提交对象比较之后的变更集。
1.3 取出
执行git stash pop或apply恢复工作目录和INDEX。pop与apply的区别在于pop会取出栈顶的元素并删除,apply只取出栈顶的元素。
-q || quiet:不打印任何日志信息。
<stash>:stash的标识,例如stashh@{0},它由三部分组成,stash,@,{number},其中number类似于栈的索引。
执行git stash apply,之后查询git stash list,会发现stash@{0}还在。执行git stash pop,之后查询git stash list,stash@{0}已被删除。
1.4 删除
执行git stash drop移除栈中的元素,它的语法格式为:
git stash drop [-q|--quiet] [<stash>]
-q | quiet选项不打印任何输出内容。
stash为元素的标识
2、栈区
查看,清空。
2.1 查询
git stash list的命令格式为
git stash list [<options>]
它用于查询stash中的内容,可以把stash理解为栈,git stash list查询栈中所有元素。显示的结果如下:
stash@{0}: WIP on master: 67402fc 提交文件A.txt
2.2 清空
执行git stash clear清空栈。它没有任何选项