Git实用教程-第十一篇:Git工具之储藏(git stash)

       我们在软件开发中,往往一边在开发新功能,一边要面临着紧急修复线上bug。前面我们说过,这时需要新建一个临时bug分支来修复,但切换分支前,需要将当前正在开发的这部分代码保存起来,但开发到一半,我不想提交到本地版本库,有没有什么办法将这部分代码先隐藏,然后切换分支去修复bug,等bug修复完成后,再回到当前分支,将之前隐藏的代码拿出来继续开发呢?幸好,Git已经为我们提供了这样的工具:\color{red}{git stash}

一、作用

git stash 可以将当前工作区和暂存区所有未提交的改动保存起来,存储在单独开辟的一个独立空间中,如果存储了多个stash,是先进后出,可以理解为缓存堆栈。任何时候、任何分支都可以将stash弹出来。

二、基本操作

1、stash存储

首先切换到test分支,编辑文件readme.txt,添加一行记录:111,并添加至暂存区

$ vi readme.txt
Git is a distributed version control system.
Git is open source and free. Git is easy to learn.
Hello Git.
111

$ git add readme.txt

然后再编辑文件readme.txt,再添加一行记录:222,不添加至暂存区

$ vi readme.txt
Git is a distributed version control system.
Git is open source and free. Git is easy to learn.
Hello Git.
111
222

查看当前状态

$ git status
On branch test
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    modified:   readme.txt

Changes 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.txt

目前,暂存区添加的一行是111,工作区添加的一行是222

这时,接到需求,要回到master分支,修改bug,可以使用git stash(git stash是git stash save的缩写)命令将这些改动存储起来

$ git stash
Saved working directory and index state WIP on test: 7977066 Merge branch 'dev' into test

$ git status
On branch test
nothing to commit, working tree clean

保存成功,可以发现当前工作区的内容已经还原到本地最新的commit版本,切换到master分支,添加一行记录"Small and Fast."

$ git checkout master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.

$ vi readme.txt
Git is a distributed version control system.
Git is open source and free. Git is easy to learn.
Hello Git.
Small and Fast.
$ git add readme.txt
$ git commit -m "small and fast"
[master a4cd6b0] small and fast
 1 file changed, 1 insertion(+)

bug修复完成后,切换到test分支,取回之前未完成的工作,继续工作。
git stast list命令可以查看stash内容列表

$ git checkout test
Switched to branch 'test'

$ git stash list
stash@{0}: WIP on test: 7977066 Merge branch 'dev' into test

2、stash弹出并删除

\color{red}{git stash pop}命令,可以从缓存堆栈中弹出最新的的stash内容,同时缓存堆栈中也会删除该stash内容。

$ git stash pop
On branch test
Changes 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.txt

no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (65807853e29606b50e035952b38a30103722abfb)

输出的内容显示,已经从stash缓存堆栈中恢复了之前存储的内容,并删除了该stash。可以通过git stash list查看,发现此时已经没有任何内容了。

$ git stash list

3、stash弹出并保留

如果我们从stash缓存堆栈中恢复存储的内容时,不想删除该stash,该怎么办呢?可以使用\color{red}{git stash apply}命令

$ git stash
Saved working directory and index state WIP on test: 7977066 Merge branch 'dev' into test

$ git stash apply
On branch test
Changes 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.txt

no changes added to commit (use "git add" and/or "git commit -a")

$ git stash list
stash@{0}: WIP on test: 7977066 Merge branch 'dev' into test

4、stash删除

如果想直接删除stash缓存堆栈中最新的stash内容,可以使用\color{red}{git stash drop}命令

$ git stash list
stash@{0}: WIP on test: 7977066 Merge branch 'dev' into test

$ git stash drop
Dropped refs/stash@{0} (5aebb0f541ab919963d8784e1f95fe070f4c51d3)

$ git stash list

5、stash未被追踪的文件

刚刚我们通过stash存储的都是已经被Git追踪过的文件,如果这时有个新文件,直接使用git stash命令是不能存储的,需要添加参数 -u

$ touch temp.txt 
 ​
$ git stash -u
Saved working directory and index state WIP on test: 7977066 Merge branch 'dev' into test

$ git status
On branch test
nothing to commit, working tree clean

6、查看stash的详细内容

时间一长,可能已经忘记存储在stash中的具体内容了,可以通过git stash show 命令来查看详情

$ git stash list
stash@{0}: WIP on test: 7977066 Merge branch 'dev' into test

$ git stash show stash@{0}
 readme.txt | 2 ++
 1 file changed, 2 insertions(+)

加上 -p 参数可以查看具体内容

$ git stash show stash@{0} -p
diff --git a/readme.txt b/readme.txt
index 4b3e672..51bea68 100644
--- a/readme.txt
+++ b/readme.txt
@@ -1,3 +1,5 @@
 Git is a distributed version control system.
 Git is open source and free. Git is easy to learn.
 Hello Git.
+111
+222

小结

1、stash所有未提交的文件

$ git stash -u

2、stash被追踪过的未提交的文件

$ git stash

3、查看stash列表

$ git stash list

4、从stash缓存堆栈中弹出最新的stash,并删除该stash

$ git stash pop

5、从stash缓存堆栈中弹出最新的stash,并保留该stash

$ git stash apply

6、删除stash缓存堆栈中最新的一个stash

$ git stash drop

7、查看某个stash的详情

$ git stash show <stash id> -p
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 201,784评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,745评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,702评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,229评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,245评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,376评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,798评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,471评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,655评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,485评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,535评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,235评论 3 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,793评论 3 304
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,863评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,096评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,654评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,233评论 2 341

推荐阅读更多精彩内容

  • 声明:这篇文章来源于廖雪峰老师的官方网站,我仅仅是作为学习之用 Git简介 Git是什么? Git是目前世界上最先...
    横渡阅读 3,941评论 3 27
  • 1. 安装 Github 查看是否安装git: $ git config --global user.name "...
    Albert_Sun阅读 13,626评论 9 163
  • 这篇博文是自己在学习git过程中的思考总结。本文仅仅代表个人的看法,如有不妥地方还请本文文末留言。 😊 原文链接g...
    Ming_Hu阅读 1,043评论 4 18
  • 简介 Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。 Git 与常用的版本控制工具 ...
    闽越布衣阅读 2,725评论 0 18
  • git 使用笔记 git原理: 文件(blob)对象,树(tree)对象,提交(commit)对象 tree对象 ...
    神刀阅读 3,755评论 0 10