stash在英文意思是隐藏。git stash 的作用也是隐藏没完成的代码,防止它干扰别人或者新分支的工作。

一、背景

1.1 我们经常会遇到这样的情况

正在 dev 分支开发新功能,做到一半时有人过来反馈一个 bug ,需要马上解决,但是新功能做到了一半你又不想提交。

这时就可以使用 git stash 命令先把当前进度保存起来,然后切换到另一个分支去修改bug;修改完提交后,再切回 dev 分支,使用git stash pop来恢复之前的进度继续开发新功能。

看到这里,有些小伙伴就有疑问:没必要啊,修 BUG 的时候,直接切换分支,修改完提交后再切回来到原来的分支不就行了。

1.2 真的要这么麻烦吗?

  • 比如有情景如下:
  1. dev 分支下创建一个文件 dev_file.txt,并 add,让它 stage
  2. 这时切到 master 分支,你会看到这个 dev_file.txt 居然也在 master 分支里。他不是应该只在 dev 分支吗?
  • 如果你试试你再试试:
  1. 切回 dev 分支,执行 git stash
  2. 这时你在切回 master 分支, dev_file.txt 就消失了。

这时候,我不禁想说:git stash,YYDS !

二、git stash

当你执行 git stash 时会提醒你:

Saved working directory and index state WIP on newF2: b63fbcb add dev_file.txt
HEAD is now at b63fbcb add dev_file.txt。

它已经把 dev_file.txt 保存好了。

2.1 git stash 干了什么

它会保存当前工作进度,会把暂存区和工作区的改动保存到一个未完结变更的堆栈中;执行完这个命令后,在运行git status命令,就会发现当前是一个干净的工作区,没有任何改动。

  1. git stash 是本地的,不会上传到服务器上;
  2. 可以通过使用git stash save 'message...'可以添加一些注释。

2.2 git stash 相关命令

命令名 作用
git stash 隐藏当前的工作现场, 此时, git status的结果是 clean
git stash list 查看所有隐藏, 每一行的冒号前面的字符串就是标识此隐藏的id
git stash apply 重新显示标识为 id 的隐藏
git stash drop git apply恢复隐藏后, 需要手动删除 list 列表中的记录
git stash pop 恢复最新的进度到工作区
git stash pop stash@[stash_id] 恢复指定的进度到工作区

如:git stash pop stash@{1}stash_id是通过git stash list命令得到的;

三、git stash 使用场景

3.1 有人与我改动同一分支

我在本地修改好后,发现远程分支已经被改动了,此时我本地也被改动了就造成了冲突,无法 push 或者 pull

此时,就可以用 git stash 来处理

// 把本地的改动暂存起来
git stash
// 拉取远程分支(此时本地分支会回滚到上次commit的情况,你的改动都存在stash中)
git pull
// 将stash中改动重新加回本地分支,就可以继续修改了,当然,如果改好了就是add,commit,push
git stash pop

3.2 不小心改动了其他分支

例如忘记切换,将代码写错了分支,直接在 master 分支上做改动,这里假设我的分支是 feature/category_vechice 分支。

// 把本地当前改动暂存起来,此时master分支就恢复到了上次拉取时的状态
git stash
// 切换到需要改动的分支
git checkout test
// 将改动pop到自己当前的分支
git stash pop

四、小结

顾名思义,stash 就是一个栈,平时我们把需要暂存的文件存到栈中,把代码恢复到上次拉取的状态以进行操作。

就我个人使用而言,git stash pop 就已经满足日常需要了,毕竟频繁的线上 bug 或者忘记切代码啥的,我们应该考虑的不是这个命令的问题,是开发质量的范畴了。

