正如两个单词的字面意思一样,stash(贮藏)、pop(将准备好的东西突然拿出来)
这一节模拟git中的这两个命令:git stash
和 git stash pop
在实际开发中,解决bug是避免不了的,在git中,每个bug都是通过新建一个临时分支来修复,修复完成后合并分支,然后删除临时分支。
当你develop分支上开发新的功能,代码写到一半的时候,突然测试报了个bug让你现在解决,但是手上代码写到一半,总不能现在提交吧,因为解决bug是在新的分支上,总得保持工作区以及暂存区是干净的吧。这时候git的stash功能就派上了用场;
现在假设要解决生产上的bug,生产上的bug通常比较急,我们在master分支上创建bug临时分支(这里一般生产紧急bug都是基于master创建,当然也看个人习惯和团队要求,这个后面再说):
好了,情景都搭建好了,现在来操作,在自己的功能分支上,执行以下命令:
$ git stash
Saved working directory and index state WIP on feature: e13ca91 添加一级标题
HEAD is now at e13ca91 添加一级标题
对应在GitKraken上的操作是:
然后可以从GitKraken上可以看到,工作区以及暂存区都干干净净,在log区域可以看到有个存储样式的图标:
好了现在可以去修改bug了,切换到master分支,创建bug分支:
$ git checkout master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 8 commits.
(use "git push" to publish your local commits)
$ git checkout -b issue-001
Switched to a new branch 'issue-001'
修复完成之后提交,切换到master分支,将bug分支分别合并到master和develop,最后删除bug临时分支:
# 切换到master
$ git checkout master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 8 commits.
(use "git push" to publish your local commits)
## 合并bug分支到master
$ git merge --no-ff -m "merge bug fix 001" issue-001
Merge made by the 'recursive' strategy.
demo1.html | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
# 切换到develop
$ git checkout develop
Switched to branch 'develop'
# 合并bug分支到develop
$ git merge --no-ff -m "merge bug fix 001" issue-001
Merge made by the 'recursive' strategy.
demo1.html | 4 +---
1 file changed, 1 insertion(+), 3 deletions(-)
# 删除bug分支
$ git branch -d issue-001
Deleted branch issue-001 (was 1f1b4f4).
OK,现在bug修复完成了,现在又要回到自己的功能分支继续开发了
之前在功能分支上的修改存储在stash中,可以通过 git stash list
来查看:
$ git stash list
stash@{0}: On feature1: 1:
现在把stash的内容恢复到工作区:
$ git stash pop stash@{0}
On branch feature1
Changes not staged for commit:
(use "git add ..." to update what will be committed)
(use "git checkout -- ..." to discard changes in working directory)
modified: demo1.html
no changes added to commit (use "git add" and/or "git commit -a")
Dropped stash@{0} (fe26b728927240e931a406cd763fb0ddb448271e)
这里 git stash pop
是 git stash apply
(恢复) 和 git stash drop
(删除) 的综合
可以看到之前的工作修改已经全部恢复到了工作区(之前的暂存区的内容也会恢复到工作区)