总结速查表
| 命令 | 作用 |
|---|---|
git stash |
保存所有已跟踪文件的修改 |
git stash -u |
保存所有修改(包括新文件) |
git stash list |
查看所有保存的记录 |
git stash apply |
恢复最近一次保存,保留记录 |
git stash pop |
恢复最近一次保存,并删除该记录 |
git stash drop stash@{0} |
删除指定记录 |
git stash clear |
清空所有储藏 |
git stash push -m "msg" |
保存并添加注释 |
git stash branch new-branch |
从储藏内容创建新分支 |
git stash 非常适合在需要临时切换任务时,用来保护你半成品的代码。
简单来说,就是"我想把目前的修改藏起来,让我先做别的事情,之后再恢复回来"。
为什么需要 git stash?
假设你正在当前分支开发一个新功能,修改了几个文件。突然,线上出现了一个紧急Bug需要你立刻修复。你不能提交当前未完成的新功能(因为代码不完整),也不希望丢失这些进度。这时,你就可以用 stash。
1. 最常用的场景:保存当前进度
bash
# 把当前的修改(已跟踪的文件,默认不包括新文件)保存起来
git stash
这个命令会做三件事:
-
把工作区和暂存区的修改都保存到一个"储藏栈"里。
-
把你当前的工作区恢复成上一次提交(
HEAD)的状态。 -
现在你的工作区是完全干净的,可以切换到其他分支去修复Bug了。
补充:保存新文件(未跟踪的文件)
默认情况下,git stash 不会保存新创建(未被 Git 跟踪)的文件。如果需要保存它们:
bash
# 把包括新文件在内的所有修改都保存起来
git stash -u
# 或者保存所有内容(包括被忽略的文件,如 .gitignore 里的文件),很少用到
git stash -a
2. 恢复保存的进度
当你修复完紧急Bug,回到原来的分支后,需要把之前藏起来的修改取回来。
bash
# 查看当前储藏栈里有哪些记录
git stash list
输出示例:
bash
stash@{0}: WIP on main: 4a7b2e9 刚刚提交的某个信息
stash@{1}: On feature: 测试
恢复有两种常用方式:
-
apply:应用,但保留储藏记录bash
# 应用最近一次(stash@{0})的储藏 git stash apply # 应用指定的一个储藏 git stash apply stash@{1}应用后,储藏记录会继续留在列表中。
-
pop:弹出,并删除记录bash# 应用最近一次的储藏,成功后从列表中删除 git stash pop这通常是你做完工作后最常用的方式。
3. 管理和清理
bash
# 查看具体的储藏内容(看看当时改了哪些文件)
git stash show
# 查看更详细的改动内容(展示代码差异)
git stash show -p
# 删除一个特定的储藏
git stash drop stash@{0}
# 删除所有储藏
git stash clear
4. 创建带注释的储藏
当藏得比较多时,给每个储藏加个说明会很有帮助。
bash
git stash push -m "正在开发用户登录功能,还没完成"
这样在 git stash list 里就能看到这个说明,方便记忆。
5. 应用到其他分支
这是stash的一个强大用法。你把修改藏起来,然后切换到另一个分支,想把这些修改带过来。
bash
# 切换到目标分支
git checkout 另一个分支
# 把之前藏的修改应用到当前分支
git stash apply
注意:如果两个分支的文件差异很大,可能会产生冲突,需要手动解决。
6. 从储藏中创建新分支
如果你发现基于当前分支的储藏,想放到一个新的独立分支上去开发,这是最快捷的方法。
bash
# 基于储藏内容创建一个新分支,并切换过去
git stash branch new-branch-name
这条命令会帮你自动完成:创建分支 -> 切换到分支 -> 应用储藏 -> 删除该储藏。
7. 交互式储藏(部分文件)
如果你不想把当前所有修改都藏起来,只想藏特定的几个文件:
bash
# 使用 -p(patch)参数,Git 会询问你每个文件的每一处改动是否要 stash
git stash -p
然后按 y(要)或 n(不要)来选择。
特别提醒:潜在冲突
-
当你
stash apply或stash pop时,如果当前工作区的文件和你藏起来的文件有修改冲突,Git 会把冲突标记出来,需要你手动解决。储藏记录不会自动删除(pop在冲突时也不会删除)。 -
建议在
stash前,工作区最好是干净的,或者明确知道没有冲突风险。