【Git 系列】一个超好用的命令你会用吗?的更多相关文章

  1. Git 系列(三):建立你的第一个 Git 仓库

    现在是时候学习怎样创建你自己的 Git 仓库了,还有怎样增加文件和完成提交. 在本系列前面的文章中,你已经学习了怎样作为一个最终用户与 Git 进行交互:你就像一个漫无目的的流浪者一样偶然发现了一个开 ...

  2. Git 系列(二):初步了解 Git

    在这个系列的介绍篇中,我们学习到了谁应该使用 Git,以及 Git 是用来做什么的.今天,我们将学习如何克隆公共 Git 仓库,以及如何提取出独立的文件而不用克隆整个仓库. 由于 Git 如此流行,因 ...

  3. Git系列②之部署企业级开源仓库gitlab服务器

    Git系列②之部署企业级开源仓库gitlab服务器 上一篇我们介绍了github的常见使用方法,下面开始部署本地开源仓库gitlab GitLab 是一个用于仓库管理系统的开源项目. 1.安装配置gi ...

  4. 搭建一个超好用的 cmdb 系统

    10 分钟为你搭建一个超好用的 cmdb 系统 CMDB 是什么,作为 IT 工程师的你想必已经听说过了,或者已经烂熟了,容我再介绍一下,以防有读者还不知道.CMDB 的全称是 Configurati ...

  5. Git系列教程三 配置与基本命令

    一.安装Git 网上有很多安装教程,可以参考.这里使用的是Windows版本的Git,点击这里下载. 二.基本设置 安装完成后,通过点击鼠标右键就可以看到新添加了俩个Git命令:Git GUI Her ...

  6. Aoite 系列(02) - 超动感的 Ioc 容器

    Aoite 系列(02) - 超动感的 Ioc 容器 Aoite 是一个适于任何 .Net Framework 4.0+ 项目的快速开发整体解决方案.Aoite.Ioc 是一套解决依赖的最佳实践. 说 ...

  7. git查看一个文件的历史记录

    git log --all -- '*'FILENAME'*' 支持模糊查询 主要用于查找历史上被删除的文件 可以做成git的一个快捷命令 find = "!f(){ git log --a ...

  8. 【Xamarin挖墙脚系列:Android最重要的命令工具ADB】

    原文:[Xamarin挖墙脚系列:Android最重要的命令工具ADB] adb工具提供了很好的基于命令的对系统的控制. 以前说过,安卓的本质是运行在Linux上的虚机系统.在Linux中,对系统进行 ...

  9. Git 系列(五):三个 Git 图形化工具

    在本文里,我们来了解几个能帮你在日常工作中舒服地用上 Git 的工具. 我是在这许多漂亮界面出来之前学习的 Git,而且我的日常工作经常是基于字符界面的,所以 Git 本身自带的大部分功能已经足够我用 ...

随机推荐

  1. P5748-集合划分计数【EGF,多项式exp】

    正题 题目链接:https://www.luogu.com.cn/problem/P5748 题目大意 求将\(n\)的排列分成若干个无序非空集合的方案. 输出答案对\(998244353\)取模. ...

  2. 前端从web服务器或者CDN下载资源

    前段时间听到前端同学说前端拿到资源的CDN链接后可以直接从CDN下载资源,不需要经过后端,感觉很神奇,但是一致不明白是怎么实现的,前两天整理了下关于CDN和对象存储的知识,今天搜了下前端直接下载资源的 ...

  3. HC(Histogram-based Contrast) 基于直方图对比度的显著性

    HC(Histogram-based Contrast) 基于直方图对比度的显著性 来源于: 2011, Global contrast based salient region detection, ...

  4. hmac和socketserver

    一,hmac 验证客户端的合法性 hmac,检测客户端是否合法,不依赖登录认证 server import os,socket,hmac sk=socket.socket() sk.bind(('12 ...

  5. Java(19)接口知识及综合案例

    作者:季沐测试笔记 原文地址:https://www.cnblogs.com/testero/p/15201629.html 博客主页:https://www.cnblogs.com/testero ...

  6. 从零开始的Spring Session(一)

    Session和Cookie这两个概念,在学习java web开发之初,大多数人就已经接触过了.最近在研究跨域单点登录的实现时,发现对于Session和Cookie的了解,并不是很深入,所以打算写两篇 ...

  7. HTTP请求如何带参

    这两天正好作一份API的接口文档,关于HTTP request如何传递参数不是很清楚,这里转载了他人的文档,让我明白了很多.. http://tomfish88.iteye.com/category/ ...

  8. 寻找写代码感觉(八)之SpringBoot过滤器的使用

    一.什么是过滤器? 过滤器是对数据进行过滤,预处理过程,当我们访问网站时,有时候会发布一些敏感信息,发完以后有的会用*替代,还有就是登陆权限控制等,一个资源,没有经过授权,肯定是不能让用户随便访问的, ...

  9. UltraSoft - Alpha - Scrum Meeting 8

    Date: Apr 23th, 2020. Scrum 情况汇报 进度情况 组员 负责 昨日进度 后两日任务 CookieLau PM.后端 aliyun连接前后端,跑通demo 实现邮箱注册的验证码 ...

  10. 在Vue前端项目中,附件展示的自定义组件开发

    在Vue前端界面中,自定义组件很重要,也很方便,我们一般是把一些通用的界面模块进行拆分,创建自己的自定义组件,这样操作可以大大降低页面的代码量,以及提高功能模块的开发效率,本篇随笔继续介绍在Vue&a ...