基于本文回答

播面 播面

刷题像听歌,多听自然懂
0
评论

正在开发某个功能时需要紧急修复线上 Bug,但当前代码还没写完不想 commit,该如何处理?

知识点图片

这是一个在日常开发中非常高频的场景。在 Git 中,有三种常见的方法可以优雅地处理这个问题。

推荐程度从高到低分别是:使用 git stash(暂存)使用 git worktree(工作树)提交 WIP(半成品)随后撤销

以下是具体的实操步骤:


方法一:使用 git stash(最推荐 & 最常用)

git stash 的作用是将你当前工作区所有未提交的修改(包括暂存和未暂存的)“藏”起来,让你的工作区恢复到一个干净的状态。

处理流程:

  1. 暂存当前未写完的代码:

    bash
    # 推荐加上 -u 参数,这样会把新创建但还没有 git add 的文件(未追踪文件)也一起暂存
    # 加上 -m 可以写个备注,方便以后找
    git stash push -u -m "开发中:XXX功能的半成品"

    此时你的工作区变干净了,代码回到了上一次 commit 的状态。

  2. 切换到线上分支(比如 mainmaster)并拉取最新代码:

    bash
    git checkout main
    git pull origin main
  3. 创建并切换到修复 Bug 的分支(Hotfix):

    bash
    git checkout -b hotfix-xxx-bug

    在这里修复 Bug,测试通过后进行 add, commit,并合并到 main 分支发布。

  4. Bug 修复完后,切回你之前开发的新功能分支:

    bash
    git checkout your-feature-branch
  5. 恢复之前暂存的代码,继续开发:

    bash
    # pop 会将最近一次 stash 的代码恢复到工作区,并从 stash 列表中删除该记录
    git stash pop

    (如果你想保留暂存记录以防万一,可以使用 git stash apply 代替 pop)


方法二:使用 git worktree(进阶方案,完全不干扰当前环境)

如果你当前项目非常庞大,或者你的 IDE 跑了很多本地服务,切换分支会导致重新编译或服务中断,你可以使用 git worktree。它允许你在同一个仓库下,在不同的文件夹里同时打开多个分支

处理流程:

  1. 保持当前开发目录不动,打开终端,在当前仓库所在目录的外面(比如同级目录)创建一个新的工作树,直接基于 main 分支:

    bash
    # 语法:git worktree add <新目录路径> <基于的分支>
    git worktree add ../hotfix-dir main
  2. 用 IDE 打开那个新目录(../hotfix-dir,你会发现这是一个干净的 main 分支环境。

  3. 在新目录里建分支、修 Bug、提交并推送

  4. 处理完毕后,删除这个临时工作树:

    bash
    # 回到你原来的开发目录
    git worktree remove ../hotfix-dir

    这种方法的好处是:你原来的开发分支连 stash 都不用,IDE 状态完全保留,真正的“零打断”。


方法三:提交一个 WIP (Work In Progress) 然后回退(备选方案)

如果你信不过 stash(极少数情况下 stash 可能会引发冲突导致手忙脚乱),你可以先把它作为一个临时提交,等切回来再“反悔”。

处理流程:

  1. 无脑提交当前所有代码:

    bash
    git add .
    git commit -m "WIP: 暂存当前未完成的工作"
  2. 去处理线上 Bug(切分支 -> 修 Bug -> 合并)。

  3. 切回到当前开发分支后,撤销那个临时提交:

    bash
    # --soft 表示撤销 commit,但保留工作区的代码修改
    # HEAD~1 表示回退到上一个版本
    git reset --soft HEAD~1

    执行完后,你的代码就静静地躺在暂存区里,就像你从来没有 commit 过一样,你可以继续愉快地写代码了。

总结建议:

  • 日常绝大多数情况,直接用 方法一 (git stash)
  • 如果项目极大,切分支要重新下依赖/等半天编译,用 方法二 (git worktree)
  • 如果你刚刚写了几千行代码,怕 stash 弄丢了没有安全感,用 方法三 (WIP + git reset)
00:00
00:00