git stash push -m 是当前唯一推荐的保存方式,替代已弃用的 git stash save;它支持 -u(含未跟踪文件)、--keep-index 等参数,且带描述信息便于识别 stash 内容。

git stash push -m 是当前唯一推荐的保存方式
别再用 git stash save,它从 Git 2.19 开始就被标记为 deprecated,只是兼容性保留。新项目或团队协作中统一用 git stash push -m,否则会踩坑:比如想包含未跟踪文件时加 -u 参数,git stash save -u 直接报错 “unrecognized argument: -u”。
实际操作中,描述信息不是可选装饰——stash 列表里全是 stash@{0} 这种编号,过两天根本记不清哪条对应哪个功能。加 -m 后,git stash list 输出就能一眼识别:
stash@{0}: On feature/login: WIP: add password strength check
stash@{1}: On main: fix: typo in error message
-
git stash push -m "WIP: login UI"—— 默认只存已跟踪文件的修改 -
git stash push -u -m "WIP: login UI + config files"—— 加-u才会把新增但未git add的文件也暂存 -
git stash push --keep-index -m "WIP: partial refactor"—— 暂存工作区修改,但保留暂存区原样(适合只想 stash 未 add 的部分)
git stash apply 和 git stash pop 的关键区别
恢复 stash 时,git stash pop = git stash apply + git stash drop,但这个“自动删除”不是原子操作:如果恢复过程发生冲突,pop 会失败并中止,stash 还在栈里;而 apply 即使冲突也照常执行,stash 始终保留。
这意味着:pop 更适合确定无冲突的干净场景;apply 更安全,尤其当你不确定当前工作区是否干净、或者想反复测试某次 stash 内容时。
- 想试完就删:用
git stash pop - 想保留 stash 备份,或准备多次 apply 同一个 stash:必须用
git stash apply - 恢复指定 stash(比如第二条):
git stash apply stash@{1},注意编号从 0 开始,stash@{0}是最新一条
stash 冲突时该怎么处理
stash 恢复本质是一次三方合并(base 是 stash 创建时的 HEAD,ours 是当前工作区,theirs 是 stash 内容),所以冲突和 git merge 一样要手动解决。但很多人忽略一点:冲突后 git status 显示的是 “both modified”,而不是 “unmerged paths”,容易误以为没冲突。
GitHub 仓库备份技能 - 将 OpenClaw 工作空间自动或手动备份至 GitHub 私有仓库。支持自动定时备份和手动交互式配置,引导完成 Token 配置、仓库创建、首次备份及定时任务设置。用途:(1) 首次设置 (2) 日常备份。
真正要盯住的是命令行输出——只要看到 “Auto-merging xxx” 后跟 “CONFLICT” 字样,就必须立刻 git add 解决后的文件,再 git stash drop(如果是 apply)或等 pop 自动完成。
- 冲突文件会进入工作区,内容含
- 解决后别忘了
git add <file>,否则git stash drop会拒绝执行(Git 认为还有未处理修改) - 如果想放弃这次恢复:
git reset --hard回退到恢复前状态,再git stash drop stash@{0}清理掉已失效的 stash
stash 不是长期备份,别依赖它跨周保存
stash 存在本地 Git 仓库的 reflog 中,不参与 git push,也不会同步到远程。一旦执行 git stash clear 或 reflog 过期(默认 30 天),所有 stash 就彻底消失,连 git fsck 都找不回来。
更隐蔽的风险是:stash 基于创建时的 commit ID,如果那个 commit 被 rebase 或 filter-branch 删除,stash 就变成“悬空引用”,git stash show 可能报错,apply 也可能应用到错误上下文。
所以,超过一天的临时修改,建议至少做一次 git commit -m "wip: xxx" 并推送到个人分支——stash 只负责小时级上下文切换,不是替代 commit 的方案。

















