git stash工具

对于工作区和暂存区,有一个特别重要也是容易被大家忽略的点:那就是对于所有分支而言,工作区和暂存区是公共的。也就是说,未add的内容不属于任何一个分支, 未commit的内容也不属于任何一个分支,git 切换分支时会把未add或未commit的内容带过去。

假设有这么一个需求,你现在在develop分支上进行某个功能的开发,当你开发到一半的时候,你的leader告诉你说master分支上出现了一点紧急bug,需要你立即修复,那么你只能放下手头的工作去修复bug了,在你新建一个hotfix分支去修复bug之前,你应该先对你之前开发到一半的develop分支做好处理工作,你的代码开发到一半,那么你的工作区和暂存区应该是不干净的,还没有提交到本地库上,如果直接切换到hotfix分支,由于工作区和暂存区是公共的,那么hotfix分支的工作区和暂存区也是不干净的,一方面会对hotfix分支有影响,另一方面就是当你修复完bug之后再回到develop分支,也可能工作区和暂存区的内容已经跟之前不一样了。所以我们必须对工作区和暂存区做一个处理。我们有两种方法:

  1. 提交到本地库:把完成一半的代码commit提交到本地仓库,然后切换分支去修改bug,改好之后再切换回来。这样的话往往log上会有大量不必要的记录,所以一般不这么做。
  2. 使用git bash 工具:使用git stash就可以将你当前未提交到本地(和服务器)的代码推入到Git的栈中,这时候你的工作区间和上一次提交的内容是完全一样的,所以你可以放心的修bug,等到修完bug,提交到服务器上后,再使用git stash pop将以前一半的工作应用回来。

总结:git stash可以获取你工作目录的中间状态——也就是你修改过的被追踪的文件和暂存的变更——并将它保存到一个未完结变更的堆栈中,随时可以重新应用。

PS:在当前分支git stash的内容, 在其他分支也可以git stash pop出来,为什么? 因为:工作区和暂存区是公共的

git stash 相关命令

  1. git stash:把所有未提交的修改(包括暂存的和非暂存的)都保存起来,用于后续恢复当前工作目录。执行完该操作后通过git status就可以看到一个干净的工作目录了
  2. git stash save "存储的信息":效果是与git stash一样的,只是会给每次存储的版本记录一个信息
  3. git stash list:查看现有的stash
  4. git stash pop:弹出stash堆栈的栈顶,可以恢复之前缓存的工作目录,这个命令还会将将缓存堆栈中的第一个stash删除
  5. git stash apply:弹出stash堆栈的栈顶,可以恢复之前缓存的工作目录,这个命令不会删除stash
  6. git stash drop:后面可以加上stash名字,可以移除指定的stash
  7. git stash clear:删除所有缓存的stash
  8. git stash -u :可以stash未被git追踪的文件
  9. git stash -a :可以stash当前目录下的所有修改。
git stash 会缓存的文件
  1. 已添加到暂存区的修改(staged changes)
  2. 已被Git跟踪的但并未添加到暂存区的修改(unstaged changes)
git stash 不会缓存的文件
  1. 未被追踪的文件(untracked files)
  2. 被忽略的文件(ignored files)

重要概念

对于暂存区,其实我们通过git status命令看的主要就是暂存区的内容

对于工作区,其实就可以理解成我们在idea开发时界面能到看的一些代码操作

我们通过git status命令查看一下:

在这里插入图片描述

图中1所示的就是已经添加到暂存区的修改,也就是我们执行了git add操作之后的更改会在这里显示

图中2所示的就是已被git追踪的但是还未添加到暂存区的修改,一般来说,我们对已存在的文件进行修改之后都会存放在这个位置

图中3所示的就是还未被git追踪的修改,一般来说,我们新建文件的操作都会存放在这个位置

我们已经知道了,通过git stash 命令能够将已添加到暂存区和已被git追踪但未提交到暂存区的文件给暂时存储起来,但是如果是未被追踪的文件是不会被存储起来的,如果需要的话可以加上-u参数,但是我们一般都不这么做,一般都是先直接git add添加到暂存区;

另外,假设这么一个场景:我们在develop分支上对一个类文件进行了修改,但是这个修改还未提交到本地库,因为我们的开发进行到一半;这时候我们切换到另一个hotfix分支上的时候,通过git status命令可以看到暂存区是不干净的,另外,我们在hotfix分支上还能看到这个修改,为什么呢?其实就是因为工作区和暂存区是所有分支共用的,所以我们在工作区能看到develop未提交的修改,而当我们执行了git stash命令之后,就会发现在hotfix这个工作区是看不到develop分支的修改了,另外通过git status命令看到的暂存区也是干净的了。

结语

Git的重要性毋庸置疑,现在外面公司基本都会用git进行版本控制,所以对于git的相关操作和概念是必须掌握的,要学习git,一定不能干看着,必须多加实践,多敲命令才能真正的记住这些命令,你看懂了这些命令并不代表真正的学会了git操作,有时候自己动手敲命令的过程才是学习到最多知识的!

其实在之前我就已经学习过git,曾经天真的以为我掌握了git,到头来发现自己只记住了git clone😱

坚持是一种习惯!

Logo

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

更多推荐