适用工具:IntelliJ IDEA / Android Studio(JetBrains 系 IDE)


1. 为什么需要「暂存」本地改动?

日常开发中,工作区里常有尚未写完、暂不想提交的代码。典型场景包括:

  • 功能开发到一半,突然被拉去修紧急 Bug,需要切换分支
  • 本地改动与远程即将拉取的代码可能冲突,需要先清空工作区再 Update Project
  • 想尝试一种写法,但不确定是否保留,需要临时收起当前修改

此时不必强行 commit,也无需丢弃代码。IDEA 提供了两种「先搁一边」的方式:

功能 本质 存储位置
Shelve Changes IDEA 内置能力 项目 .idea/shelf/(与 Git 无关)
Stash Changes Git 原生命令的可视化封装 .git/refs/stash(标准 Git 仓库)

两者都能把工作区改动暂时移走,但机制、恢复方式和副作用不同。选对工具,能少踩很多坑。


2. 入口在哪里?

两种操作的菜单入口相同,都在 Git → Uncommitted Changes(或左侧 Git 工具窗口)中:

  • Shelve Changes… — 搁置到 Shelf
  • Stash Changes… — 贮藏到 Git Stash

在这里插入图片描述

也可以左侧 Git 工具窗口,对选中文件右键,或直接点击上方的按钮。

在这里插入图片描述


3. Shelve Changes 详解

3.1 什么是 Shelve?

Shelve(搁置)是 JetBrains IDE 独有的功能,字面意思是「把东西搁到架子上」。它把选中的变更保存到本地 .idea/shelf/ 目录,不经过 Git 提交历史,也不影响 git status

适合:

  • 只在 IDEA 内开发,不需要跨工具共享暂存内容
  • 需要按文件或代码块精细搁置(比 Stash 更灵活)
  • 希望搁置记录带 Changelist 名称,方便回来继续

3.2 搁置操作步骤

  1. 在 Local Changes 中选中要搁置的文件(可多选)
  2. 右键 → Shelve Changes…
  3. 填写 Commit Message(作为搁置说明,方便日后识别)
  4. 点击 Shelve Changes

搁置成功后,这些文件会从当前工作区消失,git status 显示为干净状态。

搁置的内容出现在「Shelf」Tab 中:

3.3 查看与恢复(Unshelve)

搁置记录出现在 Commit 工具窗口的 Shelf 页签(或 Version Control → Shelf)。

恢复方式:在搁置记录上右键 → Unshelve…

常用选项说明:

选项 含义
Set active 恢复后自动激活对应 Changelist
Track context 跟踪上下文,便于 IDE 记住关联任务
Remove successfully applied files from the shelf 恢复成功后从 Shelf 删除已合并的文件

在这里插入图片描述

恢复后,IDEA 通常会新建一个 Changelist,名称即你搁置时填写的 Commit Message:

3.4 Shelve 的特点(易踩坑)

  • 搁置记录不会自动消失;即使勾选了 Remove,Changelist 条目有时仍会留在 Commit 面板,需手动删除空 Changelist
  • 搁置内容存在 .idea/shelf/不会随 git push 同步到远程
  • 团队成员用其他编辑器打开项目时,看不到你的 Shelf 内容

4. Stash Changes 详解

4.1 什么是 Stash?

Stash 是 Git 的内置能力,IDEA 的 Stash Changes 本质上执行的是:

git stash push -m "你的说明"

适合:

  • 需要在 命令行、SourceTree、GitKraken 等其他 Git 工具中访问暂存
  • 团队协作、CI 流程依赖标准 Git 行为
  • 切换分支前快速「一键清空」工作区

4.2 贮藏操作步骤

  1. 在 Local Changes 中选中文件(不选则默认贮藏全部 tracked 变更)
  2. 右键 → Stash Changes…
  3. 填写说明,点击确认

对话框中常见选项:

选项 建议
Keep index 一般不勾选。勾选后 staged 与 unstaged 分开贮藏,容易产生多余 stash 记录,日志也更乱
Include untracked files 若有新建未跟踪文件也要暂存,需勾选

贮藏后,工作区变干净:

点击右侧的「Stash」Tab 可以看到暂存的内容:

4.3 恢复(Unstash)

Git → Stashes 列表中,对目标 stash 右键:

操作 等价命令 说明
Apply Stash git stash apply 恢复改动,保留 stash 记录
Pop Stash git stash pop 恢复改动,删除该条 stash
Unstash Changes… 带选项的 apply/pop 可勾选是否删除 stash

恢复成功时,IDEA 右下角通常有提示;文件回到 Default Changelist不会 额外创建命名 Changelist。


5. 实战场景一:代码暂不想 Commit

