> 技术文档 > 【Git】git stash 命令详解:如何高效管理你的工作区修改

【Git】git stash 命令详解:如何高效管理你的工作区修改


文章目录

    • 一、什么是 git stash?
      • 1. 命令简介
      • 2. 场景举例
    • 二、git stash 的基本用法
      • 1. 保存修改
      • 2. 查看 stash 列表
      • 3. 恢复 stash 内容
      • 4. 删除 stash
    • 三、git stash 的高级用法
      • 1. 只 stash 暂存区或工作
      • 2. stash 未追踪文件
      • 3. 应用并合并冲突
    • 四、stash 与分支的结合使用
    • 五、git stash 的工作机制浅析
      • 1. 本质是什么?
      • 2. stash 对象存在哪?
    • 六、实际开发中的常见用法示例
      • 1. 开发中断处理紧急任务
      • 2. stash 多个内容并选择恢复
      • 3. stash 和补丁配合使用
    • 七、注意事项与坑点
      • 1. stash 不是“安全备份”
      • 2. stash 后不可轻易修改代码结构
      • 3. pop 会自动 drop,apply 不会

在日常使用 Git 进行版本控制时,我们经常会遇到这样一种情况:当前工作还没完成,但又临时需要切换分支去处理紧急事务。这个时候,git stash 就派上用场了。它允许你将当前工作区的修改“存起来”,让你可以无忧地切换分支,处理完后再把工作“取回来”继续进行。本文将详细介绍 git stash 的工作机制、常见用法和注意事项,帮助你在开发过程中更高效地管理修改内容。

一、什么是 git stash?

1. 命令简介

git stash 是 Git 提供的一个非常实用的功能,它的作用是:临时保存当前工作目录和暂存区的修改(不包括未追踪文件和忽略文件),以便你可以在干净的工作区中切换分支、合并代码或进行其他操作

简单来说,stash 就像一个临时储物柜,你可以把当前的修改“塞进去”,等处理完其他事务后再“拿出来”。

2. 场景举例

假设你在 feature/login 分支中写了一半登录页面的功能,这时产品经理突然说主分支有 bug 需要你立刻修复。你不能直接切换分支,因为当前代码没提交、也不能提交(不完整)。这时你就可以:

git stashgit checkout main# 修复 buggit commit -am \"Fix bug\"git checkout feature/logingit stash pop

完美解决!

二、git stash 的基本用法

1. 保存修改

最基本的命令就是:

git stash

它会把工作区和暂存区的修改保存起来,恢复成干净的状态。

等价于:

git stash push

你也可以加上说明标签:

git stash save \"正在开发登录功能\"# 或者git stash push -m \"正在开发登录功能\"

2. 查看 stash 列表

每次 stash 的内容会被 Git 存储为一个临时提交对象,并按顺序编号,你可以用如下命令查看:

git stash list

输出类似:

stash@{0}: On feature/login: 正在开发登录功能stash@{1}: On main: 优化了分页功能

3. 恢复 stash 内容

恢复最新一次 stash:

git stash pop

这个命令会把修改还原回来,并删除这条 stash 记录。

如果你想恢复但保留 stash 记录,可以使用:

git stash apply

也可以指定某条记录恢复:

git stash apply stash@{1}

4. 删除 stash

清除最新的 stash 记录:

git stash drop

清除指定的 stash:

git stash drop stash@{1}

清除所有 stash:

git stash clear

⚠️ 注意:git stash clear 不可恢复,请谨慎使用。

三、git stash 的高级用法

1. 只 stash 暂存区或工作区

默认 git stash 会保存工作区和暂存区的内容,如果你只想 stash 工作区的修改,可以加参数:

# 只保存未暂存的修改(工作区)git stash --keep-index# 只保存已暂存的内容(暂存区)git stash --patch

2. stash 未追踪文件

默认情况下,git stash 不会保存未被 git add 的新文件。如果你希望 stash 未追踪文件,可以加 -u(untracked files):

git stash -u

如果你也希望连 .gitignore 忽略的文件一并保存,可以使用 -a

git stash -a

这对于大型临时测试数据特别有用。

3. 应用并合并冲突

当你 stash applystash pop 的内容与当前代码存在冲突时,Git 会自动提示并以冲突状态还原内容。

处理流程就和常规的 merge 冲突一样:

# 解决冲突git status# 修改文件git add .git commit -m \"合并stash修改\"

四、stash 与分支的结合使用

stash 并不和某个分支绑定,它是一个“全局”的临时区。你可以在 feature/login 分支里执行 git stash,然后切到 main 分支,甚至新建一个 hotfix/bug-123 分支后在其中执行 git stash pop

这种“跨分支”取用 stash 的能力,使它成为在多人协作、快速迭代场景中的利器。

五、git stash 的工作机制浅析

1. 本质是什么?

每次 git stash 实际上会创建两个 commit 对象:

  • 一个是当前暂存区的快照(Index)
  • 一个是工作区的快照(Working Directory)

这两个对象存储在 Git 的引用 refs/stash 下。可以通过 git log refs/stash 查看详情。

所以 stash 并不是简单的拷贝文件,而是完整保存了你当前的工作状态。

2. stash 对象存在哪?

Git 会在 .git/logs/refs/stash 里维护 stash 的日志。

你也可以通过如下命令恢复某个 stash 的 patch 形式:

git stash show -p stash@{0}

这对于查看某次 stash 的内容变更非常有帮助。

六、实际开发中的常见用法示例

1. 开发中断处理紧急任务

# 开发中途git stash -m \"登录功能开发中\"# 切换分支修复 buggit checkout main# 修复提交# 回到原来分支git checkout feature/logingit stash pop

2. stash 多个内容并选择恢复

git stash -m \"功能A\"git stash -m \"功能B\"# 查看所有 stashgit stash list# 恢复指定内容git stash apply stash@{1}

3. stash 和补丁配合使用

# 创建 stashgit stash# 导出为 patch 文件git stash show -p > stash.patch# 可手动应用 patchgit apply stash.patch

七、注意事项与坑点

1. stash 不是“安全备份”

stash 是临时的,容易被 dropclear 删除。不要把 stash 当成正式备份工具。如果内容重要,建议新建一个临时分支提交:

git checkout -b temp-savegit add .git commit -m \"临时保存\"

2. stash 后不可轻易修改代码结构

stash 还原依赖于你当前的代码状态,如果你在 stash 后删除或重构了部分文件,可能会导致 pop/apply 失败。

建议 stash 后尽快恢复,或者确认当前代码结构未变动。

3. pop 会自动 drop,apply 不会

git stash pop 会还原后立刻删除 stash 记录,如果还原失败或冲突,记录也可能丢失。如果不确定能否还原成功,建议使用 git stash apply

推荐:

  • JavaScript
  • react
  • vue

在这里插入图片描述