zoukankan      html  css  js  c++  java
  • 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,回到工作现场。
     
     以上,共勉!
  • 相关阅读:
    postman一健导入swagger api所有接口
    pycharm 通过project interpreter国内镜像源设置
    Linux常用软件tree,autojump,lrzsz安装
    文献下载好用网站推荐
    SCIP,Clp,Gurobi和Cplex安装
    Linux下SuperLU安装
    【微服务理论】康威定律
    项目实战:动态系统的设计(类似朋友圈)
    认知提升:工作和薪资
    博客园美化 Cnblogs-Theme-SimpleMemory
  • 原文地址:https://www.cnblogs.com/storyawine/p/13408421.html
Copyright © 2011-2022 走看看