为什么需要暂存修改?

在使用 Git 开发时,你可能会遇到这样的情况:正在某个分支(比如 dev)修改代码,突然需要切换到另一个分支(比如 bugfix)修复紧急问题。如果直接执行 git checkout bugfix,Git 会提示“你的本地修改会被覆盖,要么提交要么暂存”。这时候如果直接提交(比如写一个“临时修改”的提交),之后还得撤销,非常麻烦。

Git Stash 是什么?

stash 就像一个“临时保险箱”,可以把当前未提交的修改(包括工作区和暂存区的修改)暂时保存起来,让工作区恢复到干净状态(和 HEAD 版本一致),方便你安全地切换分支。等处理完目标分支的任务后,再把暂存的修改“取”回来。

操作步骤(附实例)

假设你正在 dev 分支开发新功能,修改了 file1.txtfile2.txt,但还没提交:

1. 检查当前修改状态

先确认有未提交的修改,执行:

git status

输出类似:

On branch dev
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   file1.txt
        modified:   file2.txt

no changes added to commit (use "git add" and/or "git commit -a")

2. 暂存当前修改(执行 git stash

执行 git stash 后,Git 会把所有未提交的修改暂存起来,并清空工作区:

git stash

输出类似:

Saved working directory and index state WIP on dev: a1b2c3d Add feature x

此时再执行 git status,会发现工作区已经干净了:

On branch dev
nothing to commit, working tree clean

3. 切换到目标分支

现在可以安全切换到需要修改的分支(比如 bugfix):

git checkout bugfix

切换成功后,你可以专注修复问题,不用担心代码被覆盖。

4. 完成目标分支任务后,恢复暂存的修改

修复完 bugfix 分支的问题后,先切回原分支(dev):

git checkout dev

然后执行 git stash pop,恢复之前暂存的修改:

git stash pop

执行后,暂存的修改会被恢复,同时暂存记录会被删除(“pop”即“弹出”,恢复并删除)。输出类似:

On branch dev
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   file1.txt
        modified:   file2.txt

补充:常用 Stash 命令

  • 查看所有暂存记录git stash list
    输出类似:stash@{0}: WIP on dev: a1b2c3d Add feature x,每个 stash@{n} 对应一条暂存记录。

  • 只恢复暂存,不删除记录git stash apply
    如果暂存了多条记录,想恢复某一条(比如 stash@{1}),可以执行:
    git stash apply stash@{1},之后记录仍保留。

  • 删除指定暂存记录git stash drop stash@{n}
    如果不需要某个暂存记录,可以用 drop 删除,比如:git stash drop stash@{0}

注意:处理冲突

如果恢复暂存修改时遇到冲突(比如原分支和暂存修改的代码冲突),Git 会提示 Automatic merge failed。此时需要手动打开冲突文件(标记为 <<<<<<< HEAD 开头的文件),解决冲突后执行 git add 冲突文件,再重新执行 git stash pop 即可。

总结

stash 是 Git 中非常实用的工具,它像一个“临时存储站”,能帮我们在切换分支时安全地保存未提交的修改,避免代码丢失。核心命令 git stash(暂存)和 git stash pop(恢复)简单易用,适合所有 Git 初学者掌握。记住:处理完任务后,及时恢复暂存的修改,保持工作流的整洁!

小夜