git stash save 和 git stash push有什么区别?

直接说结论:git stash savegit stash push 功能几乎一样,但 save 已被官方标记为"废弃(deprecated)",现在一律推荐用 push

两者的核心区别在于 参数解析方式push 更安全、更严格。


一、用法对比(重点看区别)

1、基本用法(两者完全等价)

复制代码
# 旧写法
git stash save "修复登录bug"

# 新写法(推荐)
git stash push -m "修复登录bug"

如果只是存全部改动,这俩没区别,但 push-m 更符合 Git 其他命令的习惯(如 commit -m)。

2、指定文件路径(这是最大的坑!)

这是你刚才问的"只 stash 个别文件"的场景,必须用 push

复制代码
# ✅ 正确写法(推荐)
git stash push -m "暂存配置" -- config.yml

# ❌ 危险写法(不推荐,容易出错)
git stash save "暂存配置" config.yml

为什么?

  • git stash push 强制使用 -- 分隔符,明确区分"消息"和"文件路径",永远不会混淆。

  • git stash save 没有-- 分隔符。Git 会尝试把后面的参数解析为消息,如果文件名看起来像参数(比如以 - 开头),或者解析逻辑有歧义,就会报错或产生非预期行为。

3、交互式 Stash(部分代码)

复制代码
# 两者都支持 -p
git stash save -p
git stash push -p

功能一样,但 push 是未来的标准。


二、为什么 Git 官方要废弃 save

在 Git 2.16 版本之后,官方引入了 git stash push 来取代 save,主要原因是 API 一致性 ​ 和 安全性

  1. 参数歧义save 命令会把第一个非选项参数之后的所有内容都当成 stash 消息,除非你非常小心,否则很容易把文件名误当成消息,或者把消息误当成文件。

  2. 命令统一性 :Git 的大多数命令(如 git commit -m, git tag -m)都使用 -m 来指定消息。push 沿用了这一风格,降低了学习成本。

  3. 路径规范(Pathspec)push 强制要求 -- 来分隔消息和路径,这是 Git 处理文件路径的标准方式,避免了各种边缘情况的 Bug。


三、速查对照表

需求 git stash save (旧/不推荐) git stash push (新/推荐)
存全部改动 git stash save "msg" git stash push -m "msg"
存指定文件 git stash save "msg" -- file (容易混淆) git stash push -m "msg" -- file (清晰安全)
存部分代码块 git stash save -p git stash push -p
包含未跟踪文件 git stash save -u git stash push -u
存已暂存内容 git stash save --staged git stash push --staged

四、结论与建议

  1. 新操作一律用 git stash push :特别是当你需要指定文件路径时,push-- 分隔符能避免 99% 的意外错误。

  2. 旧脚本如果用了 save 也不用急着改 :目前 Git 仍然兼容 save,只是会在命令行里提示你这是废弃用法(deprecated)。但在编写新脚本或文档时,请务必使用 push

  3. 记忆口诀 :把 stash 当成 commit 来记------commit-m 写消息,stash 现在也用 -mcommit 后面加文件名要用 --stash push 后面加文件名也要用 --

一句话总结git stash save 是"老黄历",git stash push 是"新标准"。为了不给自己挖坑,忘掉 save,只用 push

相关推荐
_道隐_3 小时前
git stash如何pop指定的stash change?
git
PC2005-cloud5 小时前
Git学习笔记:GitHub Git Data API 完全指南,用 Go 操控 Git 底层对象
笔记·git·学习
Python私教20 小时前
AI 并行编码的 Worktree 生命周期:创建、隔离与安全回收
人工智能·git
互联网中的一颗神经元21 小时前
16 — 改写历史 rebase:搬家到新楼层,不是合并
git
互联网中的一颗神经元1 天前
19 — 贮藏与清理:stash 是抽屉,gc 是打包箱
git
用户330144867631 天前
20 — 远程进阶:强制推送的保险绳——force-with-lease
git
Cooper251 天前
别急着改 Git 历史:rebase、cherry-pick、bisect 与 reflog 的安全操作顺序
git
刚入门的大一新生1 天前
Linux-版本控制器Git
git
扶苏10021 天前
同一个 Git 项目整出两份,切分支互不影响?两种方案实测
大数据·git·elasticsearch