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,回到工作现场。
 
 以上,共勉!
posted @ 2020-07-31 10:50  一个运维  阅读(294)  评论(0编辑  收藏  举报