在软件开发过程中,我们经常会遇到需要暂停当前工作去处理紧急问题(如生产环境 Bug)或者切换到另一个分支进行验证的情况。如果此时工作区存在尚未完成的代码修改,我们通常不希望提交一个“半成品”的 Commit。这时,git stash 就是解决这类场景的利器,它允许我们将工作目录和暂存区的状态临时保存到一个栈中,实现干净的工作区。
本文将聚焦于 git stash 的压栈(Push)与弹出/应用(Pop/Apply)操作。
1. Git Stash 简介
git stash 会将你的工作目录中所有已跟踪文件的修改和暂存区中的修改保存起来,然后将工作区恢复到 HEAD 提交时的状态。这就像是把你的所有临时改动打包,放在一个看不见的地方。
2. 操作实战:临时保存代码
步骤一:创建并观察脏工作区
我们首先初始化一个 Git 仓库,并模拟一些未完成的修改。
git init
echo "Initial setup" > index.js
git add .
git commit -m "Initial commit"
# 模拟未完成的实验性代码
echo "// Feature A implementation - unfinished" >> index.js
echo "Temp file for testing" > temp.txt
git status
输出会显示 index.js 被修改,temp.txt 是未跟踪文件。
步骤二:使用 stash push 压栈
要临时保存这些修改,我们使用 git stash push。推荐加上 -m 选项来添加描述信息,便于后续查找。
# -u 选项表示同时包含 Untracked (未跟踪) 文件,如果你只想保存已跟踪文件的修改,可以省略 -u。
git stash push -u -m "WIP: Experimental Feature A before hotfix"
git status
执行后,工作区会变得干净(nothing to commit, working tree clean)。Git 已经将你的修改保存到了 Stash 堆栈中。
步骤三:查看 Stash 列表
随时可以使用 git stash list 来查看当前保存的所有 Stash 记录。
git stash list
输出示例:
stash@{0}: On master: WIP: Experimental Feature A before hotfix
3. 恢复代码:Pop 与 Apply 的区别
当你完成了紧急任务或切换回原来的分支后,你需要将保存的代码恢复到工作区。
方式一:恢复并清除(Pop)
git stash pop 是最常用的方法。它执行两个动作:将 Stash 堆栈中最顶层的修改(stash@{0})恢复到工作区,然后删除该 Stash 记录。
# 恢复最近的一次 stash (即 stash@{0})
git stash pop
# 恢复后,再次查看列表,该记录已被移除
git stash list
方式二:恢复但不清除(Apply)
如果你希望将同一个 Stash 应用到多个分支,或者担心恢复出错需要保留备份,可以使用 git stash apply。
apply 只恢复工作区,但保留 Stash 记录在堆栈中。
# 假设我们有多个 stash,我们想恢复编号为 1 的记录
git stash apply stash@{1}
# 恢复后,记录依然存在于列表中
git stash list
步骤四:清理 Stash 记录
如果使用了 apply 方式恢复,并且确定不再需要该 Stash 记录,应当手动清理,防止堆栈过多。
# 清理堆栈中编号为 1 的记录
git stash drop stash@{1}
# 清理所有 stash 记录(慎用)
git stash clear
总结
git stash 是 Git 提供的极其强大的上下文切换工具。记住 push 压栈保存,pop 恢复并删除,apply 恢复但保留,以及 drop 手动清理。
汤不热吧