应用场景:
1 当正在dev分支上开发某个项目,这时项目中出现一个bug,需要紧急修复,但是正在开发的内容只是完成一半,还不想提交,这时可以用git stash命令将修改的内容保存至堆栈区,然后顺利切换到其他分支进行bug修复,修复完成后,再次切回到dev分支,从堆栈中恢复刚刚保存的内容。
2 由于疏忽,本应该在dev分支开发的内容,却在master上进行了开发,需要重新切回到dev分支上进行开发,可以用git stash将内容保存至堆栈中,切回到dev分支后,再次恢复内容即可。
3 当同时进行多个需求开发,其中一个需求进行到一半,需要转去开发另一个需求时,可将当前分支所做更改保存到堆栈中,以后回到该需求时可以会恢复这些更改。
总的来说,git stash命令的作用就是将目前还不想提交的但是已经修改的内容进行保存至堆栈中,后续可以在某个分支上恢复出堆栈中的内容。这也就是说,stash中的内容不仅仅可以恢复到原先开发的分支,也可以恢复到其他任意指定的分支上。git stash作用的范围包括工作区和暂存区中的内容,也就是说没有提交的内容都会保存至堆栈中。
常用git stash命令:
(1)git stash save "save message" : 执行存储时,添加备注,方便查找,只有git stash 也时可以的,但查找时不方便识别。
(2)git stash list :查看stash了哪些存储
(3)git stash show :显示做了哪些改动,默认show第一个存储,如果要显示其他存贮,后面加stash@{$num},比如第二个 git stash show stash@{1}
(4)git stash show -p : 显示第一个存储的改动,如果想显示其他存存储,命令:git stash show stash@{$num} -p ,比如第二个:git stash show stash@{1} -p
(5)git stash apply :应用某个存储,但不会把存储从存储列表中删除,默认使用第一个存储,即stash@{0},如果要使用其他个,git stash apply stash@{$num} , 比如第二个:git stash apply stash@{1}
(6)git stash pop :命令恢复之前缓存的工作目录,将缓存堆栈中的对应stash删除,并将对应修改应用到当前的工作目录下,默认为第一个stash,即stash@{0},如果要应用并删除其他stash,命令:git stash pop stash@{$num} ,比如应用并删除第二个:git stash pop stash@{1} 。注:该命令在恢复内容的同时将堆栈中对应的的内容删除(栈是先进后出)
(7)git stash drop stash@{$num} :丢弃stash@{$num}存储,从列表中删除这个存储
(8)git stash clear:
删除所有缓存的stash
(9)git stash branch :从最新的stash创建分支。 应用场景:当储藏了部分工作,暂时不去理会,继续在当前分支进行开发,后续想将stash中的内容恢复到当前工作目录时,如果是针对同一个文件的修改(即便不是同行数据),那么可能会发生冲突,恢复失败,这里通过创建新的分支来解决。可以用于解决stash中的内容和当前目录的内容发生冲突的情景。
发生冲突时,需手动解决冲突。
来源:https://blog.csdn.net/stone_yw/article/details/80795669
实际应用:
比如我们在做需求A时,在dev分支上做了一些更改,主要更改内容全部都在x,y,z文件中,这时候,需求做到一半,因某些原因被暂停,所以,需求A被搁置,不能闲着啊,于是又领取了一个需求B,这时候所做的代码更改需要保留起来,以后再用,这时候使用命令
git stash save "备注"
需求B做完之后,并且已经 commit 到远程仓库,需求A现在可以继续做了,所以需要将原来做需求A时的更改找回来,这时候使用命令
git stash apply stash@{$num}
其中的 $num 是
git stash list
显示的 stash 的存储记录中第几个,比如
git stash apply stash@{1}
显示的是下图中的第2条记录
来源:http://www.didiok.com
git stash也可以用来解决git pull和本地文件的冲突
1、先将本地修改存储起来
$ git stash
这样本地的所有修改就都被暂时存储起来 。
其中stash@{0}就是刚才保存的标记。
$ git stash list
可以看到保存的信息:
2、pull内容
暂存了本地修改之后,就可以pull了。
$ git pull
3、还原暂存的内容
$ git stash pop stash@{0}
系统提示如下类似的信息:
Auto-merging c/environ.cCONFLICT (content): Merge conflict in c/environ.c
意思就是系统自动合并修改的内容,但是其中有冲突,需要解决其中的冲突。
4、解决文件中冲突的的部分
其中Updated upstream 和=====之间的内容就是pull下来的内容,====和stashed changes之间的内容就是本地修改的内容。碰到这种情况,git也不知道哪行内容是需要的,所以要自行确定需要的内容。
解决完成之后,就可以正常的提交了。
5 删除stash。
$ git stash drop <stash@{id}>
如果不加stash编号,默认的就是删除最新的,也就是编号为0的那个,加编号就是删除指定编号的stash。
$ git stash clear
是清除所有stash,整个世界一下子清净了!
6 git stash pop 与 git stash apply <stash@{id}> 的区别。
当我使用git stash pop 和 git stash apply 几次以后,我发现stash list 好像比我预计的多了几个stash。于是我便上网去了解了一下这两个命令的区别。原来git stash pop stash@{id}命令会在执行后将对应的stash id 从stash list里删除,而 git stash apply stash@{id} 命令则会继续保存stash id。对于有点强迫症的我来说,是容不下越来越多的陈旧stash id 仍然存在的,所以我更习惯于用git stash pop 命令。
来源:https://blog.csdn.net/danxibaoxxx/article/details/81280499