为什么需要暂存修改?¶
在使用 Git 开发时,你可能会遇到这样的情况:正在某个分支(比如 dev)修改代码,突然需要切换到另一个分支(比如 bugfix)修复紧急问题。如果直接执行 git checkout bugfix,Git 会提示“你的本地修改会被覆盖,要么提交要么暂存”。这时候如果直接提交(比如写一个“临时修改”的提交),之后还得撤销,非常麻烦。
Git Stash 是什么?¶
stash 就像一个“临时保险箱”,可以把当前未提交的修改(包括工作区和暂存区的修改)暂时保存起来,让工作区恢复到干净状态(和 HEAD 版本一致),方便你安全地切换分支。等处理完目标分支的任务后,再把暂存的修改“取”回来。
操作步骤(附实例)¶
假设你正在 dev 分支开发新功能,修改了 file1.txt 和 file2.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 初学者掌握。记住:处理完任务后,及时恢复暂存的修改,保持工作流的整洁!