【Git】使用 git stash 命令存档和恢复代码文件
场景
在同一个应用(代码)的情况下
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
命令可以将存档恢复至当前工程。pop
与 apply
的区别在与,在恢复归档后 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 -u
或 git stash --include-untracked
命令可以存档未跟踪的文件。
git stash -a
或 git stash -all
命令可以存档所有的文件。
【Git】使用 git stash 命令存档和恢复代码文件相关推荐
- linux indent命令: 调整C原始代码文件的格式
linux indent命令: 调整C原始代码文件的格式 介绍: indent命令可辨识C的原始代码文件,并加以格式化,以方便程序员阅读. 语法: indent [参数][源文件] indent [参 ...
- 使用git stash命令保存和恢复进度
上一篇博客我们使用git checkout命令来切换分支. 我们有时会遇到这样的情况,正在dev分支开发新功能,做到一半时有人过来反馈一个bug,让马上解决,但是新功能做到了一半你又不想提交,这时就可 ...
- git shanchu stash_git stash命令详解
git stash命令用于将更改储藏在脏工作目录中. 使用语法 git stash list [] git stash show [] git stash drop [-q|--quiet] [] g ...
- git shanchu stash_git stash命令使用手册
修改记录压栈保存: git stash push -u -m "msg" // -u ~ --意思是包含未被跟踪的文件 git stash push -m "msg&qu ...
- git shanchu stash_git stash命令
git stash命令 当切换分支的时候,如果有未提交的变更记录,此时系统会阻止你切换分支,解决方法有两种. 一种是先将代码commit,切换分支修改完毕,再次切换回原分支,利用amend命令,取消c ...
- grep命令帮你恢复误删文件
作为长期的电脑使用者,肯定会有误删文件的经历,在 Mac OS X 和 Windows 上删除的文件都会默认进 "回收站".在 Linux 上如果事先没有用别名(alias)修改默 ...
- Linux下安装Git、git命令介绍
前言 环境:centos7.9 git version 1.8.3.1 Git官网 https://git-scm.com/ 安装Git [root@git ~]# yum install git # ...
- git的一些简单命令(git clone,git branch,git checkout。。。)
1.git clone 命令 $ git clone <版本库的网址> 比如,克隆jQuery的版本库. $ git clone https://github.com/jquery/jqu ...
- 【Git】Git的使用与学习
文章目录 Git学习笔记 0. Git学习资料 1. Git初见:安装与配置(Get Started) 1.1 Git核心特点 1.2 安装Git 1.3 安装后配置Git 1.4 获取帮助 2. G ...
- git stash 命令详解
1. 应用场景 2. 添加储藏 3. 查看储藏 4. 删除储藏 5. 使用储藏 6. 常见用法 1. 应用场景 git stash 命令用于将工作区中的更改和暂存区中的内容储存起来 日常开发中,会经常 ...
最新文章
- GlideApp 引入不了问题
- TensorFlow2.0来了
- dos命令添加war包
- ABP学习 解决:Update-Database : 无法将“Update-Database”项识别为 cmdlet、函数、脚本文件或可运行程序的名称的问题
- OpenCV Windows Pack but it has no binaries compatible with your configuratio
- conda 删除环境_conda建立、删除、退出环境
- 暑假周总结七8.26
- Redis学习笔记五:独立功能之事务
- python保存模块_Python使用Pickle模块进行数据保存和读取的讲解
- python之if经典语句_Python之if语句、字典
- 2018-2019-1 20165202 20165210 20165214 实验二 固件程序设计
- Elasticsearch从0.90(0.90.x)到1.2(1.x)API的变化-二
- PHP 调用阿里云短信服务API发送短信
- 你知道门禁卡的原理吗?手机模拟门禁卡研究
- 红帽linux挑战赛题目,红帽Linux挑战赛模拟题
- linux下载m3u8工具,[2020.11.2更新]m3u8命令行下载工具,支持windows和linux
- 四种常见数据模型(维度模型、范式模型等)
- 杭州电子科技大学acm--2020
- scratch和python怎么读_Python如何像scratch一样朗读文字?|python3教程|python入门|python教程...
- 【LaTeX】子图和图片并排