git stash:优雅处理未完成的代码改动

在日常 Git 开发流程中,我们经常会遇到这样的场景:正在某个分支上开发新功能,代码还没写完,突然需要切换分支修复紧急 Bug,或者拉取远程最新代码、合并分支------但未完成的代码既不想提交(提交半成品会污染提交历史),也不想删除。这时候,git stash 就是解决这类问题的「救星」。

本文将从核心概念、基础用法、进阶技巧、注意事项到实战场景,全面讲解 git stash 的使用方式,帮你优雅处理临时代码暂存的问题。

一、什么是 Git Stash?

git stash(译为「储藏/暂存」)是 Git 提供的核心命令,用于将工作区和暂存区的未提交修改(已跟踪文件)临时保存到一个独立的「stash 栈」中,同时将工作区恢复到当前提交(HEAD)的干净状态。

简单来说,stash 就像一个「临时代码抽屉」:你可以把没写完的代码暂时放进去,等处理完其他任务后,再从抽屉里把代码取出来继续开发。

核心特性

  • 不影响提交历史,仅操作工作区/暂存区;
  • stash 记录是本地独有的,不会推送到远程仓库;
  • 支持多份 stash 记录管理(栈结构,先进后出);
  • 可灵活恢复、删除、查看 stash 内容。

二、Git Stash 基础用法

先掌握最常用的基础命令,覆盖 80% 的使用场景。

1. 保存当前修改(基础版)

复制代码
git stash

这是最基础的用法,执行后会:

  • 将工作区(已跟踪文件)和暂存区的修改保存到 stash 栈;
  • 工作区恢复为 HEAD 提交的干净状态(未跟踪文件会保留,除非显式指定);
  • Git 会自动为 stash 生成默认备注,格式为 WIP on <分支名>: <提交哈希> <提交信息>

2. 查看 stash 列表

保存多份 stash 后,可通过以下命令查看所有记录:

复制代码
git stash list

输出示例:

csharp 复制代码
stash@{0}: WIP on feature/user: a1b2c3d add user api
stash@{1}: WIP on master: f4e5d6b fix login bug

其中 stash@{n} 是 stash 的唯一标识(n 从 0 开始,0 是最新的 stash)。

3. 恢复 stash 记录

恢复 stash 有两种核心方式,区别在于是否保留 stash 记录:

方式 1:apply(恢复但保留 stash 记录)

perl 复制代码
# 恢复最新的 stash(stash@{0})
git stash apply
​
# 恢复指定的 stash 记录
git stash apply stash@{1}

适合需要多次复用同一份 stash 的场景(比如多分支复用)。

方式 2:pop(恢复并删除 stash 记录)

perl 复制代码
# 恢复最新 stash 并从栈中删除
git stash pop
​
# 恢复指定 stash 并删除
git stash pop stash@{1}

这是最常用的方式(用完即删,避免 stash 栈冗余)。

4. 删除 stash 记录

如果不需要某份 stash 了,可手动删除:

perl 复制代码
# 删除指定 stash
git stash drop stash@{1}
​
# 删除最新的 stash
git stash drop
​
# 清空所有 stash 记录(谨慎使用)
git stash clear

三、Git Stash 进阶技巧

掌握以下技巧,应对更复杂的场景。

1. 给 stash 加备注(推荐)

默认的 stash 备注不够直观,可通过 -m 参数自定义备注,方便后续识别:

perl 复制代码
# 新版 Git(2.13+)推荐用 push(save 已过时)
git stash push -m "feature/user: 完成用户列表接口,未测试"
​
# 旧版 Git 可用 save
git stash save "feature/user: 完成用户列表接口,未测试"

执行 git stash list 后会看到清晰的备注:

bash 复制代码
stash@{0}: On feature/user: feature/user: 完成用户列表接口,未测试

2. 暂存未跟踪/忽略的文件

默认情况下,git stash 只保存已跟踪文件 (被 Git 管理的文件),未跟踪文件(新建但未 git add 的文件)和忽略文件(.gitignore 中的文件)不会被保存。可通过参数扩展范围:

命令 作用
git stash push -u / git stash push --include-untracked 包含未跟踪文件
git stash push -a / git stash push --all 包含未跟踪文件 + 忽略文件

示例:

perl 复制代码
# 保存已跟踪 + 未跟踪文件
git stash push -u -m "包含新建的 utils.js 文件"

3. 只暂存暂存区的修改

如果只想保存「已 git add 到暂存区」的修改,忽略工作区的未暂存修改,可使用 --staged 参数:

perl 复制代码
git stash push --staged -m "仅暂存区:修复订单计算逻辑"

4. 查看 stash 的具体修改内容

想知道某份 stash 改了哪些内容,无需恢复,直接查看:

perl 复制代码
# 查看最新 stash 的文件列表(简略版)
git stash show

