Git - git stash 语法演进与实战指南

标签:Git · 版本控制 · 开发工具

一、git stash 基础回顾

git stash 用于临时存储工作区和暂存区的未提交修改,让工作区恢复干净状态,适合切换分支、拉取代码等场景。

bash 复制代码
git stash                    # 暂存当前修改(基本用法)
git stash list               # 查看所有暂存记录
git stash pop                # 恢复最近一次暂存并删除记录
git stash apply              # 恢复但不删除记录
git stash drop stash@{0}     # 删除指定暂存
git stash clear              # 清除所有暂存

二、语法演进时间线

版本 新增语法 说明
Git 2.13+ git stash push 替代已弃用的 git stash save,支持 pathspec
Git 2.13+ git stash push -m "消息" 带消息暂存,替代 save "消息"
Git 2.13+ git stash push -- <file> 只暂存指定文件
Git 2.23+ git switch / git restore 常配合 stash 使用,语义更清晰
Git 2.35+ git stash push -S / --staged 只暂存已 staged 的变更
Git 2.35+ git stash push --pathspec-from-file=<file> 从文件读取 pathspec
Git 2.35+ git stash show --include-untracked 查看含未跟踪文件的 diff
Git 2.35+ git stash show --only-untracked 只查看未跟踪文件 diff
Git 2.51+ git stash export 导出 stash 为可移植格式
Git 2.51+ git stash import 导入他人导出的 stash
Git 2.51+ pull.autostash 配置 git pull 自动 stash

三、各版本新语法详解

3.1 Git 2.13+:push 替代 save

旧写法(已弃用):

bash 复制代码
git stash save "修复键盘遮挡问题"

新写法(推荐):

bash 复制代码
git stash push -m "修复键盘遮挡问题"
对比项 save push
消息参数 直接跟字符串 用 -m 指定
pathspec 不支持 支持 -- <file>
状态 已弃用 推荐使用

3.2 Git 2.13+:指定文件暂存

bash 复制代码
# 只暂存特定文件,其他文件修改保持不变
git stash push -m "键盘遮挡输入框滚动" -- src/views/trade/extract/ExtractCheck.vue

# 暂存多个文件
git stash push -m "修复多个文件" -- file1.vue file2.vue

3.3 Git 2.23+:配合 switch 切换分支

bash 复制代码
# 旧(所有版本兼容)
git checkout bugfix-branch

# 新(Git 2.23+,语义更清晰)
git switch bugfix-branch

3.4 Git 2.35+:只暂存 staged 变更

bash 复制代码
git stash push --staged -m "只暂存已暂存的变更"

场景: 工作区有两组修改,一组已 git add 准备提交,另一组还在改。用 --staged 只暂存已 staged 的部分。

3.5 Git 2.35+:从文件读取 pathspec

bash 复制代码
git stash push --pathspec-from-file=file-list.txt

3.6 Git 2.35+:查看含未跟踪文件的 diff

bash 复制代码
git stash show --include-untracked     # 包含未跟踪文件
git stash show --only-untracked        # 只看未跟踪文件
git stash show -p --include-untracked stash@{0}  # patch 格式

3.7 Git 2.51+:stash 导出/导入

bash 复制代码
# 导出
git stash export --file my-stash.bundle

# 导入
git stash import --file my-stash.bundle

场景: 跨机器、跨仓库共享未完成的修改。

3.8 Git 2.51+:pull 自动 stash

bash 复制代码
git config --global pull.autostash true
# 之后 git pull 自动 stash → 拉取 → 恢复

优先级: pull.autostash > rebase.autostash > merge.autostash

四、常用参数速查

参数 全称 说明
-m --message 暂存消息
-u --include-untracked 包含未跟踪文件
-a --all 包含所有文件(含 .gitignore)
-k --keep-index 暂存后保留 index 状态
-p --patch 交互式选择暂存内容
-S --staged 只暂存 staged 变更(2.35+)
-q --quiet 静默模式

五、完整工作流示例

场景一:开发中紧急切分支修 bug

bash 复制代码
# 1. 只暂存当前修改的文件
git stash push -m "键盘遮挡修复(android)" -- src/views/trade/extract/ExtractCheck.vue

# 2. 切到 bug 分支
git switch bugfix-branch

# 3. 修 bug 并提交
git add .
git commit -m "fix: 修复xxx"
git push

# 4. 切回原分支
git switch feature/keyboard-scroll

# 5. 恢复暂存
git stash pop

场景二:跨机器共享未完成的修改

bash 复制代码
# A 机器:暂存多个文件并导出
git stash push -m "WIP: 表单验证重构" \
    -- src/views/trade/extract/ExtractCheck.vue \
       src/views/trade/deposit/SubmitCertificate.vue \
       src/utils/commonUtils.js

git stash export --file /tmp/my-work.bundle

# B 机器:导入并恢复
git stash import --file /tmp/my-work.bundle
git stash pop

场景三:从文件列表批量暂存

bash 复制代码
# file-list.txt 内容:
# src/views/trade/extract/ExtractCheck.vue
# src/views/trade/deposit/SubmitCertificate.vue
# src/utils/commonUtils.js

git stash push -m "WIP: 表单验证重构" --pathspec-from-file=file-list.txt
git stash export --file /tmp/my-work.bundle

六、版本要求速查

功能 最低版本 检查命令
push + pathspec Git 2.13+ git --version
--staged Git 2.35+ git --version
--pathspec-from-file Git 2.35+ git --version
show --include-untracked Git 2.35+ git --version
export / import Git 2.51+ git --version
pull.autostash Git 2.51+ git --version

七、常见问题

1. save 和 push 用哪个?

用 push。save 已弃用,push 功能更全(支持 pathspec)。

2. 怎么只暂存一个文件?

bash 复制代码
git stash push -m "消息" -- path/to/file.vue

3. 怎么只暂存已 add 的部分?

bash 复制代码
git stash push --staged

4. 恢复暂存后冲突怎么办?

git stash pop 冲突时不会删除暂存记录,需手动解决冲突后 git stash drop。

5. 暂存丢了怎么找回?

bash 复制代码
git fsck --unreachable | grep commit
git stash apply <commit-hash>

总结

场景 推荐命令
基本暂存 git stash push -m "消息"
指定文件暂存 git stash push -m "消息" -- <file>
只暂存 staged git stash push --staged
包含未跟踪文件 git stash push -u
跨机器共享 git stash export/import
pull 自动暂存 git config pull.autostash true

核心要点:用 push 不用 save,指定文件用 --,只暂存已暂存用 --staged,跨机器用 export/import。

相关推荐
福兮说4 小时前
前端下载大文件,点了按钮半天没反应:fetch + blob 的三个问题和三种替代写法
前端·javascript·性能优化·文件下载
GreenTea4 小时前
我把 Agent 的 while 循环拆掉了:一种你可能没想到的 Agent 架构
前端·后端·架构
科技观察哨4 小时前
六足平台选型与纳米定位系统集成:HEB-640六自由度位移台在半导体光刻对准中的参数边界与国产替代评估
前端·人工智能
niucloud-admin5 小时前
JAVA V6 多商户商城 开发文档——web前端
前端
颜进强5 小时前
16 · NestJS LifecycleEvents 生命周期事件:五个钩子、三条边界,和 rag-server 的优雅停机
前端·后端·ai编程
誰能久伴不乏6 小时前
看懂 Git 团队协作全流程:分支、提交、PR、rebase 到底在干嘛
git
今年下半年6 小时前
【VUE】整合腾讯地图、自定义区域边界、村委名称及资产统计(放大显示资产点位)
前端·javascript·vue.js
郑州光合科技余经理6 小时前
同城电商系统:库存变更怎么同步到订单
java·开发语言·前端·后端·uni-app·php·ai编程
前端snow8 小时前
ai agent --- DeepAgents 中间件
前端
data analyse 4569 小时前
报表能自定义的国内统计工具有哪些
前端·数据分析