大家好,今天的文章我们来介绍git当中一个非常常用的功能——储藏

大家在协同开发的时候应该都有这样的经历,有的时候我们的功能开发了一半,因为某些原因我们想要checkout到其他的分支上查看代码或者是执行某个工作。但是如果我们直接执行checkout,git会禁止我们的行为。

我拿本地的项目举个例子,可以看到当我们执行了checkout命令之后,git提示我们在一些文件的改动会被覆盖,所以拒绝了我们的checkout命令。

这个时候应该怎么办呢?最好的办法当然是使用git commit把改动提交了。但问题是有的时候我们不想提交一些代码,比如还没有经过严谨的测试,或者是我们临时开发的一些测试功能等等。在这种情况下commit也是不合适的,即使提交了了,之后在push之前也会要把commit撤销了。但如果一不小心忘记了,可能就会造成悲剧。

针对这个问题,git提供了一个解决策略就是stash功能。

储藏改动

git stash可以将本地还没有提交的改动全部存储起来。接着,我们在之前的某一篇文章当中加上一行-test stash。

我们执行一下git diff,可以看到这行改动。

接着我们执行git stash,会发现我们的git目录又回到了没有改动的状态。再执行git diff也看不到任何改动了。

这是因为git把我们本地还没有提交的改动都暂存了起来,这样方便我们进行checkout或者是其他一些操作,而不会起冲突或者是其他的影响。

应用改动

那么当我们操作完成之后,想要还原刚才暂存起来的内容,这个时候应该怎么办呢?

也有办法,我们只需要使用git stash apply或者是git stash pop这两个命令就可以将刚才暂存起来的内容还原了。但是这里有一个问题,就是stash apply和pop之间是不同的。

这里涉及到stash内部的实现机制,stash内部其实是通过堆栈实现的。pop对于堆栈而言很明确,就是弹出的意思。也就是说如果我们使用的是pop,那么当我们pop之后,这条记录会在堆栈当中删除。而如果使用的是apply呢,记录不会从堆栈当中删除,仍然会保留下来。

一般情况下我使用pop多一些,但是pop也有缺点,比如pop没有办法选择应用的记录。我们可以使用git stash list来查看一下当前堆栈当中已经有的记录。

如果我们使用git stash pop的话,默认的是应用的栈顶的记录,也就是stash@{0}。但如果我们使用stash apply的话,我们可以自由选择我们想要应用的记录。比如如果我们想要应用最后一条记录的话,我们可以这样:

git stash apply stash@{2}

关于应用储存的修改也有一些细节,首先是储藏和修改对应的分支可以不同。我们可以在一个分支储藏,之后切换到另外一个分支进行应用。并且如果我们在应用之前修改了同样的内容的话,也会引起合并冲突。

另外就是当我们应用储藏的时候,会发现我们之前add过的文件又重新回到了未暂存的状态。如果我们想要重新回到文件被暂存的状态时,我们可以使用index选项来执行。

git stash apply --index

对于我们已经不想要的储藏记录,我们可以执行git stash drop来进行删除。

其他技巧

除了上述的功能之外,git stash还有一些其他的用法。

比如--keep-index选项,在不加这个选项的时候,当我们使用git stash,它会把所有没有commit的内容全部stash。但是有的时候我们不希望这样,我们希望它只暂存我们没有add到暂存区的内容。这个时候我们就可以通过这个参数实现。

另外一个参数是-u或者是--include-untracked,我们从这个名字上也看得出来。它们的意思是在stash的时候将新创建并且还没有被git管理的文件也一并储藏起来。

除此之外,还有--patch的功能也很常用。patch我们曾经在上篇文章讲解交互式命令的时候讲到过,它可以将git针对的改动缩小到代码而不是文件级别。交互式地和我们操作哪些代码层面的改动需要存储起来,操作方法和上篇文章介绍的一样。大家如果有所遗忘可以在文末找到上一篇的文章进行回顾。

最后一个功能是从储藏上新建一个分支,有的时候我们先储存了代码之后又继续进行了一些工作。这个时候如果我们再恢复从前的改动则会引起冲突。这个时候我们可以运行git stash branch新建一个新的分支,在这个分支上应用我们的提交。

git stash branch applystash

应用成功之后Git会自动抛弃掉对应的stash记录,非常方便,不过我个人没有用过,因为实际工作当中没有遇到这么复杂的情况。

今天的文章就到这里,衷心祝愿大家每天都有所收获。如果还喜欢今天的内容的话,请来一个三连支持吧~(点赞、关注、转发

有了Git这个操作,我再也不怕代码混乱了!的更多相关文章

  1. 解决Git Revert操作后再次Merge代码被冲掉的问题

    转:https://blog.csdn.net/paul_wei2008/article/details/77477932 https://blog.csdn.net/cxn945/article/d ...

  2. 有了Git这些操作,我再也不怕开发了!

    Git 是什么? Git 是一个分布式的代码管理容器,本地和远端都保有一份相同的代码. Git 仓库主要是由是三部分组成:本地代码,缓存区,提交历史. Git 有哪些常规操作? Git的常规操作你了解 ...

  3. 【转】Git超实用总结,再也不怕记忆力不好了

    [转]Git超实用总结,再也不怕记忆力不好了 欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯工蜂发表于云+社区专栏 Git 是什么? Git 是一个分布式的代码管理容器,本地和 ...

  4. Git远程操作详解

    Git是目前最流行的版本管理系统,学会Git几乎成了开发者的必备技能. Git有很多优势,其中之一就是远程操作非常简便.本文详细介绍5个Git命令,它们的概念和用法,理解了这些内容,你就会完全掌握Gi ...

  5. Git远程操作

    Git远程操作 // */ // ]]>   Git远程操作 Table of Contents 1 Git远程命令概览 2 Git远程仓库与本地仓库的关系图 3 git clone 4 git ...

  6. [转]Git远程操作详解

    原文:http://www.ruanyifeng.com/blog/2014/06/git_remote.html Git是目前最流行的版本管理系统,学会Git几乎成了开发者的必备技能. Git有很多 ...

  7. Git基础操作

    配置秘钥 1.检查本机有没有秘钥 检查~/.ssh看看是否有名为d_rsa.pub和id_dsa.pub的2个文件. $ ~/.sshbash: /c/Users/lenovo/.ssh: Is a ...

  8. GIT本地操作

    01. GIT简介(PPT) ================================================================================ 02. ...

  9. Git 远程操作详解

    Git是目前最流行的版本管理系统,学会Git几乎成了开发者的必备技能. Git有很多优势,其中之一就是远程操作非常简便.本文详细介绍5个Git命令,它们的概念和用法,理解了这些内容,你就会完全掌握Gi ...

随机推荐

  1. Learn day1 变量/数据类型

    1.Python 简介 (1) 1989年开发的语言,创始人范罗苏姆(Guido van Rossum),别称:龟叔(Guido). (2) python具有非常多并且强大的第三方库,使得程序开发起来 ...

  2. Linux 系统编程 学习:04-进程间通信2:System V IPC(1)

    Linux 系统编程 学习:04-进程间通信2:System V IPC(1) 背景 上一讲 进程间通信:Unix IPC-信号中,我们介绍了Unix IPC中有关信号的概念,以及如何使用. IPC的 ...

  3. XJOI 夏令营501-511NOIP训练14 砍树(2)

    小A是小B家的园丁.小B的家里有n棵树,第i棵树的横坐标为i.一天,小B交给小A一个任务,让他降低自己家中的某些树木的高度.这个任务对小A来说十分简单,因为他有一把极其锋利的斧头和一门独门砍树秘籍,能 ...

  4. 带货直播源码开发采用MySQL有什么优越性

    MySQL是世界上最流行的开源关系数据库,带货直播源码使用MySQL,可实现分钟级别的数据库部署和弹性扩展,不仅经济实惠,而且稳定可靠,易于运维.云数据库 MySQL 提供备份恢复.监控.容灾.快速扩 ...

  5. leetcode115:search -insert-position

    题目描述 给出一个有序的数组和一个目标值,如果数组中存在该目标值,则返回该目标值的下标.如果数组中不存在该目标值,则返回如果将该目标值插入这个数组应该插入的位置的下标 假设数组中没有重复项. 下面给出 ...

  6. 简单了解JSON Web令牌(JWT)

    什么是JWT JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的.自包含的方式,用于作为JSON对象在各方之间安全地传输信息.该信息可以被验证和信任,因为它 ...

  7. Spark Standalone模式 高可用部署

      本文使用Spark的版本为:spark-2.4.0-bin-hadoop2.7.tgz. spark的集群采用3台机器进行搭建,机器分别是server01,server02,server03. 其 ...

  8. PriorityQueue原理分析——基于源码

    在业务场景中,处理一个任务队列,可能需要依照某种优先级顺序,这时,Java中的PriorityQueue(优先队列)便可以派上用场.优先队列的原理与堆排序密不可分,可以参考我之前的一篇博客: 堆排序总 ...

  9. 经典c程序100例==81--90

    [程序81] 题目:809*??=800*??+9*??+1 其中??代表的两位数,8*??的结果为两位数,9*??的结果为3位数.求??代表的两位数,及809*??后的结果. 1.程序分析: 2.程 ...

  10. 绝对定位元素left、right、top、bottom值与其margin和宽高的关系

    绝对定位元素(position: absolute)在其相对定位元素(即文档流中最近的非静态定位祖先元素)中,定位祖先元素的宽度为W,垂直高度为H,则存在以下关系: 元素水平方向 width + le ...