文章目录
在日常使用 Git 进行版本控制时,我们经常会遇到这样一种情况:当前工作还没完成,但又临时需要切换分支去处理紧急事务。这个时候,
git stash
就派上用场了。它允许你将当前工作区的修改“存起来”,让你可以无忧地切换分支,处理完后再把工作“取回来”继续进行。本文将详细介绍git stash
的工作机制、常见用法和注意事项,帮助你在开发过程中更高效地管理修改内容。
一、什么是 git stash?
1. 命令简介
git stash
是 Git 提供的一个非常实用的功能,它的作用是:临时保存当前工作目录和暂存区的修改(不包括未追踪文件和忽略文件),以便你可以在干净的工作区中切换分支、合并代码或进行其他操作。
简单来说,stash 就像一个临时储物柜,你可以把当前的修改“塞进去”,等处理完其他事务后再“拿出来”。
2. 场景举例
假设你在 feature/login
分支中写了一半登录页面的功能,这时产品经理突然说主分支有 bug 需要你立刻修复。你不能直接切换分支,因为当前代码没提交、也不能提交(不完整)。这时你就可以:
git stash
git checkout main
# 修复 bug
git commit -am "Fix bug"
git checkout feature/login
git 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 apply
或 stash 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 "登录功能开发中"
# 切换分支修复 bug
git checkout main
# 修复提交
# 回到原来分支
git checkout feature/login
git stash pop
2. stash 多个内容并选择恢复
git stash -m "功能A"
git stash -m "功能B"
# 查看所有 stash
git stash list
# 恢复指定内容
git stash apply stash@{1}
3. stash 和补丁配合使用
# 创建 stash
git stash
# 导出为 patch 文件
git stash show -p > stash.patch
# 可手动应用 patch
git apply stash.patch
七、注意事项与坑点
1. stash 不是“安全备份”
stash 是临时的,容易被 drop
或 clear
删除。不要把 stash 当成正式备份工具。如果内容重要,建议新建一个临时分支提交:
git checkout -b temp-save
git add .
git commit -m "临时保存"
2. stash 后不可轻易修改代码结构
stash 还原依赖于你当前的代码状态,如果你在 stash 后删除或重构了部分文件,可能会导致 pop/apply 失败。
建议 stash 后尽快恢复,或者确认当前代码结构未变动。
3. pop 会自动 drop,apply 不会
git stash pop
会还原后立刻删除 stash 记录,如果还原失败或冲突,记录也可能丢失。如果不确定能否还原成功,建议使用 git stash apply
。
推荐: