一、Git Stash 工作原理
假设当前状态:
工作区(Working Tree)
↓ git add
暂存区(Index)
↓ git commit
本地仓库(Repository)
执行:
git stash
实际上:
工作区修改
+
暂存区修改
↓
保存到 stash 栈
↓
工作区恢复干净
类似:
开发到一半
↓
放进保险箱(stash)
↓
处理其它事情
↓
再拿出来继续开发
二、查看当前状态
查看修改
git status
例如:
modified: main.go
modified: config.yaml
查看差异
git diff
查看未 add 的内容。
查看已 add 内容
git diff --cached
三、保存当前修改
1、最常用
git stash
等价于:
git stash push
输出:
Saved working directory and index state
此时:
git status
显示:
nothing to commit, working tree clean
2、添加备注
生产环境推荐:
git stash push -m "开发用户登录功能50%"
查看:
git stash list
结果:
stash@{0}: On dev: 开发用户登录功能50%
四、查看 Stash 列表
git stash list
示例:
stash@{0}: On master: 修复订单接口
stash@{1}: On dev: Kafka优化
stash@{2}: On test: MySQL监控
说明:
stash@{0}
最新
stash@{1}
次新
stash@{2}
更早
五、查看 Stash 内容
查看最近一次:
git stash show
结果:
main.go | 12 +++++---
查看详细差异:
git stash show -p
或者:
git stash show -p stash@{0}
六、恢复 Stash
方法1:apply
恢复但不删除
git stash apply
恢复:
stash@{0}
内容。
恢复指定:
git stash apply stash@{1}
恢复后:
stash 仍然存在
查看:
git stash list
还能看到。
方法2:pop
恢复并删除
git stash pop
等价:
git stash apply
git stash drop
恢复后:
stash@{0}
被删除
七、删除 Stash
删除指定:
git stash drop stash@{0}
例如:
git stash drop stash@{2}
删除全部:
git stash clear
危险:
所有 stash 全部删除
无法恢复
八、只保存未提交文件
默认:
git stash
不会保存:
untracked 文件
例如:
touch test.log
状态:
git status
Untracked files:
test.log
执行:
git stash
后:
test.log 还在
保存未跟踪文件:
git stash -u
或
git stash --include-untracked
效果:
已跟踪文件
+
未跟踪文件
全部进入 stash。
九、保存所有文件(包括忽略文件)
例如:
.log
.cache
.tmp
在 .gitignore 中。
普通 stash 不处理。
使用:
git stash -a
或者:
git stash --all
会保存:
tracked
untracked
ignored
全部内容。
十、只保存部分文件
例如:
main.go
config.yaml
test.go
只想保存:
main.go
执行:
git stash push main.go
或:
git stash push main.go config.yaml
Git 新版本支持:
git stash push -- main.go
十一、交互式保存
只保存部分代码块:
git stash -p
出现:
Stash this hunk?
选项:
y 保存
n 跳过
q 退出
类似:
git add -p
十二、创建新分支恢复
开发中常见:
master
开发一半:
git stash
后来发现:
应该在新分支开发
执行:
git stash branch feature-login
效果:
创建新分支
切换过去
恢复 stash
删除 stash
等价:
git checkout -b feature-login
git stash pop
十三、解决冲突
场景:
stash中的代码
与
当前分支代码
发生冲突。
执行:
git stash pop
提示:
CONFLICT (content)
查看:
git status
both modified
手动解决:
vim xxx.go
然后:
git add .
git commit
十四、典型工作流
场景1:开发中紧急修 Bug
当前:
git status
main.go 修改中
保存:
git stash push -m "登录功能开发50%"
切换:
git checkout master
修复:
git commit
回到开发分支:
git checkout dev
恢复:
git stash pop
继续开发。
场景2:拉取代码前保存修改
git stash
git pull
git stash pop
场景3:切换分支
git stash
git checkout release
完成后:
git checkout dev
git stash pop
十五、企业级常用命令速查表
# 保存当前修改
git stash
# 保存并备注
git stash push -m "xxx"
# 查看列表
git stash list
# 查看内容
git stash show -p stash@{0}
# 恢复
git stash apply
# 恢复指定
git stash apply stash@{1}
# 恢复并删除
git stash pop
# 删除指定
git stash drop stash@{0}
# 删除全部
git stash clear
# 包含未跟踪文件
git stash -u
# 包含忽略文件
git stash -a
# 创建分支恢复
git stash branch feature_xxx
# 交互式保存
git stash -p
一张图理解
git stash
┌──────────────────────────┐
│ 工作区修改 │
│ 暂存区修改 │
└──────────┬───────────────┘
│
▼
stash 栈保存
│
▼
工作区恢复干净(clean)
│
▼
git stash pop
│
▼
恢复到原来的开发状态
在实际开发中,最常用的三个命令通常是:
git stash push -m "功能开发50%"
git stash list
git stash pop
这三条命令基本覆盖了 90% 以上的日常使用场景。