git stash临时保存相关 操作详解

一、Git Stash 工作原理

假设当前状态:

复制代码
工作区(Working Tree)
    ↓ git add
暂存区(Index)
    ↓ git commit
本地仓库(Repository)

执行:

复制代码
git stash

实际上:

复制代码
工作区修改
     +
暂存区修改
     ↓
保存到 stash 栈
     ↓
工作区恢复干净

类似:

复制代码
开发到一半
    ↓
放进保险箱(stash)
    ↓
处理其它事情
    ↓
再拿出来继续开发

二、查看当前状态

查看修改

复制代码
git status

例如:

复制代码
modified: main.go
modified: config.yaml

查看差异

复制代码
git diff

查看未 add 的内容。


查看已 add 内容

复制代码
git diff --cached

三、保存当前修改

1、最常用

复制代码
git stash

等价于:

复制代码
git stash push

输出:

复制代码
Saved working directory and index state

此时:

复制代码
git status

显示:

复制代码
nothing to commit, working tree clean

2、添加备注

生产环境推荐:

复制代码
git stash push -m "开发用户登录功能50%"

查看:

复制代码
git stash list

结果:

复制代码
stash@{0}: On dev: 开发用户登录功能50%

四、查看 Stash 列表

复制代码
git stash list

示例:

复制代码
stash@{0}: On master: 修复订单接口
stash@{1}: On dev: Kafka优化
stash@{2}: On test: MySQL监控

说明:

复制代码
stash@{0}
最新

stash@{1}
次新

stash@{2}
更早

五、查看 Stash 内容

查看最近一次:

复制代码
git stash show

结果:

复制代码
main.go | 12 +++++---

查看详细差异:

复制代码
git stash show -p

或者:

复制代码
git stash show -p stash@{0}

六、恢复 Stash


方法1:apply

恢复但不删除

复制代码
git stash apply

恢复:

复制代码
stash@{0}

内容。


恢复指定:

复制代码
git stash apply stash@{1}

恢复后:

复制代码
stash 仍然存在

查看:

复制代码
git stash list

还能看到。


方法2:pop

恢复并删除

复制代码
git stash pop

等价:

复制代码
git stash apply
git stash drop

恢复后:

复制代码
stash@{0}
被删除

七、删除 Stash

删除指定:

复制代码
git stash drop stash@{0}

例如:

复制代码
git stash drop stash@{2}

删除全部:

复制代码
git stash clear

危险:

复制代码
所有 stash 全部删除
无法恢复

八、只保存未提交文件

默认:

复制代码
git stash

不会保存:

复制代码
untracked 文件

例如:

复制代码
touch test.log

状态:

复制代码
git status

Untracked files:
    test.log

执行:

复制代码
git stash

后:

复制代码
test.log 还在

保存未跟踪文件:

复制代码
git stash -u

复制代码
git stash --include-untracked

效果:

复制代码
已跟踪文件
+
未跟踪文件

全部进入 stash。


九、保存所有文件(包括忽略文件)

例如:

复制代码
.log
.cache
.tmp

.gitignore 中。

普通 stash 不处理。

使用:

复制代码
git stash -a

或者:

复制代码
git stash --all

会保存:

复制代码
tracked
untracked
ignored

全部内容。


十、只保存部分文件

例如:

复制代码
main.go
config.yaml
test.go

只想保存:

复制代码
main.go

执行:

复制代码
git stash push main.go

或:

复制代码
git stash push main.go config.yaml

Git 新版本支持:

复制代码
git stash push -- main.go

十一、交互式保存

只保存部分代码块:

复制代码
git stash -p

出现:

复制代码
Stash this hunk?

选项:

复制代码
y 保存
n 跳过
q 退出

类似:

复制代码
git add -p

十二、创建新分支恢复

开发中常见:

复制代码
master

开发一半:

复制代码
git stash

后来发现:

复制代码
应该在新分支开发

执行:

复制代码
git stash branch feature-login

效果:

复制代码
创建新分支
切换过去
恢复 stash
删除 stash

等价:

复制代码
git checkout -b feature-login
git stash pop

十三、解决冲突

场景:

复制代码
stash中的代码

复制代码
当前分支代码

发生冲突。

执行:

复制代码
git stash pop

提示:

复制代码
CONFLICT (content)

查看:

复制代码
git status

both modified

手动解决:

复制代码
vim xxx.go

然后:

复制代码
git add .
git commit

十四、典型工作流

场景1:开发中紧急修 Bug

当前:

复制代码
git status

main.go 修改中

保存:

复制代码
git stash push -m "登录功能开发50%"

切换:

复制代码
git checkout master

修复:

复制代码
git commit

回到开发分支:

复制代码
git checkout dev

恢复:

复制代码
git stash pop

继续开发。


场景2:拉取代码前保存修改

复制代码
git stash
git pull
git stash pop

场景3:切换分支

复制代码
git stash
git checkout release

完成后:

复制代码
git checkout dev
git stash pop

十五、企业级常用命令速查表

复制代码
# 保存当前修改
git stash

# 保存并备注
git stash push -m "xxx"

# 查看列表
git stash list

# 查看内容
git stash show -p stash@{0}

# 恢复
git stash apply

# 恢复指定
git stash apply stash@{1}

# 恢复并删除
git stash pop

# 删除指定
git stash drop stash@{0}

# 删除全部
git stash clear

# 包含未跟踪文件
git stash -u

# 包含忽略文件
git stash -a

# 创建分支恢复
git stash branch feature_xxx

# 交互式保存
git stash -p

一张图理解

复制代码
             git stash
┌──────────────────────────┐
│ 工作区修改                │
│ 暂存区修改                │
└──────────┬───────────────┘
           │
           ▼
      stash 栈保存
           │
           ▼
 工作区恢复干净(clean)

           │
           ▼
     git stash pop

           │
           ▼
 恢复到原来的开发状态

在实际开发中,最常用的三个命令通常是:

复制代码
git stash push -m "功能开发50%"
git stash list
git stash pop

这三条命令基本覆盖了 90% 以上的日常使用场景。