应用场景
当我们开发一个新功能时会先从master
拉出一个分支dev,然后在这个dev
分支下吭哧吭哧的开始写代码开发新功能,就如下代码所示,我们在dev
分支下开发Person
类的新功能getId()
java
public class Person {
private int id;
private String name;
private int age;
public Person(int id) {
this.id = id;
}
// new feature by dev branch
public int getId() {
return String; // new feature have bug
}
}
就在此时,线上版本master
出现了bug
,我们应该放下手头上新功能的开发工作先将master
上的bug
修复,这个时候dev
分支下的改动怎么处理? - 向dev
分支提交新功能的代码,然后再切换到master
下 - 直接切换到master
分支下
首先我们新功能的代码还没开发完成,其次新功能这里还有一些bug
没解决,就这样把有问题的代码提交到dev
分支中,虽然可以解决目前我们的处境但不是很妥;但是第二种方案,直接切换,明显更不妥。怎么办?我们好像陷入了困境......
![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/9600cc8229e643cb91de43878795e932.jpeg#pic_center)
git stash使用语法
别急,git stash
命令恰好可以完美解决该问题!
git stash
命令用于暂时保存没有提交的工作。运行该命令后,所有没有commit
的代码,都会暂时
从工作区移除,回到上次commit
时的状态。
它处于git reset --hard
(完全放弃还修改了一半的代码)与git commit
(提交代码)命令之间,很类似于"暂停"按钮。
js
# 暂时保存没有提交的工作
$ git stash
Saved working directory and index state WIP on workbranch: 56cd5d4 Revert "update old files"
HEAD is now at 56cd5d4 Revert "update old files"
# 列出所有暂时保存的工作
$ git stash list
stash@{0}: WIP on workbranch: 56cd5d4 Revert "update old files"
stash@{1}: WIP on project1: 1dd87ea commit "fix typos and grammar"
# 恢复某个暂时保存的工作
$ git stash apply stash@{1}
# 恢复最近一次stash的文件
$ git stash pop
# 丢弃最近一次stash的文件
$ git stash drop
# 删除所有的stash
$ git stash clear
上面命令会将所有已提交到暂存区,以及没有提交的修改,都进行内部保存,没有将工作区恢复到上一次commit
的状态。
使用下面的命令,取回内部保存的变化,它会与当前工作区的代码合并。
js
$ git stash pop
这时,如果与当前工作区的代码有冲突,需要手动调整。
git stash
命令可以运行多次,保存多个未提交的修改
。这些修改以"先进后出"的stack结构
保存。
git stash list
命令查看内部保存的多次修改。
js
$ git stash list
stash@{0}: WIP on new-feature: 5cedccc Try something crazy
stash@{1}: WIP on new-feature: 9f44b34 Take a different direction
stash@{2}: WIP on new-feature: 5acd291 Begin new feature
上面命令假设曾经运行过git stash
命令三次。
git stash pop
命令总是取出最近一次
的修改,但是可以用git stash apply
指定取出某一次的修改。
js
$ git stash apply stash@{1}
git stash
子命令一览:
js
# 展示目前存在的stash
$ git stash show -p
# 切换回stash
$ git stash pop
# 清除stash
$ git stash clear