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

相关推荐
不怕犯错,就怕不做17 小时前
git prune 自动删除本地记录中那些远程已经不存在的分支引用
linux·服务器·git
ELI_He9991 天前
如何还原已经推送的提交
git
️学习的小王1 天前
Git项目提交忽略文件怎么做?以Python项目为例,详解.gitignore
git·python·elasticsearch
愚蠢得人1 天前
Git Worktree实用指南:同时开发两个分支,不再反复切换
git
lskaixin1 天前
Git命令
git
_道隐_1 天前
git 如何把一个已经commit到本地分支的,被错误staged的文件,单独拿出来revert呢?
git
lingran__1 天前
Git 完全指南(一):本地仓库基础操作
linux·git·开发工具·devops·版本控制
星空1 天前
git使用
git
工藤孤独2 天前
Git Worktree 从零到多智能体实战
git
微尘寒风3 天前
【Git】的安装和使用
java·git