为什么需要Git stash?¶
想象一下,你正在写一个功能,代码改了一半,突然接到一个紧急修复的任务,需要切换到bug分支。但此时你还没提交修改的代码,如果直接切换分支,这些修改会被覆盖或导致冲突。这时候,Git stash 就派上用场了!它能帮你把“当前正在做但不想提交”的代码“临时存起来”,等处理完急事再回来继续。
Git stash是什么?¶
Git stash 是Git提供的一个“临时存储”工具,专门用来保存工作区和暂存区的修改(但不保存分支信息)。保存后,你的工作区会恢复到和上次提交时一模一样的状态,这样你就能干净地切换分支、拉取代码或做其他操作,之后再通过stash恢复之前的修改。
常用的Git stash命令¶
1. 保存当前修改(最常用)¶
命令:git stash
作用:把工作区和暂存区的所有修改“打包”存起来,默认会带上一个自动生成的描述(如 WIP on 分支名: 提交哈希 简短描述)。
示例:
# 当前在dev分支,工作区有未提交的修改
$ git status # 查看状态,显示修改未提交
$ git stash # 执行stash,保存修改
Saved working directory and index state WIP on dev: a1b2c3d 修改登录页面
2. 查看所有stash记录¶
命令:git stash list
作用:列出所有之前保存的stash(按时间倒序),每条记录包含一个编号(如 stash@{0})和描述。
示例:
$ git stash list
stash@{0}: WIP on dev: a1b2c3d 修改登录页面
stash@{1}: WIP on dev: 4e5f6g7 新增用户列表
3. 恢复stash(不删除)¶
命令:git stash apply [stash编号]
作用:恢复指定的stash记录(默认恢复最近的 stash@{0}),但不会删除该记录。
示例:
# 恢复最近的stash(stash@{0})
$ git stash apply
On branch dev
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: a.txt
4. 恢复stash(删除)¶
命令:git stash pop [stash编号]
作用:恢复指定的stash,并且删除该记录(推荐,因为stash是临时的)。
示例:
# 恢复stash@{0}并删除
$ git stash pop
On branch dev
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: a.txt
Dropped refs/stash@{0} (f123456...)
5. 删除指定stash¶
命令:git stash drop [stash编号]
作用:只删除指定的stash记录(如果想保留恢复,用apply;想删除,用drop)。
示例:
# 删除stash@{1}
$ git stash drop stash@{1}
Dropped stash@{1} (f234567...)
6. 清空所有stash¶
命令:git stash clear
作用:删除所有stash记录,谨慎使用!
示例:
$ git stash clear
All stashes removed.
实用场景示例¶
场景:临时切换分支修复bug¶
- 当前工作区有未提交修改:
$ git status # 显示修改的文件,如a.txt
$ git stash # 保存修改
Saved working directory and index state WIP on dev: a1b2c3d 开发中
- 切换到bug分支修复问题:
$ git checkout bugfix # 切换分支(此时工作区干净)
$ git commit -m "修复登录bug" # 提交修复
- 修复完成后,恢复之前的stash:
$ git checkout dev # 切回dev分支
$ git stash pop # 恢复并删除stash记录
On branch dev
Changes to be committed:
modified: a.txt
注意事项¶
- stash是临时的:stash仅用于临时保存,不要把重要内容长期放在stash里。
- 恢复可能有冲突:如果恢复时和其他修改冲突,Git会提示“Automatic merge failed”,需手动编辑文件解决冲突。
- 恢复后状态:
pop和apply都会恢复修改到工作区,但pop会删除stash,apply保留。 - stash不保存分支:stash只是保存修改快照,不是分支,无法像分支一样切换。
总结¶
Git stash 是处理“临时未完成工作”的神器,能帮你在切换分支、拉取代码时避免冲突,保持工作区干净。掌握 git stash、git stash apply、git stash pop 这三个核心命令,就能轻松应对大部分临时修改场景。记住:stash用完即删,别让它堆积!