问题现象:
今天在项目想到一个问题:
在同一个代码仓库中,如果我在当前分支(如:task/111-001-demo)上正在敲着代码,还没完成的;突然来个紧急任务要我切换到另一个分支(如:emergency)去修复某个bug或新增某个功能,那我当前分支还没写完的代码该怎么处置/保存呢?很显然我们需要**在切换分支之前保存当前分支上的代码改动。**
** **那么问题来了:
** 在切换分支之前该如何保存当前分支上的代码改动呢?**
最近发现了一种新的方法:就是使用 **git stash 命令**就可以很完美地解决上面这个问题,但在实际开发过程中很多人都是**能不敲命令就不敲命令**,于是就引出了一个新的问题:
** IDEA中如何实现 git stash 命令的可视化操作?**
问题分析:
我们可以分析一下上面这种情况:
1、由于是紧急任务(如:生产环境出现bug需要尽快解决),那么该任务优先级必然是最高的,需要优先处理。
2、由于紧急任务所在代码分支与当前代码的分支不同,因此需要切换分支。
3、当前分支有尚未完成的代码,需要保存,因为直接切换分支会导致当前分支上的改动丢失。
OK,问题要素分析完了,可以发现最关键就是要**保存当前代码的改动**!那么顺序就应该是:
1、保存当前代码分支(如:task/111-001-demo)的改动;
2、切换到紧急任务分支(如:emergency);
3、解决紧急任务;
4、切换回当前分支(如:task/111-001-demo)继续开发之前尚未完成的代码。
** 切记:**在多人协作开发的场景下,不要把当前分支未完成开发的代码 commit并push 到远程库,然后直接去做你的紧急任务去了。因为远程库的改动很容易影响到其他开发者。
那么**在切换分支之前该如何保存当前分支上的代码改动呢?**下面提供2种我以前常用的笨方法:
** 1、将当前分支下发生了改动的文件都拷贝一份到某个自定义的备份目录中,后期切换回当前分支时再拷贝回去。**
** 优点:**将发生改动的文件都备份起来,这样绝对不会发生丢失的问题。
** 缺点:**操作复杂而繁琐,如果要精确到具体发生改动的文件,则不仅需要挑出这些文件,还需要记录这些文件对应的存放路径;或者将整个父级目录备份,但很可能会包含没有发生改动过的文件,因此在子文件很多的时候,有些浪费时间和精力。
**2、在当前分支commit,后期切换回当前分支时可以直接在之前commit后的基础上继续开发。**
**优点:**操作简单方便,由于commit是提交到本地库,因此不会影响到远程库,也不会影响到其他开发者。
**缺点:**当开发完成,需要push到远程库时,则需要执行commit和push操作,因此最终远程库上就会出现多条commit日志。
那么,除了上面提到的2种笨方法之外,有没有更完美的第3种方法呢?
确实有的,那就是**使用 git stash 命令**。
3、在当前分支,使用 git stash 操作可以将本地库对当前分支的所有改动放入**本地缓存区(该缓存区未被删除,则会一直存在于本地库中)**,缓存完后当前分支就会回复到上一次从远程库pull之后的状态,此时可以直接切换到紧急任务分支去了,后期切换回当前分支时,重新加载本地缓存区即可还原到缓存前的状态。
**优点:**不会影响远程库,也不需要commit操作。
**缺点:**没有什么明显的缺点,硬要说的话,就是操作会比直接commit的操作复杂一点点。
最近我才发现 git stash 命令的好用之处,估计也有很多小伙伴在实际开发中未曾使用过 git stash 命令。
我猜:原因大概是因为在IDEA中,我们可以**很明显的**点击可视化按钮,如下:
来快速实现commit和push操作,而不需要敲任何git命令。
拓展:git stash 相关命令
1、git stash
创建stash缓存/暂存,保存当前分支的本地工作区与暂存区的状态,stash名为stash@{编号}。
2、git stash save '注释'
创建stash缓存/暂存,保存当前分支的本地工作区与暂存区的状态,stash名为stash@{编号},并添加注释。**与 git stash 的区别是:可以加注释。**
git stash save 'test git stash 001'
3、git stash list
查看stash列表,可以看到本地库中当前分支上的创建的所有stash。
4、git stash pop
还原至最新的一个stash(即stash@{0})的状态,并删除该stash。
**注意:该命令会在还原至stash@{0}的状态后,删除stash@{0}。**
5、git stash apply stash@{编号}
还原至指定stash(即stash@{编号})的状态。**与 git stash pop 的区别是:不会删除stash,所以还原stash的时候,建议使用apply命令。**
使用方法:git stash apply stash@{编号}
6、git stash drop stash@{编号}
删除某个指定stash,无法指定多个,一次只能删除一个。
使用方法:git stash drop stash@{编号}
7、git stash clear
删除全部的stash。
8、git stash show
查看堆栈中最新保存的stash**(最新保存的stash名一定是:stash@{0})**和当前分支(缓存完后当前分支就会回复到上一次从远程库pull之后的状态)的差异,显⽰做了哪些改动。
例如StaticClass.java文件,我敲了2个回车,则show结果如下:
对比**stash@{0}**和当前分支差异之后,检测到路径为:
src/main/java/com/stephen/javademo/statictest/StaticClass.java
有1个文件,和上一次从远程库pull之后的状态相比,发生了2个插入改动(2个回车符)。
上面的拓展节点中,给大家介绍了一些git stash的常用命令,那么在实际开发中,是不是就一定要敲命令呢?
【我知道有些人是比较懒或记性差的,我自己也是,能鼠标操作的,绝对敲命令,而且我也不想即命令。。。。。。这一点,请大家不要向我学习。】
经过实践,我终于在IDEA开发工具中摸索出了最简单的stash使用方式。
解决方法:
缓存/暂存本地库中对当前分支的所有改动,在IDEA开发工具中的操作步骤如下:
**1、创建stash**:点击菜单栏的 **VCS-Git-Stash Changes... :**
弹出窗口如下,输入Message,勾选Keep index,点击 Create Stash按钮,如下:
这一步其实就相当于调用了命令 git stash save 'test stash1';
而 Keep index 的作用,直接上图吧:
翻译过来的意思就是说:**如果选中此复选框,则索引更改将保存在索引中。**
这个功能我就先不探究了,留给刚兴趣的小伙伴去实践一下,目前我就建议大家直接勾选就好了。
**2、查看stash列表**:点击菜单栏的 **VCS-Git-UnStash Changes... :**
弹出窗口,在Stashes项中可以看到我创建了4个stash,从上到下(从0到3)分别是最新到最旧。
除此之外,还发现该窗口有很多非常实用功能,而且还对应了拓展节点中提到的大部分常用的 git stash 命令,例如:
**View**:可以查看选中的stash中记录了什么文件及文件中的改动,如我选中第一个stash点击View:
双击打开窗口中的StaticClass.java文件,可以查看具体的改动,如:
** Drop:**相当于git stash drop stash@{编号},可以删除选中的stash。
这里我测试一下删除最后一个stash(即stash@{3}),如图:
** Clear:**相当于git stash clear,删除所有的stash。
测试Clear,如图:
点击Yes后,所有stash被删除:
**Pop stash:**勾选之后,会发现原来的Apply Stash按钮变成了Pop Stash,就相当于git stash pop命令,还原至选中的stash,并删除该stash。
测试Pop Stash选中的stash(stash@{2}):
可以发现Pop Stash之后,stash@{2}被自动删除了。
** Apply Stash:**相当于git stash apply stash@{编号}命令,还原至选中的stash。
测试Apply Stash选中的stash@{1}之后,发现stash@{1}还存在,未被自动删除。
至此就完成了IDEA中实现 git stash 命令的可视化操作了。
版权归原作者 Stephen·You 所有, 如有侵权,请联系我们删除。