当你代码写的正嗨,突然老板跑过来对你说,有个紧急线上bug要修复。所以你必须要先切换到master分支,但是你目前在develop分支上,而且有一堆文件改动还未提交,你不想仅仅因为要切到主分支修个bug就为做了一半的工作创建一次提交,那么你可以用git stash 命令把你目前未提交的修改先储藏起来,等修好bug,从master分支上切回develop分支之后,再把改动从储藏中恢复出来,然后继续开发
通过执行git status我们会看到工作区中有一些文件改动:
$ git status
位于分支 develop
您的分支与上游分支 'origin/develop' 一致。
要提交的变更:
(使用 "git reset HEAD <文件>..." 以取消暂存)
修改: index.html
尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git checkout -- <文件>..." 丢弃工作区的改动)
修改: index.scss
执行git stash 储藏当前的修改
$ git stash
保存工作目录和索引状态 WIP on develop: 9c0e4dc Update index.scss
储藏成功之后,在通过git status查看状态,发现工作区已经干净了
$ git status
位于分支 develop
您的分支与上游分支 'origin/develop' 一致。
无文件要提交,干净的工作区
这个时候我们就可以放心的切换到其他分支了,等临时的工作忙完之后,再切换回develop分支恢复储藏
查看储藏列表:
$ git stash list
stash@{0}: WIP on develop: 9c0e4dc Update index.scss
恢复储藏,如果不指定一个贮藏,Git 认为指定的是最近的贮藏
$ git stash apply
位于分支 develop
您的分支与上游分支 'origin/develop' 一致。
尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git checkout -- <文件>..." 丢弃工作区的改动)
修改: index.html
修改: index.scss
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
当然你也可以通过储藏的名字恢复储藏:
$ git stash apply stash@{0}
位于分支 develop
您的分支与上游分支 'origin/develop' 一致。
尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git checkout -- <文件>..." 丢弃工作区的改动)
修改: index.html
修改: index.scss
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
用apply 恢复储藏的内容之后,并不会把储藏删除,我们可以看到这个储藏还在:
$ git stash list
stash@{0}: WIP on develop: 9c0e4dc Update index.scss
我们可以用git stash drop命令来删除无用的储藏
$ git stash drop stash@{0}
丢弃了 stash@{0} (c0264554be0a5e247c9079d69911a4f8d87d6432)
如果想在应用储藏的同时把储藏删除,可以使用git stash pop 命令,可以看到命令执行成功之后,最后一行显示丢弃了储藏:
$ git stash pop
位于分支 develop
您的分支与上游分支 'origin/develop' 一致。
尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git checkout -- <文件>..." 丢弃工作区的改动)
修改: index.html
修改: index.scss
修改尚未加入提交(使用 "git add" 和/或 "git commit -a")
丢弃了 refs/stash@{0} (61342da090d0b7c11d669133d071961c3984edb1)
如果你在储藏文件的时候,一部分文件在工作区,一部分文件在暂存区,你直接执行git stash apply恢复储藏,那么文件都会被恢复到工作区。如果你想在恢复储藏的时候,完全还原以前的暂存状态,可以加上--index 参数
$ git stash apply --index
位于分支 develop
您的分支与上游分支 'origin/develop' 一致。
要提交的变更:
(使用 "git reset HEAD <文件>..." 以取消暂存)
修改: index.html
尚未暂存以备提交的变更:
(使用 "git add <文件>..." 更新要提交的内容)
(使用 "git checkout -- <文件>..." 丢弃工作区的改动)
修改: index.scss
你在当前分支储藏的修改不仅可以恢复到当前分支,还可以恢复到任何分支
想要交流学习其他开发技术,请关注我微信公众号 全栈师否: