从 01 开始 从 01 开始
首页
  • 📚 计算机基础

    • 计算机简史
    • 数字电路
    • 计算机组成原理
    • 操作系统
    • Linux
    • 计算机网络
    • 数据库
    • 编程工具
    • 装机
  • 🎨 前端

    • Node
  • JavaSE
  • Java 高级
  • JavaEE

    • 构建、依赖管理
    • Ant
    • Maven
    • 日志框架
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • 环境管理和配置管理-科普篇
    • Servlet
  • Spring

    • Spring基础
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC

    • SpringMVC 基础
  • SpringBoot

    • SpringBoot 基础
  • Windows 使用技巧
  • 手机相关技巧
  • 最全面的输入法教程
  • 最全面的浏览器教程
  • Office
  • 图片类工具
  • 效率类工具
  • 最全面的 RSS 教程
  • 码字工具
  • 各大平台
  • 校招
  • 五险一金
  • 职场规划
  • 关于离职
  • 杂谈
  • 自媒体
  • 📖 读书

    • 读书工具
    • 走进科学
  • 🌍 英语

    • 从零开始学英语
    • 英语兔的相关视频
    • Larry 想做技术大佬的相关视频
  • 🏛️ 政治

    • 新闻合订本
    • 反腐
    • GFW
    • 404 内容
    • 审查与自我审查
    • 互联网
    • 战争
    • 读书笔记
  • 💰 经济

    • 关于税
    • 理财
  • 💪 健身

    • 睡眠
    • 皮肤
    • 口腔健康
    • 学会呼吸
    • 健身日志
  • 🏠 其他

    • 驾驶技能
    • 租房与买房
    • 厨艺
  • 电影

    • 电影推荐
  • 电视剧
  • 漫画

    • 漫画软件
    • 漫画推荐
  • 游戏

    • Steam
    • 三国杀
    • 求生之路
  • 小说
  • 关于本站
  • 关于博主
  • 打赏
  • 网站动态
  • 友人帐
  • 从零开始搭建博客
  • 搭建邮件服务器
  • 本站分享
  • 🌈 生活

    • 2022
    • 2023
    • 2024
    • 2025
  • 📇 文章索引

    • 文章分类
    • 文章归档

晓林

程序猿,自由职业者,博主,英语爱好者,健身达人
首页
  • 📚 计算机基础

    • 计算机简史
    • 数字电路
    • 计算机组成原理
    • 操作系统
    • Linux
    • 计算机网络
    • 数据库
    • 编程工具
    • 装机
  • 🎨 前端

    • Node
  • JavaSE
  • Java 高级
  • JavaEE

    • 构建、依赖管理
    • Ant
    • Maven
    • 日志框架
    • Junit
    • JDBC
    • XML-JSON
  • JavaWeb

    • 服务器软件
    • 环境管理和配置管理-科普篇
    • Servlet
  • Spring

    • Spring基础
  • 主流框架

    • Redis
    • Mybatis
    • Lucene
    • Elasticsearch
    • RabbitMQ
    • MyCat
    • Lombok
  • SpringMVC

    • SpringMVC 基础
  • SpringBoot

    • SpringBoot 基础
  • Windows 使用技巧
  • 手机相关技巧
  • 最全面的输入法教程
  • 最全面的浏览器教程
  • Office
  • 图片类工具
  • 效率类工具
  • 最全面的 RSS 教程
  • 码字工具
  • 各大平台
  • 校招
  • 五险一金
  • 职场规划
  • 关于离职
  • 杂谈
  • 自媒体
  • 📖 读书

    • 读书工具
    • 走进科学
  • 🌍 英语

    • 从零开始学英语
    • 英语兔的相关视频
    • Larry 想做技术大佬的相关视频
  • 🏛️ 政治

    • 新闻合订本
    • 反腐
    • GFW
    • 404 内容
    • 审查与自我审查
    • 互联网
    • 战争
    • 读书笔记
  • 💰 经济

    • 关于税
    • 理财
  • 💪 健身

    • 睡眠
    • 皮肤
    • 口腔健康
    • 学会呼吸
    • 健身日志
  • 🏠 其他

    • 驾驶技能
    • 租房与买房
    • 厨艺
  • 电影

    • 电影推荐
  • 电视剧
  • 漫画

    • 漫画软件
    • 漫画推荐
  • 游戏

    • Steam
    • 三国杀
    • 求生之路
  • 小说
  • 关于本站
  • 关于博主
  • 打赏
  • 网站动态
  • 友人帐
  • 从零开始搭建博客
  • 搭建邮件服务器
  • 本站分享
  • 🌈 生活

    • 2022
    • 2023
    • 2024
    • 2025
  • 📇 文章索引

    • 文章分类
    • 文章归档
  • 计算机简史

  • 数字电路

  • 计算机组成原理

  • 操作系统

  • Linux

  • 计算机网络

  • 数据库

  • 编程工具

    • Git

      • 版本控制
      • 安装和配置 Git
      • 初识版本库
      • 版本管理
      • 工作区、暂存区和修改
      • 远程仓库
      • 解决 GitHub 访问失败的办法
      • 关于 GitHub 的奇技淫巧
      • 分支管理
      • GitStash
        • 在 git stash 出现之前
        • Git stash 演示
        • 更多 stash 用法
        • 复制一个提交
      • 远程仓库和分支
      • 标签管理
      • 自定义 Git
      • 使用可视化工具
      • Github Action
      • 常用 Git 命令
      • Git 帮助文档
      • GitHub 个人主页美化教程
      • 其他 GitHub 技巧
      • 在 commit 里使用 emoji~
      • 逆天,CSDN 批量搬运 GitHub 项目
    • 终端

  • 装机

  • 计算机基础
  • 编程工具
  • Git
2023-01-17
目录

GitStash

# 80.Git-stash

stash 可以冻结目前的状态

‍

# 在 git stash 出现之前

当我们在开发一个新功能的时候,突然来了一个紧急的 bug 要修复,此时我们可以创建一个分支去修复它;但如果,切换会导致冲突的话,就会切换失败。

我们来模拟下(先确保工作区是干净的):

$ git branch bug02

$ echo "test" >> 3-branch/branch.txt

$ cat 3-branch/branch.txt
Creating a new branch is quick and simple
test no fast forward
test


$ git add .

$ git commit -m "add test to branch.txt"
1
2
3
4
5
6
7
8
9
10
11
12
13

‍ 接下来,我们切换并修改 branch.txt 的最后一行,使得其和 master 分支不一样:

$ git switch bug02
Switched to branch 'bug02'

$ vim 3-branch/branch.txt

$ cat 3-branch/branch.txt
Creating a new branch is quick and simple
test no fast forward
fuk
1
2
3
4
5
6
7
8
9

‍ 接下来我们切换,果然,报错了:

$ git switch master
error: Your local changes to the following files would be overwritten by checkout:
        3-branch/branch.txt
Please commit your changes or stash them before you switch branches.
Aborting
1
2
3
4
5

‍ Git 告诉我们可以提交后再切换;但是我们目前仅仅开发到一半,不想提交,怎么办? ‍

# Git stash 演示

Git 提供了 stash 功能,可以把当前工作现场“储藏”起来,等以后恢复现场后继续工作:

$ git stash
Saved working directory and index state WIP on bug02: a2f5dc9 rm temp.txt
1
2

现在,用 git status​​查看工作区,就是干净的(除非有没有被 Git 管理的文件),因此可以放心地切换分支。

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

$ cat 3-branch/branch.txt
Creating a new branch is quick and simple
test no fast forward
1
2
3
4
5
6
7

等后续修复完 bug 后,如何恢复现场呢?首先,我们的工作现场是存储在一个栈里的,我们可以查看当前有哪些工作现场:

$ git stash list
stash@{0}: WIP on bug02: a2f5dc9 rm temp.txt
1
2

‍ 有两种恢复方式:

  1. 用 git stash apply ​恢复,但是恢复后,stash 内容并不删除,你需要用 git stash drop ​来删除;类似读取栈的内容,但不弹出
  2. 用 git stash pop​,恢复的同时把 stash 内容也删了。 ‍ 我们使用第二种方式,可以看到 Git 会将当前仓库状态显示出来:
$ git stash pop
On branch bug02
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
        modified:   3-branch/branch.txt

no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (a81ac38b932b00c0f934f613f823c33c7e37b10d)
1
2
3
4
5
6
7
8
9

‍ 并且文件内容也恢复了:

