Git Stash 提高开发效率

Git Stash 提高开发效率.png

我要先来吐嘈下 Boss 的产品的用户体验问题,大家看下下图的红圈圈。

Boss 吐槽

看完没之后,是不是感觉挺好的,不想看这个职位可以直接通过这个叉叉关掉,功能是没问题,但是当你用的时候你就会发现问题了,无论你用你的大猪蹄子还是小鸡爪子去点这个叉叉,很容易就直接点进职位详情去了。

对于我这种强迫症的人来讲,点几次就头皮发麻了。

这里我想说一下产品经理的职位素养问题,我认为除了稳定输出功能完善的原型图,还有一个不能忽视的就是产品自己做的产品,一定要自己去用自己去体验,去思考,体验一百遍一千遍的那种,这样就不会在产品中出现奇怪的设计,然后还觉得自己这个功能做的很好。

毕竟,好不好,用过 N 次才知道。


目录

  1. git stash 的作用
  2. stash 在 暂存区和工作区的表现
  3. stash 已暂存和未暂存的更改
  4. Git 中未被追踪和已被追踪的文件
  5. stash 跟踪和未跟踪的文件
  6. stash 被 Git 忽略的文件
  7. 使用暂存的更改
  8. 查看暂存列表
  9. 如何添加暂存的描述信息
  10. 查看 stash 暂存的内容
  11. Stash 暂存单个文件
  12. 从 stash 取出单个文件来使用
  13. 从 Stash 创建一个分支
  14. 删除暂存
  15. 高级用法自动暂存
  16. 命令汇总
  17. 总结

前言

作为一名技术人员,我们知道,我们的工作经常会被要求实现更重要的功能或修复一些紧急的 bug,然后工作节奏就被无情的打断。

这种情况下我们面临着一个难题,当前开发任务还没完成只进行了部分,而我并没有准备好提交更改。

如果你对分支比较熟悉,马上能反应过来说,我可以通过分支对当前修改进行备份,OK,这没问题。

但是,Git 提供了一个命令来轻松处理这种情况。

认识 git stash 命令

运行 git stash 命令,就像是使用我们的文本编辑器的剪切功能,stash 会暂时保存已被 Git 追踪你最新的更改,把当前工作目录撤销到更改之前的状态,这样你就可以从头开始编写新功能。

如果需要,你可以决定随时把暂存的更改取出来并重新应用它们,当我们需要快速切换上下文去处理其他事情,而不丢失未完成的工作时,这会非常的方便。

但是请记住,stash 位于您的存储库的本地,当你在推送更改的时候,它是不会一起传输到远程服务器的。

问题:现在假如我们正在开发一个新功能,但是此时遇到一个紧急的 bug 需要修复或者开发任务的优先级发生了改变。

接下来就是我工作遇见这种情况,我的应对步骤。

  1. 首先使用 git status 命令检查已进行了多少更改:
image.png
  1. 接下里使用 git stash 命令存储更改:
image.png
  1. 新功能或者是修复 bug 的过程

  2. 当步骤三完成之后,我们就可以回到我们刚刚 stash 的 master 分支,然后通过 git stash pop 把暂存剪切出来。

image.png

Stash 在暂存区和工作区的表现

  • 更改了文件,还没有通过 add 把更改的文件由工作区添加到暂存区:
image.png

当我们查看本地状态的时候 git 告诉我们:Changes not staged for commit

  • 接下来我们查看已经通过 add 把本地最新的修改添加到暂存区的情况
image.png

通过对比我们发现,没有添加到暂存给的提示信息是红色的,已经添加到暂存给的提示信息就是绿色的。

  • 同一个文件暂存了一部分,然后又更改了一部分
image.png

stash 暂存工作区和暂存区的更改

通过上面的学习,现在我们已经了解了暂存区和非暂存区(工作区)更改是什么,接下来就是通过 stash 来暂存他们了。

先说结论:通过 git stash 命令可以暂时保存暂存区和非暂存区(工作区)的更改,当通过 git stash pop / git stash apply 重新取出它们后,所有更改都变为未暂存:

image.png

Git 中未被追踪和已被追踪的文件

现在我们知道 git stash 能够处理暂存区和非暂存区(工作区)的更改,我们需要知道它如何处理未跟踪和已跟踪的文件。

但在回答这个问题之前,让我们先了解一下 Git 中的未跟踪文件和已跟踪文件是什么。

未跟踪的文件

默认情况下,当您在工作目录中创建新文件时,它将显示为未跟踪,因为它不在 Git 版本系统中。

例如我创建了一个新的 App.vue 组件并执行了 git status 命令:

Git 未跟踪文件

Git 通过以下消息告诉我们该文件未被跟踪:Untracked files

跟踪文件

跟踪文件是下次执行 git commit 命令时应该提交的文件。

要将文件从未跟踪状态移动到已跟踪状态,运行 git add 命令即可。

跟踪的文件通常用绿色标记:

Git 跟踪文件

stash 暂存跟踪和未跟踪的文件

默认情况下 git stash 并不能暂存未跟踪文件:

