一文详解Git的暂存与stash功能

Written by

in

文章目录
  • git stash (中文常翻译为储藏 / 暂存 / 暂存搁置) 是 Git 中极其常用的命令,核心核心作用: 临时「储藏 / 保存」工作区 + 暂存区 中所有未提交的修改内容,让你的工作区和暂存区立刻恢复到「干净状态」(和最近一次 commit 完全一致) ,且不会丢弃任何修改。
  • 所有命令按「使用频率从高到低」排序,优先掌握前 5 个即可满足 90% 的开发需求,推荐死记硬背 + 熟练使用。 1. 核心存储:git stash / git stash push # 方式1:最简写法(推荐,工作中99%用这个) git stash # 方式2:保存修改并添加描述信息 git stash save “描述信息” # 方式3:完整写法(和上面等价,push 可以省略) git stash push 功能:把「工作区 + 暂存区」的所有未提交修改,临时保存到 Git 的「储藏栈」,工作区立刻变干净,所有修改被隐藏。 2. 带备注存储:git stash push -m "备注信息" 【强烈推荐】 git stash push -m “首页轮播图样式修改-未完成” git stash push -m “订单模块bug修复-待测试” 功能:和 git stash 功能一致,唯一区别是给本次储藏添加「自定义备注」。 为什么强烈推荐?当你多次 git stash 后,会有多个储藏记录,带备注能一眼区分每个储藏对应的修改内容,不会混淆,避免后续恢复错代码! 3. 查看所有储藏记录:git stash list git stash list 功能:查看 Git 储藏栈中所有的临时存储记录,输出格式如下: stash@{0}: On dev: 搜索框样式优化-未完成 stash@{1}: On dev: 筛选条单选失效问题修复-待测试 储藏栈是「后进先出」的结构(栈结构):最新的储藏记录排在最上面,编号 stash@{0}; 每个记录包含:编号、所属分支、自定义备注。 4. 恢复储藏的修改:git stash pop 【最常用恢复方式】 # 恢复「最新的储藏记录」(stash@{0}),恢复后自动删除这条储藏记录 git stash pop # 恢复「指定编号」的储藏记录,恢复后自动删除该记录 git stash pop stash@{1} 核心功能:将储藏的修改恢复到当前工作区,恢复后代码和你 stash 之前完全一致(工作区 + 暂存区的修改都回来)。 关键特性:pop = 「恢复 + 删除」,恢复后这条储藏记录就从栈中消失了,适合确认只恢复一次的场景。 5. 恢复储藏的修改:git stash apply 【备选恢复方式】 # 恢复最新的储藏记录(stash@{0}),恢复后「不删除」这条储藏记录 git stash apply # 恢复指定编号的储藏记录,恢复后「不删除」该记录 git stash apply stash@{1} 核心功能:和 git stash pop 几乎一样,都是把储藏的修改恢复到工作区。 关键区别:apply = 「只恢复,不删除」,恢复后这条储藏记录依然保存在栈中,适合需要多次恢复同一份修改的场景。 ✅ 重点区分:git stash pop vs git stash apply(必考必用) 这两个命令是最容易混淆的,记住核心差异只有一个:是否删除储藏记录 ✅ git stash pop:恢复 + 删除记录 → 「一次性恢复」,用完即删,推荐日常使用; ✅ git stash apply:只恢复,不删记录 → 「可重复恢复」,恢复后还能再次恢复这份修改,适合特殊场景。
  • 1. 删除指定储藏记录:git stash pop储藏编号 # 删除最新的储藏记录 git stash drop stash@{0} # 删除指定编号的储藏记录 git stash drop stash@{2} 功能:只删除,不恢复。当你有一些无用的储藏记录,不想恢复只想清理时,用这个命令。 2. 删除所有储藏记录:git stash clear git stash clear 功能:清空 Git 储藏栈中的所有储藏记录,慎用执行后无法恢复被删除的记录,适合确认所有储藏都无用时的批量清理。 3. 查看储藏的「具体修改内容」:git stash show # 查看最新储藏的「文件变更列表」(只显示文件名+增删行数) git stash show # 查看最新储藏的「完整diff详情」(显示具体修改的代码行,推荐) git stash show -p # 查看指定编号储藏的完整diff详情 git stash show -p stash@{1} 功能:在恢复储藏前,想先看看这份储藏里具体改了哪些代码,避免恢复错内容时,用这个命令,-p 参数是核心(patch 补丁模式),能看到完整的代码修改。 1. 储藏「未追踪的新文件」:git stash -u / git stash –include-untracked git stash -u # 等价写法 git stash –include-untracked 重要特性补充:默认的 git stash 只会储藏「已追踪的文件」(已经被 Git 管理的文件,比如之前 commit 过的文件),对于工作区中新建的、从未被 git add 过的新文件(未追踪文件) ,默认不会被储藏。 加 -u 参数后:会把「已追踪文件的修改 + 未追踪的新文件」一起储藏,工作区彻底干净,连新文件都被隐藏了。 5. 储藏「忽略的文件」:git stash -a / git stash –all git stash -a # 等价写法 git stash –all 功能:最强的储藏命令,会储藏「已追踪文件修改 + 未追踪新文件 + .gitignore 中忽略的文件」(比如 node_modules、dist 等),适合需要完全清空工作区的场景,日常开发很少用,特殊场景(比如切换分支前彻底清理)可用。
  • 这部分是最容易踩坑的地方,很多人用 stash 出问题,都是因为没注意这些规则,全部记住,能避开 99% 的坑! ✅ 注意 1:git stash 不会储藏的内容(默认行为) 默认执行 git stash 时,以下内容绝对不会被储藏,会原封不动留在工作区: 从未被 Git 追踪过的文件(新建的、没执行过 git add 的文件); 被 .gitignore 忽略的文件(比如依赖包、打包产物、日志文件); 已经提交到版本库的文件(只会处理「未提交」的修改)。 ✅ 解决办法:需要储藏未追踪文件用 git stash -u,需要储藏忽略文件用 git stash -a。 ✅ 注意 2:stash 的恢复与「分支无关」,但有最佳实践 很多人误以为「在哪个分支 stash,就只能在哪个分支恢复」,这个认知是错误的! 真相:Git 的 stash 是「全局的」,储藏的是「文件的修改内容」,不是和分支绑定的,你可以在 dev 分支 stash,然后切换到 test 分支恢复。 最佳实践:尽量在哪个分支储藏,就在哪个分支恢复! 原因:不同分支的代码差异可能很大,跨分支恢复 stash 大概率会触发「代码冲突」,处理冲突会增加不必要的麻烦,除非你明确知道两份代码无冲突。 ✅ 注意 3:储藏记录的「生命周期」 储藏记录不是永久保存的,它是「临时缓存」,以下操作会删除储藏记录: 执行 git stash pop 编号:恢复后自动删除该记录; 执行 git stash drop 编号:手动删除该记录; 执行 git stash clear:删除所有记录; 仓库被删除 / 迁移:储藏记录会跟着仓库消失(不会同步到远程仓库)。 ✅ 注意 4:stash 无法储藏「空文件 / 空目录」 如果你的修改只是新建了一个空文件 / 空目录,执行 git stash 不会生效,Git 会提示「No local changes to save」,这是 Git 的默认规则,无需处理。 ✅ 五、Git Stash 完整工作流程演示(工作中最常用,直接套用) 给你一套完整的「标准流程」,遇到「代码没写完要切分支」的场景,直接按步骤执行即可,零错误、零踩坑,这是工作中最经典的用法:
  • 目录
    • 基础暂存操作
      • 添加修改到暂存区
      • 取消暂存
    • 一、Git Stash 是什么?核心作用
      • 什么时候必须用 Git Stash?(核心使用场景)
    • 二、Git Stash 基础核心命令(必会,高频使用)
      • 三、Git Stash 进阶命令(必会,解决 80% 的问题)
        • 四、Git Stash 避坑指南 & 核心注意事项(重中之重,必看!)
          • 场景:在 dev 分支开发新功能,写到一半,需要切换到 test 分支修紧急 Bug
        • 核心知识点速记
          • 核心概念
          • 必会核心命令(按优先级排序)
          • 两大避坑重点
          • 核心区别速记
            • 小剧场分享几个好看的MD主题

        通过git add命令将工作目录的修改标记为“准备提交”:

        # 添加单个文件
        git add file.txt
        
        # 添加所有修改的文件(不包括未跟踪的文件)
        git add .
        
        # 添加特定类型的文件(如所有.js文件)
        git add *.js
        

        功能:将修改存入暂存区,但不会立即创建提交记录。 注意:未跟踪的文件需先用git add添加才能暂存。

        误将文件添加到暂存区时,可通过以下命令撤销:

        # 取消单个文件的暂存
        git restore --staged file.txt
        
        # 取消所有文件的暂存
        git restore --staged .
        

        功能:将文件从暂存区移回工作目录,保留修改内容。

        git stash (中文常翻译为储藏 / 暂存 / 暂存搁置) 是 Git 中极其常用的命令,核心核心作用

        临时「储藏 / 保存」工作区 + 暂存区 中所有未提交的修改内容,让你的工作区和暂存区立刻恢复到「干净状态」(和最近一次 commit 完全一致) ,且不会丢弃任何修改。

        这是使用 git stash黄金场景,遇到以下情况无脑用即可,也是工作中 99% 的使用场景:

        1. 正在当前分支开发新功能 / 改 Bug,突然需要切换到其他分支(比如 test/release)处理紧急问题;
        2. 当前分支的代码改了一半、还没写完、无法提交(提交不完整的代码会污染分支提交记录);
        3. 切换分支前,Git 强制要求「工作区干净」,否则会提示冲突或无法切换。

        简单说:想切分支、代码没写完、不想提交 → 用 git stash 就对了!

        所有命令按「使用频率从高到低」排序,优先掌握前 5 个即可满足 90% 的开发需求,推荐死记硬背 + 熟练使用

        1. 核心存储:git stash / git stash push

        # 方式1:最简写法(推荐,工作中99%用这个)
        git stash
        
        # 方式2:保存修改并添加描述信息
        git stash save "描述信息"
        
        # 方式3:完整写法(和上面等价,push 可以省略) 
        git stash push
        

        功能:把「工作区 + 暂存区」的所有未提交修改,临时保存到 Git 的「储藏栈」,工作区立刻变干净,所有修改被隐藏。

        2. 带备注存储:git stash push -m "备注信息" 【强烈推荐】

        git stash push -m "首页轮播图样式修改-未完成" 
        
        git stash push -m "订单模块bug修复-待测试"
        

        功能:和 git stash 功能一致,唯一区别是给本次储藏添加「自定义备注」

        为什么强烈推荐?当你多次 git stash 后,会有多个储藏记录,带备注能一眼区分每个储藏对应的修改内容,不会混淆,避免后续恢复错代码!

        3. 查看所有储藏记录:git stash list

        git stash list
        

        功能:查看 Git 储藏栈中所有的临时存储记录,输出格式如下:

        stash@{0}: On dev: 搜索框样式优化-未完成 
        stash@{1}: On dev: 筛选条单选失效问题修复-待测试 
        
        • 储藏栈是「后进先出」的结构(栈结构):最新的储藏记录排在最上面,编号 stash@{0}
        • 每个记录包含:编号、所属分支、自定义备注。

        4. 恢复储藏的修改:git stash pop 【最常用恢复方式】

        # 恢复「最新的储藏记录」(stash@{0}),恢复后自动删除这条储藏记录 
        git stash pop 
        
        # 恢复「指定编号」的储藏记录,恢复后自动删除该记录 
        git stash pop stash@{1}
        
        • 核心功能将储藏的修改恢复到当前工作区,恢复后代码和你 stash 之前完全一致(工作区 + 暂存区的修改都回来)。
        • 关键特性pop = 「恢复 + 删除」,恢复后这条储藏记录就从栈中消失了,适合确认只恢复一次的场景

        5. 恢复储藏的修改:git stash apply 【备选恢复方式】

        # 恢复最新的储藏记录(stash@{0}),恢复后「不删除」这条储藏记录
        git stash apply
        
        # 恢复指定编号的储藏记录,恢复后「不删除」该记录
        git stash apply stash@{1}
        
        • 核心功能:和 git stash pop 几乎一样,都是把储藏的修改恢复到工作区。
        • 关键区别apply = 「只恢复,不删除」,恢复后这条储藏记录依然保存在栈中,适合需要多次恢复同一份修改的场景

        重点区分:git stash pop vs git stash apply(必考必用)

        这两个命令是最容易混淆的,记住核心差异只有一个是否删除储藏记录

        git stash pop:恢复 + 删除记录 → 「一次性恢复」,用完即删,推荐日常使用;

        git stash apply:只恢复,不删记录 → 「可重复恢复」,恢复后还能再次恢复这份修改,适合特殊场景。

        1. 删除指定储藏记录:git stash pop储藏编号

        # 删除最新的储藏记录
        git stash drop stash@{0}
        
        # 删除指定编号的储藏记录
        git stash drop stash@{2}
        

        功能只删除,不恢复。当你有一些无用的储藏记录,不想恢复只想清理时,用这个命令。

        2. 删除所有储藏记录:git stash clear

        git stash clear
        

        功能:清空 Git 储藏栈中的所有储藏记录,慎用执行后无法恢复被删除的记录,适合确认所有储藏都无用时的批量清理。

        3. 查看储藏的「具体修改内容」:git stash show

        # 查看最新储藏的「文件变更列表」(只显示文件名+增删行数) 
        git stash show
        
        # 查看最新储藏的「完整diff详情」(显示具体修改的代码行,推荐) 
        git stash show -p
        
        # 查看指定编号储藏的完整diff详情
        git stash show -p stash@{1}
        

        功能:在恢复储藏前,想先看看这份储藏里具体改了哪些代码,避免恢复错内容时,用这个命令,-p 参数是核心(patch 补丁模式),能看到完整的代码修改。

        1. 储藏「未追踪的新文件」:git stash -u / git stash --include-untracked

        git stash -u
        # 等价写法
        git stash --include-untracked
        

        重要特性补充默认的 git stash 只会储藏「已追踪的文件」(已经被 Git 管理的文件,比如之前 commit 过的文件),对于工作区中新建的、从未被 git add 过的新文件(未追踪文件) ,默认不会被储藏。

        -u 参数后:会把「已追踪文件的修改 + 未追踪的新文件」一起储藏,工作区彻底干净,连新文件都被隐藏了。

        5. 储藏「忽略的文件」:git stash -a / git stash --all

        git stash -a
        # 等价写法
        git stash --all
        

        功能:最强的储藏命令,会储藏「已追踪文件修改 + 未追踪新文件 + .gitignore 中忽略的文件」(比如 node_modules、dist 等),适合需要完全清空工作区的场景,日常开发很少用,特殊场景(比如切换分支前彻底清理)可用。

        这部分是最容易踩坑的地方,很多人用 stash 出问题,都是因为没注意这些规则,全部记住,能避开 99% 的坑!

        ✅ 注意 1:git stash 不会储藏的内容(默认行为)

        默认执行 git stash 时,以下内容绝对不会被储藏,会原封不动留在工作区:

        • 从未被 Git 追踪过的文件(新建的、没执行过 git add 的文件);
        • .gitignore 忽略的文件(比如依赖包、打包产物、日志文件);
        • 已经提交到版本库的文件(只会处理「未提交」的修改)。

        ✅ 解决办法:需要储藏未追踪文件用 git stash -u,需要储藏忽略文件用 git stash -a。

        ✅ 注意 2:stash 的恢复与「分支无关」,但有最佳实践

        很多人误以为「在哪个分支 stash,就只能在哪个分支恢复」,这个认知是错误的!

        真相:Git 的 stash 是「全局的」,储藏的是「文件的修改内容」,不是和分支绑定的,你可以在 dev 分支 stash,然后切换到 test 分支恢复。

        最佳实践:尽量在哪个分支储藏,就在哪个分支恢复!

        原因:不同分支的代码差异可能很大,跨分支恢复 stash 大概率会触发「代码冲突」,处理冲突会增加不必要的麻烦,除非你明确知道两份代码无冲突。

        ✅ 注意 3:储藏记录的「生命周期」

        储藏记录不是永久保存的,它是「临时缓存」,以下操作会删除储藏记录:

        • 执行 git stash pop 编号:恢复后自动删除该记录;
        • 执行 git stash drop 编号:手动删除该记录;
        • 执行 git stash clear:删除所有记录;
        • 仓库被删除 / 迁移:储藏记录会跟着仓库消失(不会同步到远程仓库)。

        ✅ 注意 4:stash 无法储藏「空文件 / 空目录」

        如果你的修改只是新建了一个空文件 / 空目录,执行 git stash 不会生效,Git 会提示「No local changes to save」,这是 Git 的默认规则,无需处理。

        ✅ 五、Git Stash 完整工作流程演示(工作中最常用,直接套用)

        给你一套完整的「标准流程」,遇到「代码没写完要切分支」的场景,直接按步骤执行即可,零错误、零踩坑,这是工作中最经典的用法:

        # 步骤1:当前在 dev 分支,代码没写完,带备注储藏所有修改(推荐带-m)
        git stash push -m "dev-个人中心模块开发-未完成"
        
        # 步骤2:查看储藏记录,确认储藏成功(可选,养成好习惯)
        git stash list
        
        # 步骤3:切换到目标分支(此时工作区干净,切换无任何问题)
        git checkout test
        
        # 步骤4:在 test 分支修复 Bug,完成后正常提交
        git add . git commit -m "test-修复订单支付失败bug"
        
        # 步骤5:切回原分支
        dev git checkout dev
        
        # 步骤6:恢复之前储藏的未完成代码(推荐用pop,恢复后删除记录)
        git stash pop
        
        # 步骤7:继续开发未完成的功能即可,代码和之前完全一致 ✔️
        

        1. git stash:临时保存未提交修改,让工作区变干净,核心场景「代码没写完要切分支」;
        2. stash 是「栈结构」,后进先出,最新的记录是 stash@{0}。

        1. 储藏:git stash push -m "备注" (带备注,推荐首选)
        2. 查看:git stash list
        3. 恢复:git stash pop (恢复 + 删除,日常首选) / git stash apply(恢复不删除,备选)
        4. 删除:git stash drop 编号(删指定) / git stash clear(删全部)
        5. 查看修改:git stash show -p

        1. 默认不储藏「未追踪文件」和「忽略文件」,需要则加 -u / -a
        2. 尽量「同分支储藏、同分支恢复」,避免跨分支冲突。

        git stash pop → 恢复 + 删记录;git stash apply → 恢复不删记录。

        • qklhk-chocolate
        • scrolls-light
        • Chinese-red
        • nico
        • devui-blue
        • z-blue
        • yu

        以上就是一文详解Git的暂存与stash功能的详细内容,更多关于Git暂存与stash操作的资料请关注风君子博客其它相关文章!

        您可能感兴趣的文章:

        • git stash 暂存命令操作
        • IDEA:Git stash 暂存分支修改的实现代码
        • intellij idea使用git stash暂存一次提交的操作
        • git stash暂存的操作方法

        站内搜索