git stash pop 与 git stash apply 的区别
两者都把 stash 的改动恢复到工作区,区别是:pop 应用成功后删除该 stash 条目,apply 保留条目。想重复应用同一 stash(比如到多个分支)用 apply;一次性恢复用 pop 更干净。
功能上都是"把 stash 的改动应用回工作区",唯一区别:成功后 pop 会把这条 stash 从列表里删除,apply 会保留。 所以 pop ≈ apply + drop。需要把同一份改动应用到多个分支时必须用 apply。
对照
git stash pop # = apply stash@{0} + 删除该条目
git stash apply # 应用 stash@{0},条目保留
git stash apply stash@{2} # 应用指定条目,保留
git stash drop stash@{2} # 只删除不应用
| pop | apply | |
|---|---|---|
| 应用改动 | ✅ | ✅ |
| 删除条目 | ✅(成功后) | ❌ |
| 冲突时 | 条目保留不删(安全) | 条目保留 |
为什么冲突时 pop 不删条目
pop 遇到合并冲突会应用失败(工作区留下冲突标记),此时不会删除 stash 条目——改动还有一份备份。解决完冲突、确认无误后自己 git stash drop。
常见用法
# 同一份改动要铺到多个分支
git checkout branch-a && git stash apply stash@{0}
git checkout branch-b && git stash apply stash@{0}
git stash drop stash@{0} # 最后手动清理
常见问题(FAQ)
Q:apply 之后改动进了暂存区还是工作区?
默认全部进工作区(未暂存状态)。想恢复 stash 时的暂存/工作区分离状态,加 --index。
Q:pop 错分支了怎么办?
改动已经在工作区,直接 git stash 存回去,切到正确分支再 pop。
Q:stash 列表越来越乱怎么清理?
git stash list 检查,git stash drop stash@{n} 逐条删,或 git stash clear 清空全部(不可恢复,慎用)。