文档教程知识库【免费下载链接】til:memo: Today I Learned项目地址https://gitcode.com/gh_mirrors/ti/til点击查看免费下载在日常开发中git stash常被用来暂存尚未完成的工作以便在分支切换、变基rebase或拉取远端更新时保持工作区干净。但当 stash 列表越积越长、里面存放的改动早已失去价值时逐个删除既繁琐又低效。本篇指南以 til 仓库中的 clear-entries-from-git-stash.md 为核心完整讲解如何通过git stash list、git show stash{n}核查 stash 内容用git stash drop stash{n}精准删除单条记录以及用git stash clear一次性清空整个 stash 列表并附带误清空后的恢复思路与同仓库相关笔记索引。读完本文你将掌握 stash 从创建、查看、定向删除到整体清空的完整操作链路。一、什么时候会积累下一堆无用 stash在开发流程中stash 的典型产生时机包括切换分支前工作区有未完成的改动又不想提交半成品先git stash暂存变基或合并前执行git rebase、git pull之前把本地改动暂时移开调试其他问题临时放下当前任务转向修复另一个 Bug 或验证某个实验性改动。大多数情况下这些 stash 会在几分钟后被git stash pop恢复。但正如原文档指出的有时这些被暂存的改动会被时间遗忘sometimes these stashed changes are abandoned to time——它们静静地躺在 stash 列表里既没有价值又干扰视线甚至占据本不该占据的存储空间。值得留意的是git stash默认只暂存已跟踪文件的改动。若想一并暂存未跟踪文件可使用--include-untracked若连.gitignore忽略的文件也要纳入则用--all。仓库中的 stash-everything.md 记录了一个真实教训作者对包含node_modules的目录执行带--all的 stash命令卡了约 10 秒把整个依赖目录都塞进了 stash。这也是 stash 条目容易快速膨胀、最终需要整体清理的诱因之一。二、清空前先看清家底git stash list与git show stash{n}在决定全部清空之前务必先确认 stash 列表里到底有什么。原文档给出的核查路径分两步第一步列出所有 stash 条目$ git stash list stash{0}: WIP on master: 6766419 Add link to source for latest TIL stash{1}: On master: made some changes stash{2}: WIP on develop: 1a2b3c4 Fix typo in README # ... 共 9 条每条记录都以stash{n}形式引用stash{0}是最新的一条序号随创建时间递减。默认情况下Git 会用当前分支名 最近一次提交的 SHA 及其首行提交信息作为条目描述例如上例中的WIP on master: 6766419 Add link to source for latest TIL。这种自动生成的上下文通常比较模糊如果希望日后能快速识别可以在创建时用-m自定义消息$ git stash push -m made some changes自定义后列表会显示为On master: made some changes可读性大幅提升。更详细的写法见仓库中的 include-a-message-with-your-stashed-changes.md。第二步逐条查看具体改动内容$ git show stash{0} $ git show stash{1}git show会把指定 stash 条目对应的完整补丁diff输出出来帮助你判断里面到底是值得保留的代码还是早已废弃的实验改动。原文档作者正是这样检查了最新的两条stash{0}与stash{1}确认没有一条是我在意的才决定走全清路线。补充技巧git stash show是 Git 内置的、更省敲击的查看方式可以不带花括号引用直接写序号例如git stash show 1等价于查看stash{1}省略序号则默认展示最新的stash{0}。仓库中的 show-what-is-in-a-stash.md 对此有专门说明。如果想从某个 stash 中单独捞回某一个文件还可以用git checkout stash{1} -- README.md这类写法详见 grab-a-single-file-from-a-stash.md——也就是说在整体清空之前你可以先把仍需要的文件从 stash 里抢救出来。三、只删一条git stash drop stash{n}如果核对后发现只有少数几条是废弃物不必动刀全部清空。Git 提供了精准删除单条 stash 的命令$ git stash drop stash{0}执行后stash{0}会从列表中移除其余条目的编号自动前移原stash{1}变为新的stash{0}。这在原文档中被描述为我可以去掉那些单独的条目I can get rid of those individual entries with, say,git stash drop stash{0}。由于编号是动态前移的连续删除时建议每次重新git stash list核对当前编号避免误删。四、一键清空git stash clear当确认 stash 列表里没有任何值得保留的条目时逐个drop就显得低效了。此时直接清空整个列表$ git stash clear命令执行后不会有任何成功提示。再次运行git stash list会看到输出为空——这正是原文档记录的最终效果Now when I rungit stash list, I see nothing.git stash clear与git stash drop的核心区别在于作用范围命令作用范围典型场景git stash drop stash{n}只删除指定的一条 stash列表里仅少数几条作废git stash clear删除列表中的全部stash 条目确认所有条目都已无价值一次性清场从 Git 的存储模型看stash 条目本质上是挂在refs/stash引用下的提交对象commit object。git stash clear的作用是移除这个引用对全部条目对象的指向而不是逐个提交执行 drop。因此它的操作不可逆没有确认提示执行前必须确认列表内容被清空后如果你仍然记得某个 stash 对应的提交 SHA且该提交对象尚未被垃圾回收git gc从实现原理上可以推断它仍有机会通过git fsck等底层对象排查手段找回——但这属于亡羊补牢式的恢复手段日常最佳实践仍是清空前三思先git stash list逐条核对对仍有价值的条目先git stash show导出补丁、或用git checkout stash{n} -- file抢救出需要的文件再执行clear。如果担心误操作更稳妥的做法是为确有保留价值的 stash 打上可读性强的自定义消息git stash push -m ...并在列表较长时定期用git stash drop只清理过期条目把git stash clear留给确认整条列表皆可废弃的场合。五、相关阅读与进一步探索stash 的完整命令族不止存、取、删同仓库的 git 目录下还有多篇相关笔记可以串联学习stash-everything.md--include-untracked与--all的边界以及误 stash 整个node_modules的真实案例include-a-message-with-your-stashed-changes.md用-m为 stash 添加可识别上下文show-what-is-in-a-stash.mdgit stash show的快捷用法grab-a-single-file-from-a-stash.md用git checkout stash{n} -- file从 stash 中提取单个文件pick-specific-changes-to-stash.md用--patch交互式挑选要暂存的 hunkinteractively-checkout-specific-files-from-a-stash.md借助 fzf 交互式选择 stash 中的文件进行 checkoutaccessing-a-lost-commit.md通过git reflog找回丢失提交的通用思路。更完整的命令语义与边界行为可随时查阅man git-stash——这也是原文档明确给出的进一步学习入口。一句话总结git stash list摸清家底 →git stash show stash{n}逐条甄别 →git stash drop stash{n}定点删除 → 确认全部无用后git stash clear一键清场。清空操作不可逆动手前务必做好核对与必要的文件抢救。赞分享文档教程知识库【免费下载链接】til:memo: Today I Learned项目地址https://gitcode.com/gh_mirrors/ti/til点击查看免费下载相关推荐WeChatMsg 完整指南3 步把微信聊天记录免费导出、永久保存WeChatMsg 完整指南3 步把微信聊天记录免费导出、永久保存 用了五六年的微信换台手机对话就从头开始电脑一重装几年的记录说没就没。翻某条旧消息文档教程知识库Git stash机制详解临时存储与恢复的工作流程Git stash机制详解临时存储与恢复的工作流程 一、痛点与解决方案为什么需要stash 你是否曾遇到这样的场景正在开发新功能时突然收到紧急bug修复版本控制开发工具CLIgsd-core 中 Executor 的 git stash 禁令worktree 隔离模式下的共享 refs/stash 隐患与安全替代方案gsd core 中 Executor 的 git stash 禁令worktree 隔离模式下的共享 refs/stash 隐患与安全替代方案 导读 Git上一篇GPT4Free完整指南3分钟在本地跑起OpenAI兼容大模型接口下一篇Argo Rollouts自定义部署策略基于业务指标的决策创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
阅读完成 · 觉得有帮助?