`git stash` 并不能暂存未跟踪文件

当我们试图存储一个未跟踪的文件时,Git 提示我们:(No local changes to save)本地没有更改需要保存。

Git 无法跟踪未存储在 Git 中的文件,那我们可以怎么来解决呢?

  1. 通过 git add 添加到 git 的暂存区
  2. git stash -u,-u 是 --include-untracked 的缩写。

因为我们要暂存未被追踪的文件,可见 git stash -u 更加好用。

git stash -u

stash 被 Git 忽略的文件

git stash 是否适用于被忽略的文件(被忽略的文件是在 .gitignore 这个特殊文件中跟踪的文件)。

很显然默认情况下 git stash 不能暂存被忽略的文件,但我们可以通过使用(-a或 -all)来完成达到目的。

让我们把 App.vue 添加到 .gitignore 中:

// ..
App.vue

并验证它确实被忽略了,git status 命令显示我们只更改了.gitignore 文件,但它没有将 App.vue 显示为未跟踪的文件):

尝试使用 git stash -a 命令存储被忽略的文件,并在运行 git stash pop 后看到它已被重新应用,即使这个文件被 Git 忽略。

使用暂存的更改

可任选下面两个命令来使用暂存的的更改:

  • git stash apply 应用最新的 stash 更改,如果想使用指定的 stash ,可以使用命令git stash apply stash@{<index>}

要么

  • git stash pop 应用最新的 stash 更改
  • git stash pop stash@{<index>} 应用指定的 stash 更改

pop 和 apply 都做同样的事情,但它们之间有一个重要的区别,执行 pop 命令,暂存被使用,然后列表里面的暂存会被删除,执行 apply 命令,暂存被使用,然后列表里面的暂存依然保留。

PS:我一般都是使用 pop ,基本不使用 apply,因为暂存本来就是用完即可删除的,不删的话,暂存列表过多并不清晰。

查看暂存列表

在项目中我们是可以使用多次 stash 来暂存不同时间的不同更改的,这时会有一个暂存列表,那么如何查看这个暂存列表呢?

git stash list

需要注意的是每个暂存都会被标记为 WIP(Work In Progress) 和创建一个 commit 信息。

通过 git stash list 我们只能查看我们暂存的个数,并不能查看具体暂存的信息,这样我们很难弄懂我们到底做了哪些更改。所以必要的描述信息是很重要的,这是接下里的内容。

如何添加暂存的描述信息

我们可以通过如下命令来添加暂存的描述信息:

git stash save "<message>"

现在我来对文件做一个小改动,然后自定义描述让它隐藏起来,让我来演示下:

git stash message

现在我们看到它是有自定义描述的,这样我们就能更准确的看到此次 stash 具体是干啥的了。

查看 stash 暂存的内容

有时需要查看暂存的详细信息,以确这个暂存是我目前需要的。

这可以通过以下命令完成:

  • git stash show 查看最近一次的 stash 信息

  • git stash show stash@{<index>} 查看特定暂存的更改。

接下来让我们快速检查列表中的每个 stash 都做了哪些更改,先通过 git stash list 查看暂存列表:

通过 git stash list 查看暂存列表

查看最新的暂存更改 git stash show