假设你在 feature-A 分支新增了一个文件 DemoService.java,功能未写完,此时需要切到 hotfix 分支修 Bug。

5.1 用 Stash Changes

1. 右键 DemoService.java → Stash Changes(不勾选 Keep index)
2. 工作区干净 → 切换 hotfix 分支 → 修 Bug → 切回 feature-A
3. Git → Stashes → Pop Stash(或 Apply Stash)
4. DemoService.java 回到工作区

5.2 用 Shelve Changes

1. 右键 → Shelve Changes,填写说明如 "WIP: DemoService 半成品"
2. 切换分支、修 Bug、切回
3. Shelf 页签 → Unshelve Changes,勾选 Set active + Track context
4. 变更进入名为 "WIP: DemoService 半成品" 的 Changelist

此场景小结:若只在 IDEA 内切换任务,Shelve 的 Changelist 分类更清晰;若可能用终端 git stash,选 Stash。


6. 实战场景二:Pull / Update 前防止冲突

本地已 commit 若干次,发现有问题需要 git reset,或远程有更新需要 Update Project。若工作区还有未提交改动,直接更新容易冲突。

推荐流程:先暂存 → 更新/回退 → 再恢复 → 手动解决冲突 → Commit

6.1 用 Shelve Changes

1. 搁置所有本地未提交改动
2. Update Project(或 Reset)
3. Unshelve,勾选 Remove successfully applied files from the shelf
4. 解决冲突后 Commit

注意:即使 Shelf 记录被 Remove,Commit 面板里可能仍残留空 Changelist,需手动清理。

6.2 用 Stash Changes

1. Stash Changes 贮藏全部改动
2. Update Project
3. Pop Stash(或 Apply Stash)
4. 解决冲突 → Commit 到 Default Changelist

此场景小结:Stash 恢复后文件集中在 Default Changelist,结构更简单;Shelve 可能留下多余 Changelist 需维护。


7. 核心对比

维度 Shelve Changes Stash Changes
来源 IDEA 内置 Git 标准命令
存储 .idea/shelf/ .git/refs/stash
跨工具 ❌ 仅 JetBrains IDE ✅ 任意 Git 客户端
恢复后组织 新建命名 Changelist 归入 Default Changelist
删除暂存 Unshelve 时可选 Remove Pop 删除 / Apply 保留
残留问题 可能残留空 Changelist 一般无多余列表
精细度 支持按文件/块搁置 默认整批贮藏(CLI 可 -p
是否进 Git 历史 否(stash 不入 commit 历史)

怎么选?

只在 IDEA 内并行多个任务、喜欢 Changelist 分类  →  Shelve
需要命令行/其他 Git 工具协作、追求简单无残留     →  Stash
不确定时                                       →  Stash(更通用)

8. 命令行等价操作(Stash)

若习惯终端,Stash 对应关系如下:

# 贮藏(等同 Stash Changes)
git stash push -m "说明文字"

# 查看贮藏列表
git stash list

# 恢复并保留 stash
git stash apply stash@{0}

# 恢复并删除 stash
git stash pop stash@{0}

# 删除指定 stash
git stash drop stash@{0}

Shelve 没有 Git 命令行等价物,只能通过 IDEA 界面操作。


10. 常见问题

Q:Stash 后 git stash pop 冲突,stash 还在吗?
A:Pop 发生冲突时,stash 通常仍保留在列表中,解决冲突后手动 git stash drop 即可。

Q:误 Pop 了 stash 能找回吗?
A:可用 git fsck --unreachable | grep commit 配合 git show 尝试找回,但操作繁琐。建议重要改动先 Apply 而非直接 Pop

Q:Shelve 和 Changelist 有什么区别?
A:Changelist 是 IDE 对当前工作区变更的分组,文件仍在工作区;Shelve 是把变更移出工作区存到 Shelf。Changelist 适合并行开发多任务;Shelve 适合临时清空工作区。

Q:Android Studio 能用吗?
A:可以。Android Studio 与 IDEA 同属 JetBrains,Shelve / Stash 行为一致。


11. 小结

  • Shelve Changes:IDEA 专属,带 Changelist 管理,适合 IDE 内多任务切换,但可能留下空 Changelist 需手动清理。
  • Stash Changes:标准 Git 能力,跨工具通用,恢复后归入 Default Changelist,结构更干净。

两者都是「不提交也能先收起来」的利器。根据你是否需要跨工具协作、是否依赖 Changelist 分类,选择合适的方式即可。

整理完毕,完结撒花~🌻





参考地址:

1.idea中好用的git shelve changes和stash changes,https://blog.csdn.net/eclipse1024/article/details/116352777

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