在实际开发中,经常会遇到这样的状况,咱们正在 dev
上开发一个功能,这个时候忽然接到上级命令,须要修改一个紧急 bug-5501
,固然咱们立刻想到的就是建立一个 branch bug-5501
的分支来修复它,可是这个时候咱们在 dev
上的功能已经写了一半了,若是咱们直接建立分支,并 chekcout branch bug-5501
的话,咱们在 dev
上的修改的内容,也会显示在咱们 branch bug-5501
上,这样就会让咱们感受到很是混乱。咱们也不能提交咱们未完成的功能到 dev
上,那这个时候怎么办呢?java
在Git中,为咱们提供了 git stash
命令,专门负责处理这种状况。让咱们一块儿来了解该命令吧。git
为了演示具体效果,这里如下面例子为例,咱们在dev
开发的新功能,修改了Person.java
,具体以下所示:bash
这个时候咱们运行git staus
指令,能够看到仓库状态:app
$ git status
Your branch is up to date with 'origin/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/Person.java
复制代码
若是直接在当前 dev
分支上直接直接执行命令 git branch bug-5501
,那么咱们咱们修改的内容也也会在 bug-5501
分支上,以下所示:spa
那如今咱们想要建立一个新的分支 branch bug-5501
,可是不想包括咱们以前修改的 Person.java
中的内容,那么咱们可使用 git stash
或 git stash save
指令。命令行
xuwentaodeMacBook-Pro:GitPracticetest xuwentao$ git stash
Saved working directory and index state WIP on master: 3d1d704 添加了person类
xuwentaodeMacBook-Pro:GitPracticetest xuwentao$ git status
On branch master
Your branch is up to date with 'origin/master'.
复制代码
这个时候再使用 git status
,查看咱们的仓库状态:3d
On branch master
Your branch is up-to-date with 'origin/master'.
nothing to commit, working directory clean
复制代码
咱们发现,咱们的仓库状态是干净的。那这个时候咱们在建立,并切换到相应分支上,那这个时候其余的分支是不包含以前咱们修改的内容的,也就是以下图所示:code
在上图中,从上往下分别为两个步骤:cdn
dev
分支上,咱们调用 git stash
or git stash save message
命令。bug-5501
,并切换到该分支下。经过上述两个步骤后,那如今咱们就能够开心的在咱们的bug-5501
分支开发啦。blog
git stash
会将当前的存储内容,自动添加一条描述信息,且描述信息为当前分支
上最后一次 commit 的 message 。git stash save
须要你指定 stash 的描述信息,好比这样: git stash save "建立了一条记录"
。须要注意的是,每次调用 git stash
or git stash save
的记录都是以栈
的形式存储的。查看 stash 记录咱们能够经过 git stash list
指令来查看:
xuwentaodeMacBook-Pro:GitPracticetest xuwentao$ git stash list
stash@{0}: on master: 添加了Woman类
stash@{1}: on master: 添加了Person类
复制代码
在上述记录中,最后提交的 stash 记录始终在栈顶
也就是stash@{0}
,该栈的角标是从零
开始逐级递增
,而且栈顶的角标始终为零
。
删除特定的 stash 记录,咱们能够经过 git stash list
指令找到咱们想要删除的记录,而后调用 git stash drop
指令就好了,如咱们想删除 stash@{0}
这条记录:
xuwentaodeMacBook-Pro:GitPracticetest xuwentao$ git stash list
stash@{0}: WIP on master: 3d1d704 添加了person类
xuwentaodeMacBook-Pro:GitPracticetest xuwentao$ git stash drop stash@{0}
复制代码
固然,若是你想删除全部的stash记录,咱们也能够经过 git stash clear
指令。
若是这个时候咱们修改了 bug-5501
,如今咱们想切换回咱们以前的 dev
分支,并恢复以前咱们调用 git stash
or git stash save
所存储的内容,那如今咱们该怎么操做呢?咱们能够先经过 git stash list
找到咱们想要恢复的stash记录,而后经过使用 git stash apply
指令来恢复咱们想要的内容。这里咱们以记录 stash@{0}
为例:
xuwentaodeMacBook-Pro:GitPracticetest xuwentao$ git stash list
stash@{0}: WIP on master: 3d1d704 添加了person类
xuwentaodeMacBook-Pro:GitPracticetest xuwentao$ git stash apply stash@{0}
复制代码
具体场景以下所示:
注意:当你调用
git stash apply
并不指定具体的stash记录时,默认会恢复栈顶的stash记录。也就是等同于git stash apply stash@{0}
。
在上中咱们已经讲解了如何使用stash并恢复等一系列操做,如今咱们来说解在命令 git stash save
中的选填参数, --keep-index
,默认状况下使用 git stash save
命令是不带这个选项的,下面咱们就看看这个参数的具体使用意义。
解释一下上图的流程:
修改(modify)
Person类,并新建(add)
Woman.java 这个文件(该文件已经被添加到暂存区了)。git save stash
命令,这个时候 dev
分支上就只会有没有修改的Person类。Person 类的修改与 Woman.java 两个更改都放入stash记录栈中
。bug-5501
分支,去改咱们的bug,当咱们修改bug完毕后,咱们check out 到 dev
分支上来,并想恢复以前咱们存储的内容,那么咱们调用 git stash apply
时,以前咱们修改的person 类与新建的 Woman.java 文件就又会回到咱们的 dev
分支上。若是咱们使用git stash meessage --keep-index
,咱们看看又是什么效果呢?,具体以下图所示:
观察上图,咱们会发现,使用了--keep-index
参数后,在stash记录栈中是不会存储 git add
命令已暂存的东西,也就是不会存储 Woman.java 文件。
须要注意的是,当咱们使用
--keep-index
参数时,由于不会stasht记录栈中是不会存储git add
命令已暂存的东西,故若是咱们建立新分支时,咱们以前git add
的文件也会在新分支中。是否添加该参数,由你们须要而定。
了解了Git的存储与清理的相关命令后,咱们来了解一下,在 IntelliJ IDEA
or Android Sutdio
中Git存储与清理的图形化界面的对应流程。虽然命令行很是牛逼,可是有时候咱们也想偷个懒对吧。
首先咱们来看一下建立一个 stash 在 IntelliJ IDEA
中的流程,首先点击鼠标右键。依次选择下图中红色箭头所指内容。
按照上图的指示,依次点击,咱们能获得下图:
上图中:
--keep-index
参数。选中添加,反之不添加。若是你已经熟悉了Git的建立 stash 的指令,我相信这里对你没有什么难度啦。
仍是点击鼠标右键,依次选择下图中红色箭头所指内容。
按照上图的指示,依次点击,咱们能获得下图:
下面简单的总结一下:
git stash
会将当前的存储内容,自动添加一条描述信息,且描述信息为当前分支
上最后一次 commit 的 message 。git stash save message
须要你指定 stash 的描述信息。git stash list
:查看全部的 stash 记录。git stash apply
:应用某个 stash ,但不会把存储从存储列表中删除,默认使用栈顶的 stash 即 stash@{0}
,若是要使用其余 stash 须要调用 git stash apply stash@{$num}
, 好比第二个:git stash apply stash@{1}
。git stash pop
:将 stash 栈中的对应 stash 记录删除,并将对应修改应用到当前的工做目录下,默认为第一个 stash 即 stash@{0}
,若是要应用并删除其余stash,命令:git stash pop stash@{$num}
,好比应用并删除第二个:git stash pop stash@{1}
。git stash drop stash@{$num}
:删除对应 stash 栈中的 stash 记录。好比删除第二个: git stash drop stash@{1}
git stash clear
:删除全部 stash 。站在巨人的肩膀上,才能看的更远~