学习前提

理解未提交改动、分支切换和冲突处理。

使用Git 2.35+与Bash兼容终端(Windows可用Git Bash)。每章完整代码都会创建独立临时目录;仅在练习仓库运行。git config仅修改该仓库,示例身份不是你的真实提交身份。临时目录不会自动删除,可在完成后自行清理。

本课完成后你能做什么

保存未完成工作,并在恢复核对后移除临时记录。

先理解机制

stash用于临时收起工作区和暂存区的修改,便于处理另一项任务。它是本地临时机制,不会像分支提交一样随普通push同步给同事。长期工作宜使用有说明的分支和提交。

默认stash不包括未跟踪文件;-u把它们也纳入,忽略文件仍不包含在内。暂存与未暂存的区分若需恢复,要理解apply --index的额外作用。

apply恢复但保留记录,pop在成功恢复后尝试移除记录。本课采用apply、核对、drop三步,使清理发生在你确认内容正确之后;恢复也可能冲突。

可运行示例

lab=$(mktemp -d)
cd "$lab"
git init -b main .
git config user.name "Honeysuck Learner"
git config user.email 'learner'@'example.invalid'
git config commit.gpgsign false
git config core.autocrlf false
printf 'Start learning\n' > notes.txt
git add notes.txt
git commit -m "Start learning notes"
printf 'Unfinished chapter\n' >> notes.txt
printf 'Outline\n' > outline.txt
git stash push -u -m "Draft chapter and outline"
git stash list
git status --short
git stash show -u --stat 'stash@{0}'
git stash apply 'stash@{0}'
cat notes.txt
cat outline.txt
# Verify both files above before removing the saved entry.
git stash drop 'stash@{0}'
git status --short

推演与验证

保存后工作区干净;apply后notes.txt修改和未跟踪outline.txt重新出现。drop只清理stash记录,不会删除已恢复的工作文件。

常见错误与边界

不要把stash当成秘密存储或唯一备份。drop前先确认记录编号和文件内容;stash编号会随着新增和删除变化。

动手练习

去掉-u重跑,观察outline.txt在保存后是否还在。

参考解法与理由

未跟踪outline.txt仍留在工作区;只有已跟踪notes.txt的修改被收起。这解释了为什么未跟踪文件可能继续阻止切换。

进一步阅读