一. 应用场景

1 当正在dev分支上开发某个项目,这时项目中出现一个bug,需要紧急修复,但是正在开发的内容只是完成一半,还不想提交,这时可以用git stash命令将修改的内容保存至堆栈区,然后顺利切换到hotfix分支进行bug修复,修复完成后,再次切回到dev分支,从堆栈中恢复刚刚保存的内容。
2 由于疏忽,本应该在dev分支开发的内容,却在master上进行了开发,需要重新切回到dev分支上进行开发,可以用git stash将内容保存至堆栈中,切回到dev分支后,再次恢复内容即可。

总的来说,git stash命令的作用就是将目前还不想提交的但是已经修改的内容进行保存至堆栈中,后续可以在某个分支上恢复出堆栈中的内容。这也就是说,stash中的内容不仅仅可以恢复到原先开发的分支,也可以恢复到其他任意指定的分支上。git stash作用的范围包括工作区和暂存区中的内容,也就是说没有提交的内容都会保存至堆栈中。

二. 有关stash的主要命令

1. git stash

  • git stash能将所有未提交的更改(暂存区)保存到堆栈中。
$ git status
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   src/main/java/com/wy/CacheTest.java
        modified:   src/main/java/com/wy/StringTest.java

no changes added to commit (use "git add" and/or "git commit -a")

$ git stash
Saved working directory and index state WIP on master: b2f489c second

$ git status
On branch master
nothing to commit, working tree clean
  • git stash save升级版stash,可以加上注释,用于区分多条stash
    git stash 效果
stash@{0}: WIP on master: b2f489c second

git stash save “test1”效果

stash@{0}: On master: test1
  • git stash list
    stash列表,查看每次stash的内容

2. git stash pop

将最近的一次stash的内容弹出到当前所在分支
(注意: stash是可以跨分支传递的
stash存入堆栈,栈是先进后出,所以弹出最近一次的内容)

$ git stash list
stash@{0}: On master: test2
stash@{1}: On master: test1

$ git stash pop
On branch master
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   src/main/java/com/wy/StringTest.java

no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (afc530377eacd4e80552d7ab1dad7234edf0145d)

$ git stash list
stash@{0}: On master: test1

3. git clear

清除堆栈中所有内容

4. git stash 高级操作

  • git stash apply
    将堆栈中的内容应用到当前目录,和git stash pop不同的是,该命令不会将内容从堆栈中删除,也就说该命令能够将堆栈的内容多次应用到工作目录中,适应于多个分支的情况。
  • git stash drop XXX
    从堆栈中移除某个指定的stash
  • git stash show
    查看堆栈中最新保存的stash和当前目录的差异。
    可通过 git stash show -p 查看详细的不同
  • git stash branch
    从最新的stash创建分支,可以用于解决stash中的内容和当前目录的内容发生冲突的情景。 (如果针对同一个文件的修改而发生冲突,恢复失败,这里通过创建新的分支来解决。)

三. 使用案例

1. 有紧急bug

有紧急bug时,用git stash命令将修改的内容保存至堆栈区,然后顺利切换分支进行bug修复
最开始testing文件是这样的
在这里插入图片描述
让我们进行一些修改
在这里插入图片描述
这个时候紧急bug出现,那我们又不想提交现在的代码,而且还不想舍弃,那么请使用git stash命令(首先把自己的分支择干净)
在这里插入图片描述
工作区的代码又恢复到之前的状态
在这里插入图片描述
并切换你的分支,进行修改。

$ git checkout dev

现在修改完成,切换回分支,并取出你stash在堆栈中的内容
在这里插入图片描述
查看取出修改后的工作区代码如上。又恢复到之前。

2. 切换分支时切换失败

  1. 背景:
    由于疏忽,本应该在dev分支开发的内容,却在master上进行了开发,需要重新切回到dev分支上进行开发。
  • 当我们切换分支时,切换失败,出现“Your local changes to the following files would be overwritten by checkout”
  • 解决方法:可以用git stash将内容保存至堆栈中,切回到dev分支后,再次恢复内容即可
    在这里插入图片描述
  • 解读错误:当前分支有未跟踪的文件,checkout 命令会覆盖它们,请缓存( stash )或者提交( commit )。
  • 这个时候,如果你不想在该分支上提交,那么应该先把它先提交到暂存区,然后用git stash 命令来存到堆栈。当你切换成功后,再git stash pop即可,(若两分支包含同一个文件,最好确保两个分支文件无冲突,否则会发生冲突)
    git stash 可以跨分支,所以之前分支stash的内容可以跳转到你现在的分支上来。(前提是必须先提交到暂存区,不跨分支可以不提交暂存区如上例)

注意跨分支时:

  • git stash 不会把本地未跟踪的文件存到堆栈,只会把提交到暂存区(Changes to be committed)的部分提交到堆栈
  • git stash pop 会把之前跟踪过的文件恢复到之前未提交到暂存区的状态(但是新建立的(之前未跟踪过的)文件提交到暂存区的文件会停留在暂存区)

举例
修改testing777文件为

//原文件
make a test
//现文件
make a test
make test2

在这里插入图片描述

在这里插入图片描述
这个时候我们如果返回main分支查看一下,发现没有什么可以stash pop 的了,文件和之前未修改的状态一样。
在这里插入图片描述
testing777文件:

make a test
  1. 错误分析
    当我们执行 checkout 操作的时候,git 会检查工作区是否存在未跟踪文件,所以在执行checkout命令时工作目录和暂存区中那些还没有被提交的修改可能会与你即将检出的分支产生冲突阻止你切换分支,在切换分支前,请保持一个干净的状态
    简单介绍一下git 本地管理的三个部分:
    在这里插入图片描述
    在这里插入图片描述
    当我们执行checkout命令时,git会检查你本地工作区是否还存在未跟踪文件,若存在会报错。
  • 如果仅仅是切换分支,stash(缓存堆栈)里的内容等切回分支后再弹出(pop)使用的话,直接stash命令就OK。
  • 如果是切换分支并把stash(缓存堆栈)里的内容弹出(pop)到该切换分支上,那么请记得先提交(add)到暂存区。
    在这里插入图片描述

参考文章 - git 命令行
参考文章 - git stash 和 git stash pop
git stash 详解

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