$ cat 3-branch/branch.txt
Creating a new branch is quick and simple
test no fast forward
fuk
1
2
3
4

你可以多次 stash,恢复的时候,先用 git stash list ​查看,然后恢复指定的 stash,用命令:

$ git stash apply stash@{0}
1

再用 git stash list ​查看,就看不到任何 stash 内容了:

$ git stash list
1

‍

# 更多 stash 用法

‍ 我们在存储现场的时候,还可以加一些注释,方便我们回忆:git stash save "test"​

$ git stash save "temp"
Saved working directory and index state On bug02: temp

peterjxl@peter MINGW64 /d/Projects/LearnGit (bug02)
$ git stash list
stash@{0}: On bug02: temp
1
2
3
4
5
6

‍ 更多 stash 的用法,就不一一演示了:

​git stash clear​:清除堆栈中的所有内容

​git stash show​:查看堆栈中最新保存的 stash 和当前目录的差异。

​git stash show stash@{1}​:查看指定的 stash 和当前目录差异。

​git stash branch​:从最新的 stash 创建分支。

# 复制一个提交

现在我们假设这样一个场景:

  1. 我们从 master 分支上,创建了 feature 分支开发一个新功能
  2. 此时突然来了个比较紧急的 bug,是 master 分支上的
  3. 我们从 master 分支上创建一个分支 bug,并修复了该 bug
  4. 继续回到 feature 分支开发 ‍ 目前有这样一个问题,我们的 feature 分支也是从 master 分支上拉出来的,所以那个 bug 在当前分支也是存在的!那要怎么修复?一个方法是将 bug 再一次在 feature 分支上修复一次,但这样又花了不少时间做重复的事情。

git 专门提供了一个 cherry-pick ​命令,让我们能复制一个特定的提交到当前分支。我们来演示下: ‍ 先删除其他分支,并确保当前工作区是干净的

$ git branch
* master
1
2

‍ 创建 feature 分支和 bug 分支:

$ git branch feature

$ git branch bug

$ git branch
  bug
  feature
* master
1
2
3
4
5
6
7
8

‍ 切换到 bug 分支上,并修改 branch.txt,添加一个词组 cherry-pick:

$ git switch bug

$ vim 3-branch/branch.txt

$ cat 3-branch/branch.txt
Creating a new branch is quick and simple
test no fast forward
test cherry-pick


$ git add 3-branch/branch.txt
$ git commit -m "fix bug"
[bug 1794212] fix bug
 1 file changed, 1 insertion(+), 1 deletion(-)
1
2
3
4
5
6
7
8
9
10
11
12
13
14

这里记录下 commit id 是 1794212,后续会用到。

然后切换到 master 分支,合并 bug 分支:

$ git switch master
$ git merge --no-ff -m &quot;merged bug fix&quot; bug
Merge made by the 'recursive' strategy.
 3-branch/branch.txt | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
1
2
3
4
5

然后切换到 feature 分支,并复制提交:

$ git cherry-pick 1794212
[feature 88085eb] fix bug
 Date: Sat Jan 14 20:06:01 2023 +0800
 1 file changed, 1 insertion(+), 1 deletion(-)

$ cat 3-branch/branch.txt
Creating a new branch is quick and simple
test no fast forward
test cherry-pick
1
2
3
4
5
6
7
8
9

Git 自动给 feature 分支做了一次提交,注意这次提交的 commit 是 88085eb​,它并不同于 master 的 1794212​,因为这两个 commit 只是改动相同,但确实是两个不同的 commit:

$ git log --oneline
88085eb (HEAD -> feature) fix bug
982423c add test to branch.txt
a2f5dc9 rm temp.txt
b194598 add temp.txt
1
2
3
4
5

用 git cherry-pick​​,我们就不需要在 feature 分支上手动再把修 bug 的过程重复一遍。

上次更新: 2025/5/5 17:15:09
分支管理
远程仓库和分支

← 分支管理 远程仓库和分支→

最近更新
01
新闻合订本 2025-10
10-31
02
2025 年 10 月记
10-30
03
用 AI 批量优化思源笔记排版
10-15
更多文章>
Theme by Vdoing | Copyright © 2022-2025 | 粤 ICP 备 2022067627 号 -1 | 粤公网安备 44011302003646 号 | 点击查看十年之约
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式