应用场景
一、当你接到一个修复紧急 bug 的任务时候,一般都是先创建一个新的 bug 分支来修复它,然后合并,最后删除。但是,如果当前你正在开发功能中,短时间还无法完成,无法直接提交到仓库,这时候可以先把当前工作区的内容 git stash 一下,然后切换到bug修分支去修复 bug,修复后,再回到当前任务分支git stash pop,恢复之前的工作内容。
二、由于疏忽,本应该在dev分支开发的内容,却在master上进行了开发,需要重新切回到dev分支上进行开发,可以用git stash将内容保存至堆栈中,切回到dev分支后,再次恢复内容即可。
总的来说,git stash命令的作用就是将目前还不想提交的但是已经修改的内容进行保存至堆栈中,后续可以在某个分支上恢复出堆栈中的内容。这也就是说,stash中的内容不仅仅可以恢复到原先开发的分支,也可以恢复到其他任意指定的分支上。git stash作用的范围包括工作区和暂存区中的内容,也就是说没有提交的内容都会保存至堆栈中。
命令详解
git stash
能够将所有未提交的修改(工作区和暂存区)保存至堆栈中,用于后续恢复当前工作目录。
【注意】: 使用该命令时要将工作区的修改添加到暂存区,如果文件没有提交到暂存区,使用该命令会提示 No local changes to save ,无法将修改保存到堆栈中
git stash save
作用等同于git stash,区别是可以加一些注释,
如下:git stash的效果:
stash@{0}: WIP on master: b2f489c second1
git stash save “test1”的效果:
stash@{0}: On master: test1
git stash list
查看当前stash中的内容,结果就是下面的各种操作选择某次存储的标识
git stash pop
将当前stash中的内容弹出,并应用到当前分支对应的工作目录上。
注:该命令将堆栈中最近保存的内容删除(栈是先进后出)顺序执行git stash save “test1”和git stash save “test2”命令,效果如下:
$ git stash list
stash@{0}: On master: test2
stash@{1}: On master: test1
$ git stash pop
On branch master
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: src/main/java/com/wy/StringTest.java
no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (afc530377eacd4e80552d7ab1dad7234edf0145d)
$ git stash list
stash@{0}: On master: test1
可见,test2的stash是首先pop出来的。如果从stash中恢复的内容和当前目录中的内容发生了冲突,也就是说,恢复的内容和当前目录修改了同一行的数据,那么会提示报错,需要解决冲突,可以通过创建新的分支来解决冲突。
如果要弹出其他stash,命令:git stash pop stash@{num}
,比如应用并删除第二个:git stash pop stash@{1}
git stash show
显示做了哪些改动,默认show第一个存储,如果要显示其他存贮,后面加stash@{num}
,比如第二个 git stash show stash@{1}
#简略显示文件修改行数
git stash show
#具体显示修改内容
git stash show -p
git stash apply
应用某个存储,但不会把存储从存储列表中删除,默认使用栈顶缓存,即stash@{0},如果要使用其他的存储,使用git stash apply stash@{num}
, 比如第二个:git stash apply stash@{1}
git stash drop
列表中删除这个存储,默认删除栈顶缓存,如果想要删除指定存储:git stash drop stash@{num}
git stash clear
删除所有缓存