Git School · FluxGit

Git恢复点与手动stash

FluxGit ·

这些代码块对应不同情况,不是一个完整脚本。请选择适合仓库的情况,并替换分支名、路径和VERIFIED_COMMIT。中止命令只适用于对应的正在进行的操作,不要执行两种备选方案。

简短答案

FluxGit恢复点记录受覆盖历史操作的状态。手动stash把本地修改暂时保存起来供以后使用,这是另一套流程。

示例与前提

G12教程在tracked文件有待处理修改时切换分支。除非明确包含,untracked文件会继续留在目录中。

修改前检查状态

检查git status --short和git diff。切换前决定保存哪些内容;干净的工作目录并不等于永久备份。

git status --short
git diff

保留引用或独立检出

创建带有明确消息的手动stash。git stash push保存tracked修改;只有需要包含untracked文件时才使用-u。

git stash push -m "school/manual-before-switch"
git stash list

第一种操作

检查git stash list,然后切换到目标分支。回来后,在应用所选条目之前重新检查上下文。

git switch target-branch

有意选择另一种结果

git stash apply保留条目。git stash pop只有在应用成功后才删除条目;出现冲突时条目仍被保留。

git stash show --patch 'stash@{0}'
git stash apply 'stash@{0}'

限制与例外

自动恢复点覆盖受保护路径中的reset、rebase、cherry-pick、revert和merge。discard与clean不会创建通用的Flux restore point。

冲突与清理

出现冲突时,检查文件并明确解决。不要反复运行pop,也不要为了隐藏待处理状态而删除条目。

验证结果

应用stash后核对文件、索引和测试。只有确认所需工作已被保存,才删除相应条目。

git status --short
git diff
git diff --cached

常见问题

stash不会随着push自动发布,也不能代替备份。恢复依赖相关本地状态仍然存在。

在FluxGit中审查操作

Safety Timeline汇集reflog移动、风险与恢复点。恢复点数据保持在本地;使用每项操作专属的预览和恢复上下文。

Git官方文档

Git School · 1:51

工作未完成时切换Git分支:直观讲解git stash

用git stash保存已跟踪的修改并命名,切换分支,回来后用pop恢复。讲解为什么未跟踪文件仍然保留,以及apply和成功的pop之间的区别,并介绍终端命令。

工作未完成时切换Git分支:直观讲解git stash
旁白为英语。YouTube提供11种语言的手动字幕。此文字稿为简体中文。

在YouTube观看 — 在新标签页打开

在测试仓库中录制。英语旁白,简体中文字幕。

阅读旁白文字稿
  1. 00:03 你正在修改代码,却需要马上查看另一个分支。工作还没准备好提交,你也不想丢失它。
  2. 00:12 这是app.py中尚未完成的修改。
  3. 00:19 stash会暂存已跟踪的修改。这里它保存app.py的修改,并从工作文件夹中移除该修改。未跟踪的文件仍留在磁盘上。pop成功后会恢复修改,并删除对应的stash条目。
  4. 00:36 选择Stash current changes,起一个之后能认出来的名字。
  5. 00:48 切换到另一个分支。已跟踪的修改已存入stash。未跟踪的文件仍在文件夹中。
  6. 00:58 那边处理完了,回到main。
  7. 01:05 对stash执行pop。修改回到了app.py,stash也消失了。
  8. 01:15 apply还是pop?apply会恢复修改并保留stash条目。pop仅在修改成功应用后删除条目。如果出现冲突,stash会保留。
  9. 01:29 在终端中:执行带消息的git stash push,切换分支再回来,然后执行git stash pop。
  10. 01:37 总结:未完成的工作放在架子上,不要塞进一个未完成的提交。下一课:在拉取请求之前整理提交。

相关操作

下载FluxGit