git stash show`

查看指定的暂存更改 git stash show stash@{2}

git stash show stash@{2}

通过 save message 的信息,我们找到 stash 的 index 然后通过 git show 来查看哪些改变这时没问题的,但是有时候能查看到具体的文件内容会更加的直观。

于是如果我们想知道哪一行代码做了变动怎么查看呢?这时我们可以添加 -p--patch 标志:

演示 一下:

查看最新暂存更改 git stash show -p

查看最新暂存更改 `git stash show -p`

查看指定暂存更改 git stash show stash@{2} -p

查看指定暂存更改 `git stash show stash@{2} -p`

Stash 暂存单个文件

现在我们看到 Stash 暂存的是当前所有更改,但有时,您可能不想隐藏所有更改,而只想存储最重要的几个或单个的更改。

这时我们可以强制 Git 遍历所有更改的文件,通过 git stash 命令加 -p(或--patch) 标志来暂存特定的文件:

git stash -p

接下来我来演示下,我更改了两个文件,但只想暂存一个被更改的文件:

我暂存了 reducer.ts 文件,可以通过 git stash show -p 看下暂存状态:

在通过 git status 查看更改文件的情况:

saga.ts 没有被暂存

看到这你是不是发现 -p 标志好厉害,其实,工作中还有一个地方用到了它,就是 git add 的时候,一般我们 git add 是添加整个文件,如果想提交文件对应更改行的内容怎么办呢?

没错通过 git add -p 来实现,这里按下不表,感兴趣的自己去学习下使用。

从 stash 取出单个文件来使用

一种很不常见的情况下,就是我们 stash 暂存中可能有部分文件是旧的,我们只想应用暂存中的一个或几个特定文件。

这时,可以使用以下命令:

  • git checkout stash <file> 最新暂存的特定文件
  • git checkout stash@{<index>} <file> 指定暂存中的特定文件

让我们看看它的实际效果:

取出最新暂存的特定文件

从 Stash 创建一个分支

可以从 stash 创建一个分支,如果在创建暂存期间修改了相同的文件,并尝试取出暂存应用更改时,会发生冲突,而创建一个分支这将非常有用,其实很鸡肋,我不应用暂存不就行了。

执行此操作的命令如下:

  • git stash branch <name> 从最新的暂存创建一个分支
  • git stash branch <name> stash@{<index>} 从特定的暂存创建一个分支

演示,根据最新的更改创建一个 stash-change 分支:

根据最新的更改创建一个 stash-change 分支

删除暂存

有些暂存实在是用不到了,我们可以通过删除不必要的暂存,来保持项目暂存清单的清晰。

删除特定存储的命令:

  • git stash drop 删除最新的暂存
  • git stash drop stash@{<index>} 删除特定的暂存

一般是通过 git stash list 查看暂存目录,然后通过 git stash dropgit stash drop stash@{<index>} 删除那些不必要的暂存。

演示:

通过 git stash list 查看暂存列表:

查看 stash list

通过 git stash drop stash@{0} 删除一个暂存:

删除一个暂存

最后,通过 git stash list 查看暂存列表,发现只有两个暂存了:

最后,通过 `git stash list` 查看暂存列表,发现只有两个暂存了

如果要从列表中删除所有的暂存,即清空暂存列表可以通过执行下面命令:

git stash clear

演示,清空暂存和无暂存情况下都没有提示,Git 这点不友好,

清空暂存

高级用法自动暂存

当我们使用 rebase 时,必须保证有一个干净的工作目录,否则 Git 会抛出错误:

变基

有几种方法可以解决这个问题:

  • 做一次 commit,多了一次 commit 信息
  • 放弃更改,改动的文件可能有用
  • 手动暂存然后重新应用更改,多敲了两次命令。
  • 最新更改备份到临时分支,多敲了好几个命令。
  • 自动暂存然后应用更改,推荐 👍。

通过对比解决方案,最终我们选择自动方案,即 --autostash 命令实现。

使用此命令,更改将在 rebase 之前自动暂存并在动作完成之后重新应用:

autostash

注意我们最后敲了 git stash list 查看暂存列表,列表为空,你会发现 autostash 的应用更改的策略是 pop,而不是 apply。

命令汇总

命令 作用
git stash 临时暂存工作目录的当前状态
git stash -u 暂存未跟踪的文件更改
git stash -a 暂存被 git 忽略的文件
git stash apply / git stash apply stash@{1} 应用上次/给定暂存的更改
git stash pop / git stash pop stash@{1} 从最后一个/给定的 stash 应用并这个暂存从 stash 列表中删除
git stash list 列出暂存列表
git stash save "message" 使用自定义描述本次暂存更改信息摘要
git stash show / git stash show stash@{1} 查看上次/给定暂存中更改的文件
git stash show -p / git stash show stash@{1} -p 查看最后/给定暂存中更改的代码行
git checkout stash path/to/file / git checkout stash@{1} path/to/file 应用最后一次/给定的暂存中的单个文件
git stash -p 强制 Git 遍历所有更改的文件并询问您是否要存储给定文件
git stash branch / git stash branch stash@{1} 从最后一个/给定的暂存处创建一个分支
git stash drop / git stash drop stash@{1} 删除最后/给定的暂存
git stash clear 清空暂存列表
git rebase -i HEAD~2 --autostash 在 rebase 之前自动暂存更改并在之后通过 pop 策略重新应用它们

总结

文章好长,终于结束了,恭喜,你完成了这个关于 git stash 命令及其使用方法的长篇故事。

此命令的工作方式就像剪贴板工具一样,它可以临时保存工作目录的当前状态,并撤消它,因此您可以随时的从新编写新功能,而且你还可以随时取出暂存中的更改。

当您需要快速切换上下文并处理其他事情而不丢失未完成的工作时,它非常有用。

希望你在日常的工作中常使用 git stash 命令来提高开发效率。

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

推荐阅读更多精彩内容

  • 一、常用git stash命令: 1、git stash 能够将所有未提交的修改(工作区和暂存区)保存至堆栈中,用...
    宇宙小神特别萌阅读 4,549评论 2 3
  • git 基本操作 1.安装与配置 下载安装 git下载地址 根据自己的平台下载,如果是windows,下载的安装包...
    夕子丶阅读 181评论 0 0
  • 我在当前分支开发了,开发一部分,然后需要在其他分支解决问题,怎么办? 在介绍合并的时候,有提到需要保持分支干净,所...
    tingtingtina阅读 962评论 0 2
  • 欢迎关注微信公众号:全栈工厂 本文主要参考https://git-scm.com/docs/git-stash[h...
    liqingbiubiu阅读 5,594评论 0 1
  • git stash 用法 git stash用于将当前工作区的修改暂存起来,就像堆栈一样,可以随时将某一次缓存的修...
    天蓬大元阅读 406评论 0 0