在使用Git管理代码时,你是否遇到过这样的情况:正在专注写一个新功能,突然需要修复一个紧急的线上bug,此时如果直接提交半成品代码,会影响后续开发思路;但不提交的话,又无法切换到bug修复的分支。这时,Git stash就派上用场了!它能帮你临时保存当前的工作进度,让你可以安心处理其他任务,之后再回来继续你的工作。

为什么需要Git stash?

想象一下这几个场景,你就会明白stash的必要性:

  • 场景1:紧急切换分支
    你正在dev分支开发一个新功能,写了一半代码,突然发现main分支有个紧急bug需要修复。此时执行git checkout main会被Git拒绝(因为有未提交的修改),这时候用stash就能先“冻结”当前进度,切换分支修复完bug后再回来。

  • 场景2:临时保存进度
    你正在调试一个复杂的功能,写了一半代码,临时需要去处理另一个简单的需求(比如改个文档)。此时用stash保存当前代码,处理完简单需求后再恢复,不用重复写代码。

Git stash的基本操作

1. 保存当前修改

当你有未提交的修改(包括工作区和暂存区),可以用git stash save命令将其临时保存。
语法git stash save "消息"(消息可选,建议加简短说明,方便后续识别)。

示例

# 假设你正在修复用户登录页面的bug,写了一半代码,此时执行:
git stash save "临时保存用户登录页面的bug修复进度"

执行后,Git会将当前的修改“打包”保存,并回到最近一次提交的状态。此时git status会显示“干净”(无未提交修改),可以放心切换分支或处理其他任务了。

2. 查看已保存的stash列表

如果保存了多个stash,或想知道之前存了什么,可以用git stash list查看:

示例

git stash list

输出示例

stash@{0}: On dev: 临时保存用户登录页面的bug修复进度
stash@{1}: On feature/pay: WIP on feature/pay: a1b2c3d

每个stash都有一个编号(stash@{0}是最新的,stash@{1}是之前的),以及对应的分支和消息。

3. 恢复stash的内容

处理完其他任务后,需要恢复之前保存的修改,有两种方式:

  • 恢复并删除该stash(最常用):用git stash pop
    它会恢复最近的stash(默认是stash@{0}),并将其从列表中删除。

示例

  # 假设你修复完bug后,切回dev分支,恢复之前的stash
  git stash pop
  • 恢复但保留该stash:如果想保留stash(比如之后可能需要多次恢复),用git stash apply
    它会恢复指定的stash,但不会删除原记录。

示例

  # 恢复stash@{1}(第二个stash)
  git stash apply stash@{1}

注意:如果恢复时发生冲突(比如不同stash修改了同一行代码),Git会提示“Automatic merge failed”。此时需要手动打开冲突文件,修改冲突部分(Git会用<<<<<<< HEAD等标记冲突位置),修改后执行git add <冲突文件>,再执行git stash pop(或apply)完成恢复。

4. 删除不需要的stash

如果某个stash已经没用了,可以用git stash drop删除指定的stash:

示例

# 删除stash@{1}(第二个stash)
git stash drop stash@{1}

重要git stash clear会删除所有stash,谨慎使用!

常见问题与注意事项

  • stash保存的范围
    Git stash会保存工作区暂存区的所有修改,但不会保存未跟踪的文件(即git status中显示“untracked”的文件)。如果需要保存未跟踪文件,可使用git stash -u(或--include-untracked)。

  • 不要过度依赖stash
    stash适合临时操作,长期的工作进度建议用git commit(即使还没完成,也可以先提交一个“半成品”并写好message),方便后续回溯。

总结

Git stash就像一个“临时存储袋”,帮你在切换任务或分支时,安全地保存当前的编码进度,避免意外丢失未完成的代码。掌握stash savestash liststash popstash drop这几个核心操作,就能更灵活地管理开发流程啦!下次遇到需要“暂停”当前工作时,记得用stash哦~

小夜