当前分支做了一些修改(工作区与暂存区),如果此时你要切换到别的分支,那么你的修改要么会污染别的分支,要么会在切换的过程中丢失,所以如果有个功能能够允许我在切换之前保存现场,再切换回来的时候恢复现场,就很完美了,那么 git stash 就是干这个的。
当然,Git 会将现场保存在堆栈中,恢复的时候你可以将现场恢复进任何分支。
git stash 会保存工作区和暂存区的内容。
git stash 只会关注已经加入到版本控制的文件。
$ git stash -h
usage: git stash list [<options>]
or: git stash show [<options>] [<stash>]
or: git stash drop [-q|--quiet] [<stash>]
or: git stash ( pop | apply ) [--index] [-q|--quiet] [<stash>]
or: git stash branch <branchname> [<stash>]
or: git stash clear
or: git stash [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]
[-u|--include-untracked] [-a|--all] [-m|--message <message>]
[--] [<pathspec>...]]
or: git stash save [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]
[-u|--include-untracked] [-a|--all] [<message>]
存储
git stash
git stash save message
git stash push message
将工作区和暂存区内容隐藏起来,参数 message 为注释信息,方便查找,可以进行多次stash,每次的隐藏内容存储在一个栈中。
$ git branch
b2
* master
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: t1.txt
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: q/w/t4.txt
$ git stash save "cache master"
Saved working directory and index state On master: cache master
$ git status
On branch master
nothing to commit, working tree clean
什么也不改动而再次入栈呢?
$ git stash save "cache master copy"
No local changes to save
显然Git会忽略掉这种愚蠢的操作
查看
列出栈中的所有内容
$ git stash list
stash@{0}: On master: cache master
显示某个隐藏的具体内容
$ git stash show stash@{0}
q/w/t4.txt | 1 +
t1.txt | 3 ++-
2 files changed, 3 insertions(+), 1 deletion(-)
读取
调用任意一个隐藏内容,但是并没有删除栈中的记录
$ git stash apply stash@{0}
取出栈中的第一个内容(栈是先进后出),且删除栈中的记录
$ git stash pop
从最新的stash创建分支
$ git stash branch
应用场景:当储藏了部分工作,暂时不去理会,继续在当前分支进行开发,后续想将stash中的内容恢复到当前工作目录时,如果是针对同一个文件的修改(即便不是同行数据),那么可能会发生冲突,恢复失败,这里通过创建新的分支来解决。可以用于解决stash中的内容和当前目录的内容发生冲突的情景。
删除某一个记录
$ git stash drop stash@{0}
清除全部记录
$ git stash clear
如果从stash中恢复的内容和当前目录中的内容发生了冲突,也就是说,恢复的内容和当前目录修改了同一行的数据,那么会提示报错,需要解决冲突,可以通过创建新的分支来解决冲突。