Git的stash功能
软件开发中,经常会出现bug,在git中,由于分支的强大性,所以每个bug都可以通过一个新的分支去解决,修复后,合并分支,然后再将分支删除。
那么,现在出现了这样一种情况:
当你接到一个代号101的bug任务的时候,很自然的,你想创建一个分支,但是你在当前dev上的工作还没有提交,并且不还没有开发完,没法提交,而且,又不能直接切换到master分支去,因为dev下有没有add和commit的文件,如果直接切换master分支的话,那些改动也会跟到master的工作区去,很麻烦,那么此时,我们就要用到一个重要命令了 git stash
首先我们来模拟上面的情景:
[root@VM-75-64 test]# git status
# On branch master
nothing to commit (working directory clean) #当前master分支里没有修改
[root@VM-75-64 test]#
[root@VM-75-64 test]# ll
total 8
-rw-r--r-- 1 root root 125 May 15 18:13 readme.md
-rw-r--r-- 1 root root 7 May 15 11:41 test.txt
[root@VM-75-64 test]# git checkout -b dev #此时我们创建一个dev开发分支
Switched to a new branch 'dev'
[root@VM-75-64 test]# ll
total 8
-rw-r--r-- 1 root root 125 May 15 18:13 readme.md
-rw-r--r-- 1 root root 7 May 15 11:41 test.txt
[root@VM-75-64 test]# git branch
* dev
master
[root@VM-75-64 test]# vim test.txt
lalala
ni hao ya #我们在dev的test.txt文件中添加一行 ni hao ya
[root@VM-75-64 test]# git checkout master #此时如果我们不提交,直接切换到master分支的话看下情况
M test.txt
Switched to branch 'master'
[root@VM-75-64 test]# git branch
dev
* master
[root@VM-75-64 test]# ll
total 8
-rw-r--r-- 1 root root 125 May 15 18:13 readme.md
-rw-r--r-- 1 root root 17 May 16 10:12 test.txt
[root@VM-75-64 test]# cat test.txt
lalala
ni hao ya #是不是,dev的修改也跟到这里来了
[root@VM-75-64 test]# git checkout dev #我们切回dev分支
M test.txt
Switched to branch 'dev'
[root@VM-75-64 test]# git add test.txt #仅仅执行add操作
[root@VM-75-64 test]# git checkout master #再次切回master分支
M test.txt
Switched to branch 'master'
[root@VM-75-64 test]# cat test.txt
lalala
ni hao ya #修改依旧存在
[root@VM-75-64 test]# git checkout dev #切回dev
M test.txt
Switched to branch 'dev'
[root@VM-75-64 test]# git add test.txt
[root@VM-75-64 test]# git commit -m 'deploy test.txt' #执行两步操作,add和commit
[dev d402e91] deploy test.txt
1 files changed, 1 insertions(+), 0 deletions(-)
[root@VM-75-64 test]# git status
# On branch dev
nothing to commit (working directory clean)
[root@VM-75-64 test]# git checkout master
Switched to branch 'master'
[root@VM-75-64 test]# git status
# On branch master
nothing to commit (working directory clean)
[root@VM-75-64 test]# cat test.txt
lalala #看,此时的修改,才没有被带出来
所以从上面的情境中可看出,在开发环境中做的修改,如果没提交就切换到master分支的话,会把那些修改带到master的工作区,这种是不允许出现的,那么,又不提交,又需要能够切回到master去处理那些线上bug,就用我们上面提到的指令:
git stash
[root@VM-75-64 test]# git merge --no-ff dev #我们先合并dev的代码
Merge made by recursive.
test.txt | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
[root@VM-75-64 test]# git branch -d dev #删除分支,从新模拟环境
Deleted branch dev (was d402e91).
[root@VM-75-64 test]# git checkout -b dev #新的dev分支
Switched to a new branch 'dev'
[root@VM-75-64 test]# vim test.txt
lalala
ni hao ya
another test #又添加了一行新内容
[root@VM-75-64 test]# git stash #没有add也没有commit,直接git stash
Saved working directory and index state WIP on dev: 295b7e1 Merge branch 'dev'
HEAD is now at 295b7e1 Merge branch 'dev'
[root@VM-75-64 test]# git status #此时看工作区就是clean的
# On branch dev
nothing to commit (working directory clean)
[root@VM-75-64 test]# git branch
* dev
master
[root@VM-75-64 test]# cat test.txt #是在dev分支的,但是之前的修改没了,仿佛回到最原始的dev分支
lalala
ni hao ya
[root@VM-75-64 test]# git checkout master #好,我们切回master分支
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 2 commits.
[root@VM-75-64 test]# cat test.txt
lalala
ni hao ya #看到修改文件依旧是原始状态
这里我们假设bug已经顺利解决了,我们需要重新切回到dev分支继续开发
[root@VM-75-64 test]# git checkout dev
Switched to branch 'dev'
[root@VM-75-64 test]# git branch
* dev
master
[root@VM-75-64 test]# git stash list #这个指令,要重点记一下,
stash@{0}: WIP on dev: 295b7e1 Merge branch 'dev' #这里就是刚刚保存的stash
工作现场还在,只是我们要怎么去恢复?
有两种方法:
一是用git stash apply恢复,但是恢复后,stash内容并不删除,你需要用git stash drop来删除;
另一种方式是用git stash pop,恢复的同时把stash内容也删了:
[root@VM-75-64 test]# git stash pop #这里我们直接用的pop
# On branch dev
# Changed but not updated:
# (use "git add <file>..." to update what will be committed)
# (use "git checkout -- <file>..." to discard changes in working directory)
#
# modified: test.txt
#
no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (fdd867c7acbab09f9a98fa4208b423b4b7bacfc0)
[root@VM-75-64 test]# git stash list #看到stash的list已经空了
[root@VM-75-64 test]# ll
total 8
-rw-r--r-- 1 root root 125 May 15 18:13 readme.md
-rw-r--r-- 1 root root 30 May 16 10:21 test.txt
[root@VM-75-64 test]# cat test.txt #同时这里dev之前的修改也已经恢复出来了!
lalala
ni hao ya
another test
嗯,这个东西还是很有用处的,不过大多数时候,在你要切换到其他分支的时候,都要在当前分支add和commit的,完了回来再改呗~这里的不能commit有点勉强了撒~
总结:
修复bug时,我们会通过创建新的bug分支进行修复,然后合并,最后删除;
当手头工作没有完成时,先把工作现场git stash一下,然后去修复bug,修复后,再git stash pop,回到工作现场。
以上,共勉!