git stash
stash
在英文意思是隐藏。git stash
的作用也是隐藏没完成的代码,防止它干扰别人或者新分支的工作。
一、背景
1.1 我们经常会遇到这样的情况
正在
dev
分支开发新功能,做到一半时有人过来反馈一个bug
,需要马上解决,但是新功能做到了一半你又不想提交。
这时就可以使用 git stash
命令先把当前进度保存起来,然后切换到另一个分支去修改bug
;修改完提交后,再切回 dev
分支,使用git stash pop
来恢复之前的进度继续开发新功能。
看到这里,有些小伙伴就有疑问:没必要啊,修 BUG
的时候,直接切换分支,修改完提交后再切回来到原来的分支不就行了。
1.2 真的要这么麻烦吗
- 比如有情景如下:
- 在
dev
分支下创建一个文件dev_file.txt
,并add
,让它stage
; - 这时切到
master
分支,你会看到这个dev_file.txt
居然也在master
分支里。他不是应该只在dev
分支吗?
- 如果你试试你再试试:
- 切回
dev
分支,执行git stash
; - 这时你在切回
master
分支,dev_file.txt
就消失了。
这时候,我不禁想说:git stash,YYDS !
二、git stash
当你执行 git stash
时会提醒你:
Saved working directory and index state WIP on newF2: b63fbcb add dev_file.txt HEAD is now at b63fbcb add dev_file.txt。
它已经把 dev_file.txt
保存好了。
2.1 git stash 干了什么
它会保存当前工作进度,会把暂存区和工作区的改动保存到一个未完结变更的堆栈中;执行完这个命令后,在运行git status
命令,就会发现当前是一个干净的工作区,没有任何改动。
git stash 是本地的,不会上传到服务器上;
可以通过使用git stash save 'message...'可以添加一些注释。
2.2 git stash 相关命令
命令名 | 作用 |
---|---|
git stash | 隐藏当前的工作现场, 此时, git status的结果是 clean |
git stash list | 查看所有隐藏, 每一行的冒号前面的字符串就是标识此隐藏的id |
git stash apply | 重新显示标识为 id 的隐藏 |
git stash drop | git apply恢复隐藏后, 需要手动删除 list 列表中的记录 |
git stash pop | 恢复最新的进度到工作区 |
git stash pop stash@[stash_id] | 恢复指定的进度到工作区 |
如:
git stash pop stash@{1}
。stash_id
是通过git stash list
命令得到的;
三、git stash 使用场景
3.1 有人与我改动同一分支
我在本地修改好后,发现远程分支已经被改动了,此时我本地也被改动了就造成了冲突,无法
push
或者pull
。
此时,就可以用 git stash
来处理
// 把本地的改动暂存起来 git stash // 拉取远程分支(此时本地分支会回滚到上次commit的情况,你的改动都存在stash中) git pull // 将stash中改动重新加回本地分支,就可以继续修改了,当然,如果改好了就是add,commit,push git stash pop
3.2 不小心改动了其他分支
例如忘记切换,将代码写错了分支,直接在
master
分支上做改动,这里假设我的分支是feature/category_vechice
分支。
// 把本地当前改动暂存起来,此时master分支就恢复到了上次拉取时的状态 git stash // 切换到需要改动的分支 git checkout test // 将改动pop到自己当前的分支 git stash pop
四、小结
顾名思义,
stash
就是一个栈,平时我们把需要暂存的文件存到栈中,把代码恢复到上次拉取的状态以进行操作。
就我个人使用而言,git stash pop
就已经满足日常需要了,毕竟频繁的线上 bug
或者忘记切代码啥的,我们应该考虑的不是这个命令的问题,是开发质量的范畴了。
五、idea中Stash与Unstash的使用
1.痛点
在A分支上正在开发任务1,突然需要切换分支看别的问题,而又不想commit,怎么办?
2.我写了这些代码
3.点击工具栏的
VCS -> Git -> Stash Changes…
4.输入Message然后点击 Create Stash
5.发现我写的码不在了
如图:
6.可切换分支了
这会你可以切换分支去干别的了
7.切换回来
等你处理完另外的事情,在切回到之前的A分支,想要继续开发,怎么办?点击图中的 Unstash Changes…
8.选择想恢复的代码集合,点击Apply Stash
9.代码恢复继续开发
然后你会发现,之前消失的代码都回来了,至此目的达到结束,恢复的代码如图:
10.额外的东西
1.当你再打开UnStash Changes…,你会发现恢复的代码集合仍然存在,所以你可以先点击View看看选中的代码集合里有哪些内容和文件,确定不需要了可以点击Drop删除当前代码集合,也可以使用Clear清除掉所有的代码集合。
2.如果你恢复代码之后就不想再打开Unstash Changes…窗口,执行删除。那么你可以这样做:在点击Apply Stash按钮之前,勾选上Pop stash复选框在点击Apply Stash按钮(额,当你勾选了Pop stash,Apply Stash按钮就变成了Pop Stash按钮),恢复之后idea自动就删除了你恢复的代码集合,如图:
参考文章:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架