正在开发某个功能时需要紧急修复线上 Bug,但当前代码还没写完不想 commit,该如何处理?
这是一个在日常开发中非常高频的场景。在 Git 中,有三种常见的方法可以优雅地处理这个问题。
推荐程度从高到低分别是:使用 git stash(暂存)、使用 git worktree(工作树)、提交 WIP(半成品)随后撤销。
以下是具体的实操步骤:
方法一:使用 git stash(最推荐 & 最常用)
git stash 的作用是将你当前工作区所有未提交的修改(包括暂存和未暂存的)“藏”起来,让你的工作区恢复到一个干净的状态。
处理流程:
暂存当前未写完的代码:
bash# 推荐加上 -u 参数,这样会把新创建但还没有 git add 的文件(未追踪文件)也一起暂存 # 加上 -m 可以写个备注,方便以后找 git stash push -u -m "开发中:XXX功能的半成品"此时你的工作区变干净了,代码回到了上一次 commit 的状态。
切换到线上分支(比如
main或master)并拉取最新代码:bashgit checkout main git pull origin main创建并切换到修复 Bug 的分支(Hotfix):
bashgit checkout -b hotfix-xxx-bug在这里修复 Bug,测试通过后进行
add,commit,并合并到main分支发布。Bug 修复完后,切回你之前开发的新功能分支:
bashgit checkout your-feature-branch恢复之前暂存的代码,继续开发:
bash# pop 会将最近一次 stash 的代码恢复到工作区,并从 stash 列表中删除该记录 git stash pop(如果你想保留暂存记录以防万一,可以使用
git stash apply代替pop)
方法二:使用 git worktree(进阶方案,完全不干扰当前环境)
如果你当前项目非常庞大,或者你的 IDE 跑了很多本地服务,切换分支会导致重新编译或服务中断,你可以使用 git worktree。它允许你在同一个仓库下,在不同的文件夹里同时打开多个分支。
处理流程:
保持当前开发目录不动,打开终端,在当前仓库所在目录的外面(比如同级目录)创建一个新的工作树,直接基于
main分支:bash# 语法:git worktree add <新目录路径> <基于的分支> git worktree add ../hotfix-dir main用 IDE 打开那个新目录(
../hotfix-dir),你会发现这是一个干净的main分支环境。在新目录里建分支、修 Bug、提交并推送。
处理完毕后,删除这个临时工作树:
bash# 回到你原来的开发目录 git worktree remove ../hotfix-dir这种方法的好处是:你原来的开发分支连
stash都不用,IDE 状态完全保留,真正的“零打断”。
方法三:提交一个 WIP (Work In Progress) 然后回退(备选方案)
如果你信不过 stash(极少数情况下 stash 可能会引发冲突导致手忙脚乱),你可以先把它作为一个临时提交,等切回来再“反悔”。
处理流程:
无脑提交当前所有代码:
bashgit add . git commit -m "WIP: 暂存当前未完成的工作"去处理线上 Bug(切分支 -> 修 Bug -> 合并)。
切回到当前开发分支后,撤销那个临时提交:
bash# --soft 表示撤销 commit,但保留工作区的代码修改 # HEAD~1 表示回退到上一个版本 git reset --soft HEAD~1执行完后,你的代码就静静地躺在暂存区里,就像你从来没有 commit 过一样,你可以继续愉快地写代码了。
总结建议:
- 日常绝大多数情况,直接用 方法一 (
git stash)。 - 如果项目极大,切分支要重新下依赖/等半天编译,用 方法二 (
git worktree)。 - 如果你刚刚写了几千行代码,怕 stash 弄丢了没有安全感,用 方法三 (WIP + git reset)。