为什么需要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

  1. 当前工作区有未提交修改
   $ git status  # 显示修改的文件,如a.txt
   $ git stash   # 保存修改
   Saved working directory and index state WIP on dev: a1b2c3d 开发中
  1. 切换到bug分支修复问题
   $ git checkout bugfix  # 切换分支(此时工作区干净)
   $ git commit -m "修复登录bug"  # 提交修复
  1. 修复完成后,恢复之前的stash
   $ git checkout dev  # 切回dev分支
   $ git stash pop     # 恢复并删除stash记录
   On branch dev
   Changes to be committed:
     modified:   a.txt

注意事项

  1. stash是临时的:stash仅用于临时保存,不要把重要内容长期放在stash里。
  2. 恢复可能有冲突:如果恢复时和其他修改冲突,Git会提示“Automatic merge failed”,需手动编辑文件解决冲突。
  3. 恢复后状态popapply 都会恢复修改到工作区,但 pop 会删除stash,apply 保留。
  4. stash不保存分支:stash只是保存修改快照,不是分支,无法像分支一样切换。

总结

Git stash 是处理“临时未完成工作”的神器,能帮你在切换分支、拉取代码时避免冲突,保持工作区干净。掌握 git stashgit stash applygit stash pop 这三个核心命令,就能轻松应对大部分临时修改场景。记住:stash用完即删,别让它堆积!

小夜