# 查看最新 stash 的具体代码改动(详细版,推荐)
git stash show -p

# 查看指定 stash 的详细改动
git stash show -p stash@{1}

输出示例(详细版):

diff 复制代码
diff --git a/src/user.js b/src/user.js
index 1234567..89abcde 100644
--- a/src/user.js
+++ b/src/user.js
@@ -10,6 +10,8 @@ export const getUserList = async () => {
   const res = await axios.get('/api/user');
+  // 新增:过滤禁用用户
+  return res.data.filter(item => !item.disabled);
   return res.data;
 };

5. 从 stash 创建新分支(解决冲突)

如果恢复 stash 时和当前分支的代码冲突(比如 stash 后分支有新提交,修改了同一行代码),直接 apply/pop 会触发冲突。此时可通过 git stash branch 创建新分支,自动应用 stash 并避免冲突:

bash 复制代码
# 基于最新 stash 创建新分支 feature/user-fix
git stash branch feature/user-fix

# 基于指定 stash 创建分支
git stash branch feature/user-fix stash@{1}

执行后会:

  1. 创建并切换到新分支;
  2. 将指定 stash 应用到新分支;
  3. 若应用成功,自动删除该 stash 记录。

四、注意事项

  1. stash 不跨仓库:stash 是本地仓库的临时存储,切换到其他本地仓库无法访问;
  2. 冲突处理 :恢复 stash 时若出现冲突,需手动解决(和合并冲突操作一致),解决后执行 git add <冲突文件>,再通过 git stash drop 删除对应的 stash 记录;
  3. 避免滥用 :不要长期保留无用的 stash,定期用 git stash list 清理,防止栈混乱;
  4. 跨分支恢复需谨慎:stash 是全局的(不绑定分支),但跨分支恢复可能因代码结构差异导致冲突,建议尽量在原分支恢复;
  5. 未跟踪文件的坑 :默认 git stash 不保存未跟踪文件,若切换分支后删除了这些文件,恢复分支后文件会丢失------务必用 -u 参数保存未跟踪文件。

五、实战场景示例

场景 1:紧急修复 Bug

需求:正在 feature/pay 分支开发支付功能(代码未完成),需要切换到 master 分支修复紧急 Bug。

步骤:

perl 复制代码
# 1. 查看当前修改(可选)
git status

# 2. 暂存当前修改,添加备注
git stash push -m "feature/pay: 开发微信支付回调,未完成"

# 3. 切换到 master 分支
git checkout master

# 4. 拉取远程最新代码(可选)
git pull origin master

# 5. 修复 Bug,提交代码
git add <修复文件>
git commit -m "fix: 修复支付回调参数错误问题"
git push origin master

# 6. 切回 feature/pay 分支,恢复暂存的代码
git checkout feature/pay
git stash pop

# 7. 继续开发支付功能...

场景 2:解决 stash 冲突

问题:stash 后,分支有新提交,恢复 stash 时出现冲突。

步骤:

perl 复制代码
# 1. 尝试恢复 stash,触发冲突
git stash pop

# 2. 查看冲突文件
git status

# 3. 打开冲突文件,手动解决冲突(标记为 <<<<<<< HEAD、=======、>>>>>>> stash@{0})
# 4. 解决后,标记为已解决
git add <冲突文件>

# 5. 删除已恢复的 stash 记录(冲突时 pop 不会自动删除)
git stash drop stash@{0}

# 6. 继续开发...

六、总结

git stash 是处理临时代码暂存的高效工具,核心价值在于「不提交半成品,也不丢失修改」。掌握以下核心用法,足以应对绝大多数场景:

  • 保存:git stash push -m "备注"(推荐加 -u 保存未跟踪文件);
  • 查看:git stash list / git stash show -p
  • 恢复:git stash pop(用完即删)/ git stash apply(保留记录);
  • 删除:git stash drop / git stash clear

合理使用 git stash 能让你的 Git 操作更规范,避免提交历史混乱,同时提升开发效率。记住:stash 是本地的,重要的临时修改建议及时整理,不要长期堆积!

相关推荐
曲莫终8 小时前
Git删除过去分支(如删除23年及之前的分支)
git
一过菜只因8 小时前
Git入门学习
git·学习
小鸡脚来咯9 小时前
java web后端开发流程
java·开发语言·git
sylvia_08151 天前
git add 后pull 放弃本地所有修改
git
五阿哥永琪1 天前
Git 开发常用命令速查手册
大数据·git·elasticsearch
柒壹漆1 天前
用Python制作一个USB Hid设备数据收发测试工具
开发语言·git·python
爱吃番茄鼠骗1 天前
git命令使用教程
git
黑牛先生1 天前
【Git】解决远程仓库备注错误问题
git
rockmelodies1 天前
Git冲突解决实用指南
git·git冲突