作者 | 梁唐

来源 | TechFlow(ID:techflow2019)

头图 |  CSDN 下载自东方IC

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

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

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

image-20201023084358700

这个时候应该怎么办呢?最好的办法当然是使用 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代码被冲掉的问题

    解决Git Revert操作后再次Merge代码被冲掉的问题 参考文章: (1)解决Git Revert操作后再次Merge代码被冲掉的问题 (2)https://www.cnblogs.com/ja ...

  2. git 查看pop内容_原创 | 有了Git这个操作,我再也不怕代码混乱了!

    点击上方蓝字,关注并星标,和我一起学技术. 大家好,今天的文章我们来介绍git当中一个非常常用的功能--储藏. 大家在协同开发的时候应该都有这样的经历,有的时候我们的功能开发了一半,因为某些原因我们想 ...

  3. git add . 之后 想执行回滚操作(git add 到本地仓库的代码回滚到没有add 之前的操作)

    git add 到本地仓库的代码回滚到没有add 之前的操作 ,如果git 非常熟悉临时忘记了命令 回滚单个文件的命令:git restore --staged  xx文件名 回滚所有add 的文件直 ...

  4. java代码操作git_JGit--实现Git命令操作的Java API

    问题来源:最近在做一个项目,其中有一块需要用户上传代码到服务器中,然后分析用户所传的代码,传代码最直接的方式就是用户打个包上传,但是后期再分析代码的时候还要代码实现解压上传的代码,操作起来比较复杂. ...

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

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

  6. Git超实用总结,再也不怕记忆力不好了

    Git 是什么? Git 是一个分布式的代码管理容器,本地和远端都保有一份相同的代码. Git 仓库主要是由是三部分组成:本地代码,缓存区,提交历史,这几乎是所有操作的本质,但是为了文章更加简单易懂, ...

  7. git idea 可视化_那些你应该知道的,但是你一定不知道的 Git 骚操作

    Hello 大家好,作为团队中的主程阿粉经常参与很多核心功能的开发,而且很多时候一个需求没做好中间又插入新的紧急的需求或者 bug 修复,每次遇到这种情况,如果两个地方代码不冲突的话还好,可以直接在本 ...

  8. git每次操作提示输入密码问题解决

    git每次操作提示输入密码问题解决 参考文章: (1)git每次操作提示输入密码问题解决 (2)https://www.cnblogs.com/JaminXie/p/11103806.html 备忘一 ...

  9. Git 远程操作详解

    2019独角兽企业重金招聘Python工程师标准>>> Git是目前最流行的版本管理系统,学会Git几乎成了开发者的必备技能. Git有很多优势,其中之一就是远程操作非常简便.本文详 ...

最新文章

  1. mySQL优化 my.ini 配置说明
  2. [你必须知道的.NET]第一回:恩怨情仇:is和as
  3. 多个切点 boot spring_全网独家Spring/Cloud/MVC/Boot,脑图+面试+进阶,就问你服不服?...
  4. JZOJ 5987. 【WC2019模拟2019.1.4】仙人掌毒题
  5. ARM MMU工作原理剖析[转]
  6. SQLite数据库如何存储和读取二进制数据
  7. 潍坊经贸每年单招计算机的成绩,2018潍坊职业学院单招成绩查询时间
  8. 信度和效度经典例子_浅析经典目标检测评价指标--mmAP(一)
  9. spring mvc原理_SpringBoot:认认真真梳理一遍自动装配原理
  10. 在bitbucket.org上创建Git仓库
  11. 南京邮电大学计算机专业学费多少,南京邮电大学学费多少
  12. 天宫初级认证答案_百度初级认证考题_试题1题目+答案
  13. windows10服务器iis发布网站,win10系统+iis7发布网站或服务的详细办法
  14. G-Biosciences Tube-O-DIALYZER系列透析管方案
  15. Apache ZooKeeper【动物管理员】
  16. 在c语言如何对拨码开关编程,拨码开关控制实验
  17. python矩阵运算_python矩阵计算
  18. Linux扩展文件分区
  19. Chrome 快速清理某个地址缓存
  20. codevs 4052 黎恒健大战YJY

热门文章

  1. a = a + 1, a++, ++a ,a+=1区别在哪
  2. 三,linux系统的由来
  3. P3381 【模板】最小费用最大流
  4. iOS中将后台JSON数据转化为模型的总结
  5. 如何在centos7上安装redis
  6. STL学习笔记 ---- 由set的声明所引发的自定义比较的实现方式 作者:winterTTr(转载请注明)...
  7. 矩池云上安装ikatago及链接教程
  8. kalman filter java_Kalman filters(一)
  9. pycharm使用技巧及最常用的几个快捷键
  10. 【图像处理】基于半色调技术的图像打印程序(Image Printing Program Based on Halftoning)