Git Stash——暂存工作区的临时修改

1、什么是 git stash

在日常开发中,经常遇到这种情况:正在一个分支上开发新功能,代码写到一半,突然需要切换到另一个分支去修复紧急 bug。但当前修改还不完整,不想提交,也不想丢弃。

git stash 就是为解决这个场景设计的——它能把当前工作区和暂存区的修改暂时”储藏”起来,让工作目录恢复干净状态,等你处理完其他事情后再恢复回来。

2、基本用法

储藏修改

git stash

或者带一条描述信息,方便之后查找:

git stash push -m "WIP: 正在重构用户模块"

注意:git stash 默认只储藏已跟踪文件的修改。如果要包含未跟踪的文件(新建的文件),需要加 -u 参数:

git stash -u

查看储藏列表

git stash list

输出类似:

stash@{0}: On feature-login: WIP: 正在重构用户模块
stash@{1}: On main: 临时保存配置修改

stash@{0} 是最近一次储藏,stash@{1} 是上一次,以此类推。它是一个栈结构,后进先出。

恢复储藏

恢复并保留储藏记录:

git stash apply

恢复最近一次储藏,但 stash 记录仍然保留在列表中。

恢复并删除储藏记录:

git stash pop

恢复最近一次储藏,同时从列表中删除该记录。这是最常用的方式。

恢复指定的储藏:

git stash apply stash@{1}

删除储藏

# 删除最近一次储藏
git stash drop

# 删除指定储藏
git stash drop stash@{1}

# 清空所有储藏
git stash clear

3、进阶技巧

只储藏部分文件

git stash push -m "只暂存 controller 修改" -- src/controllers/

-- 后面跟文件路径,可以指定只储藏某些文件。

以补丁模式交互式选择

git stash push -p

会逐个显示每个修改块(hunk),让你选择是否储藏。这在只想要暂存部分修改时非常有用。

从储藏创建新分支

git stash branch new-branch-name

这会基于储藏时的 commit 创建一个新分支,检出储藏时的修改,然后删除该 stash。当你储藏后发现这些修改更适合放在独立分支上时非常方便。

查看储藏的内容

# 查看储藏改动了哪些文件
git stash show

# 查看详细 diff
git stash show -p

# 查看指定储藏的 diff
git stash show -p stash@{1}

4、常见场景

场景一:紧急修复 bug

# 当前在 feature 分支,有未提交的修改
git stash

# 切换到 main 分支修复 bug
git checkout main
# ... 修复 bug,提交 ...

# 回到 feature 分支继续工作
git checkout feature
git stash pop

场景二:拉取远程代码前清理工作区

# 先储藏本地修改
git stash

# 拉取远程代码
git pull --rebase

# 恢复本地修改
git stash pop

如果有冲突,git stash pop 会提示你手动解决冲突,stash 记录不会被自动删除。

场景三:在多分支间移动未提交的修改

# 在错误的分支上做了修改
git stash
git checkout correct-branch
git stash pop

5、注意事项

  • git stash 储藏的内容是全局的,不属于任何特定分支。所以在任意分支上执行 git stash pop 都能恢复。
  • 如果 pop 时有冲突,stash 记录不会被自动删除,需要手动 git stash drop 清除。
  • 不要依赖 stash 作为长期存储——它只是临时暂存。如果修改很重要,应该尽早提交或推到远程分支。
  • stash 是基于 commit 的,储藏的内容不会在 git log 中显示。

每天前进一小步,就是一个新的高度!

作者:唐明

出处:/post/git-stash

版权:本站使用"CC BY 4.0"创作共享协议,转载请在文章明显位置注明作者及出处。

关注微信公众号

DevOps持续交付公众号ID:devopscd