git stash 用法详解

总结速查表

命令 作用
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
复制代码

这个命令会做三件事:

  1. 把工作区和暂存区的修改都保存到一个"储藏栈"里。

  2. 把你当前的工作区恢复成上一次提交(HEAD)的状态。

  3. 现在你的工作区是完全干净的,可以切换到其他分支去修复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 applystash pop 时,如果当前工作区的文件和你藏起来的文件有修改冲突,Git 会把冲突标记出来,需要你手动解决。储藏记录不会自动删除(pop 在冲突时也不会删除)。

  • 建议在 stash 前,工作区最好是干净的,或者明确知道没有冲突风险。

相关推荐
A_Lonely_Cat1 天前
记一次 GitHub 幽灵协作者大清洗:强制重写 Git 历史与穿透 CDN 缓存实践
git·github
和你看星星3 天前
Git rerere:让重复冲突只解决一次
git
嘻嘻仙人7 天前
Ubuntu中 git上传自己的项目和二次上传一般流程
git·github
Patrick_Wilson7 天前
Squash Merge 的血缘陷阱:为什么删掉的代码又活了过来
前端·git·程序员
沉浸学习的匿名网友7 天前
什么是 .gitignore?为什么每个 Git 项目几乎都离不开它?
前端·git
深海鱼在掘金8 天前
Git 完全指南 —— 第3章:理解工作区、暂存区、版本库三个核心
git
江华森8 天前
Git 基础筑基:从原理到团队协作的全栈实战
git
JakeJiang8 天前
Git 必备命令指南:从日常高频到项目开发实战
git
叫我少年9 天前
Windows 中安装 git
git
深海鱼在掘金14 天前
Git 完全指南 —— 第1章:Git 概览与版本控制演进
git