场景

在同一个应用(代码)的情况下
1、产品发来一个新的需求,波波同学创建了一个分支A并进行功能开发。
2、系统出现一个 bug,波波同学需要停下开发工作,优先修复bug,于是他想创建一个新的分支B。
3、由于在分支A上已经开发了一部分功能,那么就需要先把分支A上的代码进行提交,然后创建分支B。此次分支A的提交基本上是一次无意义的提交。如果一直采用这种方式来创建新的分支,那么会在分支A上形成大量无用的提交记录,不利于代码的跟踪。
4、步骤3 的本质是将分支A修改的代码进行存档,对于分支B是透明的。那么有没有更好的方式存档代码呢?这便是本文的主题:git stash 神器。

有的人把 stash 称为【储藏】,我觉得称为【存档】更形象一些,玩过游戏的朋友应该更容易理解存档哈,文章中统一称为存档。大家怎么喜欢怎么来哈,如有不正之处,欢迎批评指正。

在介绍 stash 之前,我们先简单的介绍下 git 中的几类文件:

  • 添加到暂存区的修改(staged changes)
  • git 跟踪的但并未添加到暂存区的修改(unstaged changes)
  • 在工作目录中新的文件,git为跟踪的(untracked files)
  • 被忽略的文件(ignored files)

用法

存档当前的修改(git stash)

git stash 把所有未提交的修改都归档,包含暂存的和非暂存的文件。执行该命令后,当前的工作目录就 clean 了。

示例:

D:\workspace\buffalo>git status
On branch master
Your branch is up to date with 'origin/master'.Changes to be committed:(use "git reset HEAD <file>..." to unstage)new file:   readme.txtChanges 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:   readme.txtD:\workspace\buffalo>git stash
Saved working directory and index state WIP on master: 28469b9 修改测试数据D:\workspace\buffalo>git status
On branch master
Your branch is up to date with 'origin/master'.nothing to commit, working tree cleanD:\workspace\buffalo>

需要说明的是,stash 是基于本地存储的,不会通过 git push 上传到 git server 上。
一般在进行存档时,我们需要为存档增加一些备注,记录版本变化内容,git stash 不允许我们输入备注的,但 git 为我们提供了另一个命令 git stash save "comment" 来解决这个问题。

示例:

D:\workspace\buffalo>git stash save "add file readme.txt"
Saved working directory and index state On master: add file readme.txtD:\workspace\buffalo>

查看现有的存档(git stash list)

通过 git stash list 命令可以查看当前工程的现有存档。

示例:

D:\workspace\buffalo>git stash list
stash@{0}: On master: add file readme.txtD:\workspace\buffalo>

通过示例我们可以看到,存档名为:stash@{0},存档发生在 master 分支,存档时的备注为 “add file readme.txt”。
存档名是一个文字序列,类似stash@{0}、stash@{1}、stash@{2}、stash@{3}等等。

恢复已存档的修改(git stash pop|apply)

通过 git stash pop|apply 命令可以将存档恢复至当前工程。popapply 的区别在与,在恢复归档后 pop,会将存档删除,而 apply 则不会删除存档。

git stash pop|apply 命令恢复第一个存档,等价于 git stash pop|apply stash@{0}
git stash pop|apply stash_name 命令恢复指定存档名的存档。

示例:

D:\workspace\buffalo>git stash save "add file readme.txt"
Saved working directory and index state On master: add file readme.txtD:\workspace\buffalo>git stash list
stash@{0}: On master: add file readme.txtD:\workspace\buffalo>git stash save "add file init.txt"
Saved working directory and index state On master: add file init.txtD:\workspace\buffalo>git stash list
stash@{0}: On master: add file init.txt
stash@{1}: On master: add file readme.txtD:\workspace\buffalo>git stash apply stash@{1}
On branch master
Your branch is up to date with 'origin/master'.Changes to be committed:(use "git reset HEAD <file>..." to unstage)new file:   readme.txtD:\workspace\buffalo>git stash list
stash@{0}: On master: add file init.txt
stash@{1}: On master: add file readme.txtD:\workspace\buffalo>

通过示例可以发现,我们使用 git stash apply stash@{1} 命令将第二个存档恢复,并且没有删除该存档。

移除存档(git stash drop|clear)

git stash drop stash_name 命令删除指定存档名的存档。
git stash clear 命令删除当前工程的所有的存档。

示例:

D:\workspace\buffalo>git stash list
stash@{0}: On master: add file init.txt
stash@{1}: On master: add file readme.txtD:\workspace\buffalo>git stash drop stash@{1}
Dropped stash@{1} (616728a7d8964ee86c1c77b19b906848cfe1cde0)D:\workspace\buffalo>git stash list
stash@{0}: On master: add file init.txtD:\workspace\buffalo>

通过示例可以发现,我们使用 git stash drop stash@{1} 删除了第二个存档。

查看存档的DIFF(git stash show)

git stash show 命令查看第一个存档的DIFF,等价于 git stash show stash@{0}
git stash show stash_name 命令查看指定存档的DIFF。

示例:

D:\workspace\buffalo>git stash list
stash@{0}: On master: add file readme.txt
stash@{1}: On master: add file init.txtD:\workspace\buffalo>git stash showreadme.txt | 1 +1 file changed, 1 insertion(+)D:\workspace\buffalo>git stash show stash@{1}init.txt | 1 +1 file changed, 1 insertion(+)D:\workspace\buffalo>

基于存档创建分支(git stash branch)

git stash branch branch_name 命令基于第一个存档创建分支。
git stash branch branch_name stash_name 命令基于指定的存档创建分支。

