储藏更改(git stash)
什么是 git stash
git stash 是 Git 提供的一个实用命令,它允许开发者临时保存当前工作目录和暂存区的修改,而无需提交这些更改。这个功能特别适用于需要快速切换分支但又不想提交未完成工作的情况。
当执行 git stash
命令时,Git 会:
- 保存工作目录中的所有已跟踪文件的修改
- 保存暂存区中的更改
- 将工作区和暂存区恢复到最近一次提交的状态
基本用法
最简单的 stash 命令不需要任何参数:
git stash
这会创建一个新的 stash 条目,并将工作区和暂存区恢复到干净状态。Git 会自动为每个 stash 条目生成一个描述信息,如 WIP on master: 5d2f3e5 Initial commit
。
如果想添加自定义消息以便更好地识别 stash 内容,可以使用:
git stash save "正在开发登录功能"
查看 stash 列表
要查看当前所有的 stash 条目,使用:
git stash list
输出类似于:
stash@{0}: On master: 正在开发登录功能
stash@{1}: WIP on feature-branch: 8a7d6f5 添加用户模型
每个 stash 条目都有一个索引(如 stash@{0}
)和关联的描述信息。
恢复 stash
有几种方法可以恢复 stash 的内容:
-
恢复最新的 stash 并保留它在 stash 列表中:
git stash apply
-
恢复指定的 stash(通过索引):
git stash apply stash@{1}
-
恢复最新的 stash 并从 stash 列表中删除它:
git stash pop
删除 stash
如果不再需要某些 stash 条目,可以删除它们:
-
删除最新的 stash:
git stash drop
-
删除指定的 stash:
git stash drop stash@{1}
-
删除所有 stash:
git stash clear
高级用法
只 stash 未暂存的更改
默认情况下,git stash
会保存工作区和暂存区的所有更改。如果只想 stash 工作区的更改(不包括暂存区的更改),可以使用:
git stash save --keep-index
包含未跟踪文件
默认情况下,git stash
不会保存未跟踪的文件。要包含未跟踪文件,使用:
git stash save --include-untracked
或者简写:
git stash -u
创建分支并应用 stash
有时直接应用 stash 可能会导致冲突。这时可以基于 stash 创建一个新分支:
git stash branch new-branch-name stash@{1}
这会:
- 基于 stash 创建时的提交创建一个新分支
- 切换到该分支
- 应用 stash 的更改
- 如果成功应用,则删除该 stash
实际应用示例
假设我们正在开发一个前端项目,突然需要修复一个紧急 bug:
-
当前正在修改登录页面:
// login.js function handleLogin() { // 正在开发的新功能 const rememberMe = document.getElementById('remember').checked; // 未完成的代码... }
-
需要暂存当前工作:
git stash save "登录页面记住我功能"
-
切换到修复分支:
git checkout -b hotfix/1234
-
修复 bug 并提交后,切换回原分支:
git checkout feature/login
-
恢复之前的工作:
git stash pop
解决 stash 冲突
当应用 stash 时,如果与当前工作区的修改有冲突,Git 会标记冲突文件。这时需要手动解决冲突:
-
打开冲突文件,会看到类似内容:
<<<<<<< Updated upstream const user = await getUser(); ======= const user = getCachedUser() || await getUser(); >>>>>>> Stashed changes
-
手动解决冲突后,标记为已解决:
git add conflicted-file.js
-
继续应用 stash 的其他修改(如果有):
git stash apply --index
查看 stash 内容差异
在应用 stash 前,可以先查看它的内容:
git stash show -p stash@{1}
这会显示该 stash 与创建时的提交之间的差异。
使用场景总结
- 临时保存未完成的工作以切换分支
- 尝试不同的实现方式前保存当前状态
- 将当前修改与远程分支同步前清理工作区
- 保存实验性代码而不创建不完整的提交
与其他命令结合
git stash 可以与其他 Git 命令结合使用:
# 暂存当前修改,拉取远程更新,然后恢复修改
git stash
git pull
git stash pop
# 暂存当前修改,重置到某个提交,然后恢复修改
git stash
git reset --hard HEAD~3
git stash pop
注意事项
- stash 是本地存储的,不会推送到远程仓库
- 过于频繁使用 stash 可能导致难以管理的 stash 列表
- 长期不清理的 stash 可能难以回忆其内容
- 重要修改最好还是通过常规提交保存
- 使用描述性消息有助于后期识别 stash 内容
本站部分内容来自互联网,一切版权均归源网站或源作者所有。
如果侵犯了你的权益请来信告知我们删除。邮箱:cc@cccx.cn
下一篇:DLLPlugin预编译优化