学习前提
理解未提交改动、分支切换和冲突处理。
使用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的修改被收起。这解释了为什么未跟踪文件可能继续阻止切换。