示例:

D:\workspace\buffalo>git stash list
stash@{0}: On master: add file readme.txt
stash@{1}: On master: add file init.txtD:\workspace\buffalo>git stash show stash@{1}init.txt | 1 +1 file changed, 1 insertion(+)D:\workspace\buffalo>git stash list
stash@{0}: On master: add file readme.txt
stash@{1}: On master: add file init.txtD:\workspace\buffalo>git stash branch test-stash
Switched to a new branch 'test-stash'
On branch test-stash
Changes to be committed:(use "git reset HEAD <file>..." to unstage)new file:   readme.txtDropped refs/stash@{0} (b7afb7e9eafe241d318a22693e0b0fcd1bccde08)

通过示例可以发现,我们使用 git stash branch test-stash 基于第一个存档创建了 test-stash 分支。

存档未跟踪和忽略的文件(git stash -u|a)

git stash -ugit stash --include-untracked 命令可以存档未跟踪的文件。
git stash -agit stash -all 命令可以存档所有的文件。

【Git】使用 git stash 命令存档和恢复代码文件相关推荐

  1. linux indent命令: 调整C原始代码文件的格式

    linux indent命令: 调整C原始代码文件的格式 介绍: indent命令可辨识C的原始代码文件,并加以格式化,以方便程序员阅读. 语法: indent [参数][源文件] indent [参 ...

  2. 使用git stash命令保存和恢复进度

    上一篇博客我们使用git checkout命令来切换分支. 我们有时会遇到这样的情况,正在dev分支开发新功能,做到一半时有人过来反馈一个bug,让马上解决,但是新功能做到了一半你又不想提交,这时就可 ...

  3. git shanchu stash_git stash命令详解

    git stash命令用于将更改储藏在脏工作目录中. 使用语法 git stash list [] git stash show [] git stash drop [-q|--quiet] [] g ...

  4. git shanchu stash_git stash命令使用手册

    修改记录压栈保存: git stash push -u -m "msg" // -u ~ --意思是包含未被跟踪的文件 git stash push -m "msg&qu ...

  5. git shanchu stash_git stash命令

    git stash命令 当切换分支的时候,如果有未提交的变更记录,此时系统会阻止你切换分支,解决方法有两种. 一种是先将代码commit,切换分支修改完毕,再次切换回原分支,利用amend命令,取消c ...

  6. grep命令帮你恢复误删文件

    作为长期的电脑使用者,肯定会有误删文件的经历,在 Mac OS X 和 Windows 上删除的文件都会默认进 "回收站".在 Linux 上如果事先没有用别名(alias)修改默 ...

  7. Linux下安装Git、git命令介绍

    前言 环境:centos7.9 git version 1.8.3.1 Git官网 https://git-scm.com/ 安装Git [root@git ~]# yum install git # ...

  8. git的一些简单命令(git clone,git branch,git checkout。。。)

    1.git clone 命令 $ git clone <版本库的网址> 比如,克隆jQuery的版本库. $ git clone https://github.com/jquery/jqu ...

  9. 【Git】Git的使用与学习

    文章目录 Git学习笔记 0. Git学习资料 1. Git初见:安装与配置(Get Started) 1.1 Git核心特点 1.2 安装Git 1.3 安装后配置Git 1.4 获取帮助 2. G ...

  10. git stash 命令详解

    1. 应用场景 2. 添加储藏 3. 查看储藏 4. 删除储藏 5. 使用储藏 6. 常见用法 1. 应用场景 git stash 命令用于将工作区中的更改和暂存区中的内容储存起来 日常开发中,会经常 ...

最新文章

  1. GlideApp 引入不了问题
  2. TensorFlow2.0来了
  3. dos命令添加war包
  4. ABP学习 解决:Update-Database : 无法将“Update-Database”项识别为 cmdlet、函数、脚本文件或可运行程序的名称的问题
  5. OpenCV Windows Pack but it has no binaries compatible with your configuratio
  6. conda 删除环境_conda建立、删除、退出环境
  7. 暑假周总结七8.26
  8. Redis学习笔记五:独立功能之事务
  9. python保存模块_Python使用Pickle模块进行数据保存和读取的讲解
  10. python之if经典语句_Python之if语句、字典
  11. 2018-2019-1 20165202 20165210 20165214 实验二 固件程序设计
  12. Elasticsearch从0.90(0.90.x)到1.2(1.x)API的变化-二
  13. PHP 调用阿里云短信服务API发送短信
  14. 你知道门禁卡的原理吗?手机模拟门禁卡研究
  15. 红帽linux挑战赛题目,红帽Linux挑战赛模拟题
  16. linux下载m3u8工具,[2020.11.2更新]m3u8命令行下载工具,支持windows和linux
  17. 四种常见数据模型(维度模型、范式模型等)
  18. 杭州电子科技大学acm--2020
  19. scratch和python怎么读_Python如何像scratch一样朗读文字?|python3教程|python入门|python教程...
  20. 【LaTeX】子图和图片并排

热门文章

  1. 投资股票和股票市场的基本原理
  2. VUE ECharts人际关系图
  3. 彻底弄懂CSS盒子模式之五
  4. 树莓派4装 Kali 64位系统进行性能测试
  5. 理发店开店的合理性(第二题)
  6. html随机出现一张图片,HTML技术:如何在网页中图片的随机显示
  7. layui eleTree改造,支持格式化节点
  8. matlab电机系统建模,基于Matlab/Simulink交流电机矢量控制系统建模与仿真
  9. 职称证书全国能否通用
  10. Python数据类型——字符串详解(1)