Git新手教程-存储与清理(八)

前言

在实际开发中,经常会遇到这样的状况,咱们正在 dev 上开发一个功能,这个时候忽然接到上级命令,须要修改一个紧急 bug-5501 ,固然咱们立刻想到的就是建立一个 branch bug-5501 的分支来修复它,可是这个时候咱们在 dev 上的功能已经写了一半了,若是咱们直接建立分支,并 chekcout branch bug-5501 的话,咱们在 dev 上的修改的内容,也会显示在咱们 branch bug-5501 上,这样就会让咱们感受到很是混乱。咱们也不能提交咱们未完成的功能到 dev 上,那这个时候怎么办呢?java

在Git中,为咱们提供了 git stash 命令,专门负责处理这种状况。让咱们一块儿来了解该命令吧。git

git stash 指令介绍

为了演示具体效果,这里如下面例子为例,咱们在dev开发的新功能,修改了Person.java,具体以下所示:bash

dev-新功能.jpg

这个时候咱们运行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

bug-5501.jpg

那如今咱们想要建立一个新的分支 branch bug-5501 ,可是不想包括咱们以前修改的 Person.java 中的内容,那么咱们可使用 git stashgit 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

git-stash流程.jpg

在上图中,从上往下分别为两个步骤:cdn

  • 步骤1:在 dev 分支上,咱们调用 git stash or git stash save message 命令。
  • 步骤2:当执行了步骤1后,咱们在接着建立分支 bug-5501,并切换到该分支下。

经过上述两个步骤后,那如今咱们就能够开心的在咱们的bug-5501分支开发啦。blog

git stash 与 git stash save 的区别

  • 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 记录

删除特定的 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 指令。

恢复 stash 所存储的内容

若是这个时候咱们修改了 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.jpg

注意:当你调用 git stash apply 并不指定具体的stash记录时,默认会恢复栈顶的stash记录。也就是等同于 git stash apply stash@{0}

git stash save --keep-index

在上中咱们已经讲解了如何使用stash并恢复等一系列操做,如今咱们来说解在命令 git stash save 中的选填参数, --keep-index,默认状况下使用 git stash save 命令是不带这个选项的,下面咱们就看看这个参数的具体使用意义。

不添加 --keep-index

不添加keep-index.jpg

解释一下上图的流程:

  • 上图中咱们在dev中开发新功能,修改(modify) Person类,并新建(add) Woman.java 这个文件(该文件已经被添加到暂存区了)。
  • 这个时候上级命令咱们改 bug-5501 ,这个时候,若是咱们调用 git save stash 命令,这个时候 dev 分支上就只会有没有修改的Person类。Person 类的修改与 Woman.java 两个更改都放入stash记录栈中
  • 这个时候咱们新建 bug-5501 分支,去改咱们的bug,当咱们修改bug完毕后,咱们check out 到 dev 分支上来,并想恢复以前咱们存储的内容,那么咱们调用 git stash apply 时,以前咱们修改的person 类与新建的 Woman.java 文件就又会回到咱们的 dev 分支上。
添加 --keep-index

若是咱们使用git stash meessage --keep-index,咱们看看又是什么效果呢?,具体以下图所示:

添加keep-index.jpg

观察上图,咱们会发现,使用了--keep-index参数后,在stash记录栈中是不会存储 git add 命令已暂存的东西,也就是不会存储 Woman.java 文件。

须要注意的是,当咱们使用--keep-index参数时,由于不会stasht记录栈中是不会存储 git add 命令已暂存的东西,故若是咱们建立新分支时,咱们以前git add的文件也会在新分支中。是否添加该参数,由你们须要而定。

IntelliJ IDEA or Android Sutdio 图形化界面使用stash

了解了Git的存储与清理的相关命令后,咱们来了解一下,在 IntelliJ IDEAor Android Sutdio中Git存储与清理的图形化界面的对应流程。虽然命令行很是牛逼,可是有时候咱们也想偷个懒对吧。

建立 stash 流程

首先咱们来看一下建立一个 stash 在 IntelliJ IDEA 中的流程,首先点击鼠标右键。依次选择下图中红色箭头所指内容。

stash建立流程.png

按照上图的指示,依次点击,咱们能获得下图:

stash模块介绍.jpg

上图中:

  1. Keep index:就是建立 stash 时,是否添加 --keep-index 参数。选中添加,反之不添加。
  2. Message:咱们建立的stash的描述。
  3. Creat Stash:建立stash

若是你已经熟悉了Git的建立 stash 的指令,我相信这里对你没有什么难度啦。

清理 stash 流程

仍是点击鼠标右键,依次选择下图中红色箭头所指内容。

unStash浏览流程.png

按照上图的指示,依次点击,咱们能获得下图:

unstash模块介绍.jpg

  1. Stashes:显示了咱们全部建立的 stash
  2. View:查看 stash 所存储的内容
  3. Drop:删除栈中对应的 stash
  4. Clear:清除栈中全部的 stash
  5. Pop stash:应用选中的 stash,而后当即从栈上删除它。
  6. As new Branch:将当前 stash 所存储的内容做为一个分支并checkout。也就是若是你在 master 建立一个stash,并设置了As new branch的 为 LoginBranch,那么你会立刻切换到 LoginBranch 分支中。
  7. Apply Stash:应用你选中的stash,可是不会删除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 。

参考

站在巨人的肩膀上,才能看的更远~

相关文章
相关标签/搜索