<?xml version="1.0" encoding="utf-8" standalone="yes"?><?xml-stylesheet type="text/xsl" href="https://blog.rootfly.xyz/rss.xsl"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Xiang's Blog</title><link>https://blog.rootfly.xyz/</link><description>Recent content on Xiang's Blog</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Thu, 07 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.rootfly.xyz/index.xml" rel="self" type="application/rss+xml"/><item><title>Claude Code 使用指南</title><link>https://blog.rootfly.xyz/post/claude-code-guide/</link><pubDate>Thu, 07 May 2026 00:00:00 +0000</pubDate><guid>https://blog.rootfly.xyz/post/claude-code-guide/</guid><description>Claude Code 终端 AI 编程助手的完整使用指南，涵盖安装、会话管理、权限模式、技能系统、钩子、快捷键等核心功能。</description><content:encoded><![CDATA[&lt;h2 id=&#34;一安装与启动&#34;&gt;一、安装与启动&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;9
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 安装&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;npm install -g @anthropic-ai/claude-code
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 基本用法&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;claude                    &lt;span class=&#34;c1&#34;&gt;# 进入交互式会话&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;claude &lt;span class=&#34;s2&#34;&gt;&amp;#34;帮我审查这个 PR&amp;#34;&lt;/span&gt;   &lt;span class=&#34;c1&#34;&gt;# 单次任务&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;claude -p &lt;span class=&#34;s2&#34;&gt;&amp;#34;解释这个函数&amp;#34;&lt;/span&gt;   &lt;span class=&#34;c1&#34;&gt;# 非交互模式，直接输出到 stdout&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;claude -n &amp;lt;名称&amp;gt;          &lt;span class=&#34;c1&#34;&gt;# 命名当前会话，方便后续查找&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;claude --worktree         &lt;span class=&#34;c1&#34;&gt;# 在隔离 git worktree 中启动&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;二会话管理&#34;&gt;二、会话管理&lt;/h2&gt;
&lt;p&gt;会话以 JSONL 文件存储在 &lt;code&gt;~/.claude/projects/&lt;/code&gt; 下，每个会话拥有独立的上下文窗口。&lt;/p&gt;
&lt;h3 id=&#34;21-终端命令&#34;&gt;2.1 终端命令&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;操作&lt;/th&gt;
          &lt;th&gt;命令&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;恢复最近会话&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;claude --continue&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;交互式选择会话&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;claude --resume&lt;/code&gt;（方向键选择，空格预览）&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;恢复指定会话&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;claude --resume &amp;lt;名称&amp;gt;&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;分支新会话&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;claude --continue --fork-session&lt;/code&gt;（保留历史，从旧会话分叉）&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;按 PR 恢复&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;claude --from-pr &amp;lt;编号&amp;gt;&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;22-会话内命令&#34;&gt;2.2 会话内命令&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;命令&lt;/th&gt;
          &lt;th&gt;作用&lt;/th&gt;
          &lt;th&gt;别名&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/resume [名称]&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;打开会话选择器，或切换到指定会话&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;/continue&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/clear&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;清空当前对话上下文，开启新会话&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;/reset&lt;/code&gt;、&lt;code&gt;/new&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/compact [指令]&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;压缩长对话释放上下文窗口，可选保留重点&lt;/td&gt;
          &lt;td&gt;—&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/rename [名称]&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;重命名当前会话，不传名称则自动从历史生成&lt;/td&gt;
          &lt;td&gt;—&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/branch [名称]&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;在当前点分叉出新会话&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;/fork&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/export [文件名]&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;导出当前对话为纯文本&lt;/td&gt;
          &lt;td&gt;—&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/copy [N]&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;复制最近一次 AI 回复到剪贴板，&lt;code&gt;/copy 2&lt;/code&gt; 复制倒数第二次&lt;/td&gt;
          &lt;td&gt;—&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/btw &amp;lt;问题&amp;gt;&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;快速旁提问——不记入对话历史，不消耗上下文，无工具调用&lt;/td&gt;
          &lt;td&gt;—&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/recap&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;按需生成一行会话摘要&lt;/td&gt;
          &lt;td&gt;—&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/context&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;以彩色网格可视化当前上下文占用，附优化建议&lt;/td&gt;
          &lt;td&gt;—&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/add-dir &amp;lt;路径&amp;gt;&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;动态添加会话可访问的工作目录&lt;/td&gt;
          &lt;td&gt;—&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/rewind&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;回退对话和/或代码到之前的检查点&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;/checkpoint&lt;/code&gt;、&lt;code&gt;/undo&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;会话选择器快捷键：&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;快捷键&lt;/th&gt;
          &lt;th&gt;作用&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;Ctrl+A&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;显示所有项目的会话&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;Ctrl+W&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;显示当前仓库所有 worktree 的会话&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;Ctrl+B&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;按当前 git 分支过滤&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;Ctrl+R&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;重命名高亮会话&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;Space&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;预览会话内容&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/&lt;/code&gt; 或任意可打印字符&lt;/td&gt;
          &lt;td&gt;搜索/过滤会话&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;三权限模式&#34;&gt;三、权限模式&lt;/h2&gt;
&lt;h3 id=&#34;31-六种模式&#34;&gt;3.1 六种模式&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;模式&lt;/th&gt;
          &lt;th&gt;自动批准范围&lt;/th&gt;
          &lt;th&gt;适用场景&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;default&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;仅读取&lt;/td&gt;
          &lt;td&gt;入门、敏感项目&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;acceptEdits&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;读取 + 文件编辑 + 常见文件系统操作&lt;/td&gt;
          &lt;td&gt;快速迭代同时保持审查&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;plan&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;仅读取&lt;/td&gt;
          &lt;td&gt;先探索再编码&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;auto&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;全部（分类器安全检查）&lt;/td&gt;
          &lt;td&gt;长任务、减少授权疲劳&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;dontAsk&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;仅预批准工具&lt;/td&gt;
          &lt;td&gt;CI/自动化环境&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;bypassPermissions&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;除受保护路径外全部&lt;/td&gt;
          &lt;td&gt;隔离容器/VM&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;32-切换方式&#34;&gt;3.2 切换方式&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Shift+Tab&lt;/code&gt; — 终端内循环切换模式&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/plan [描述]&lt;/code&gt; — 从提示符进入计划模式&lt;/li&gt;
&lt;li&gt;&lt;code&gt;claude --permission-mode plan&lt;/code&gt; — 启动时指定模式&lt;/li&gt;
&lt;li&gt;settings.json: &lt;code&gt;&amp;quot;permissions&amp;quot;: { &amp;quot;defaultMode&amp;quot;: &amp;quot;plan&amp;quot; }&lt;/code&gt; — 设为默认&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;四模式切换命令&#34;&gt;四、模式切换命令&lt;/h2&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;命令&lt;/th&gt;
          &lt;th&gt;作用&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/plan [描述]&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;进入计划模式（仅研究不编辑）&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/model [模型]&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;选择或切换模型，支持调整 effort 级别&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/effort [low|medium|high|xhigh|max|auto]&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;设置模型推理力度&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/fast [on|off]&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;快速模式开关（仅 Opus 4.6 可用）&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/color [颜色|default]&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;设置提示栏颜色：red/blue/green/yellow/purple/orange/pink/cyan&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/focus&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;专注视图——仅显示上次提示、工具调用摘要和最终回复（全屏模式）&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/tui [default|fullscreen]&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;切换终端 UI 渲染模式&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/voice [hold|tap|off]&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;语音输入模式&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/sandbox&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;沙盒模式开关&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;五代码与审查&#34;&gt;五、代码与审查&lt;/h2&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;命令&lt;/th&gt;
          &lt;th&gt;作用&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/review [PR]&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;拉取并审查当前分支或指定 PR&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/security-review&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;安全审查当前分支的所有待变更文件&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/diff&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;打开交互式 diff 查看器，含未提交变更和逐轮 diff&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/init&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;为当前项目自动生成 CLAUDE.md&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/simplify [关注点]&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;并发启动 3 个审查子代理审查代码质量，汇总后自动修复&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/autofix-pr [提示]&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;远程守护——监控 PR，CI 失败或有评论时自动推送修复&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/install-github-app&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;为仓库安装 Claude GitHub Actions 应用&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/pr-comments&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;查看 PR 评论&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/ultrareview [PR]&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;云端多代理深度审查（Pro/Max 免费 3 次）&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/ultraplan &amp;lt;提示&amp;gt;&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;云端起草计划，浏览器审查后执行或返回终端&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;六权限与配置&#34;&gt;六、权限与配置&lt;/h2&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;命令&lt;/th&gt;
          &lt;th&gt;作用&lt;/th&gt;
          &lt;th&gt;别名&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/permissions&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;管理工具的 allow/ask/deny 规则（交互对话框）&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;/allowed-tools&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/config&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;打开设置界面：主题、模型、输出风格、偏好&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;/settings&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/hooks&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;查看所有钩子配置（按事件分类的只读浏览器）&lt;/td&gt;
          &lt;td&gt;—&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/memory&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;编辑 CLAUDE.md 记忆文件，开关自动记忆&lt;/td&gt;
          &lt;td&gt;—&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/keybindings&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;打开或创建快捷键配置文件&lt;/td&gt;
          &lt;td&gt;—&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/skills&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;列出所有可用技能（按 &lt;code&gt;t&lt;/code&gt; 按 token 数排序）&lt;/td&gt;
          &lt;td&gt;—&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/mcp&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;管理 MCP 服务器连接与 OAuth 认证&lt;/td&gt;
          &lt;td&gt;—&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/plugin&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;管理插件&lt;/td&gt;
          &lt;td&gt;—&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/reload-plugins&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;热重载所有插件&lt;/td&gt;
          &lt;td&gt;—&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/ide&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;管理 IDE 集成状态&lt;/td&gt;
          &lt;td&gt;—&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/chrome&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;配置 Chrome 浏览器集成&lt;/td&gt;
          &lt;td&gt;—&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/remote-env&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;配置 &lt;code&gt;--remote&lt;/code&gt; 启动时的默认远程环境&lt;/td&gt;
          &lt;td&gt;—&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/terminal-setup&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;配置 Shift+Enter 键位（VS Code、Cursor、Windsurf 等）&lt;/td&gt;
          &lt;td&gt;—&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/doctor&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;诊断安装和环境问题&lt;/td&gt;
          &lt;td&gt;—&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/status&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;系统状态：版本、模型、账户、连接&lt;/td&gt;
          &lt;td&gt;—&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/login&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;登录 Anthropic 账户&lt;/td&gt;
          &lt;td&gt;—&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/logout&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;退出 Anthropic 账户&lt;/td&gt;
          &lt;td&gt;—&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/privacy-settings&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;隐私设置（Pro/Max）&lt;/td&gt;
          &lt;td&gt;—&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;七任务与调度&#34;&gt;七、任务与调度&lt;/h2&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;命令&lt;/th&gt;
          &lt;th&gt;作用&lt;/th&gt;
          &lt;th&gt;别名&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/tasks&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;查看和管理后台任务&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;/bashes&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/agents&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;管理子代理配置&lt;/td&gt;
          &lt;td&gt;—&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/loop [间隔] [命令]&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;按间隔重复执行，如 &lt;code&gt;/loop 5m check deploy&lt;/code&gt;；裸 &lt;code&gt;/loop&lt;/code&gt; 进入自主维护&lt;/td&gt;
          &lt;td&gt;—&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/schedule [描述]&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;创建/更新/列表/运行云端定时代理（routines）&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;/routines&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/usage&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;会话费用、用量限制、活动统计&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;/cost&lt;/code&gt;、&lt;code&gt;/stats&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/extra-usage&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;配置超额用量（达速率上限时启用）&lt;/td&gt;
          &lt;td&gt;—&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;71-任务task系统&#34;&gt;7.1 任务（Task）系统&lt;/h3&gt;
&lt;p&gt;Claude Code 对复杂多步任务自动创建任务列表，有四个状态：&lt;code&gt;pending&lt;/code&gt; → &lt;code&gt;in_progress&lt;/code&gt; → &lt;code&gt;completed&lt;/code&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Ctrl+T&lt;/code&gt; — 在状态栏切换显示任务列表（最多 5 条）&lt;/li&gt;
&lt;li&gt;桌面通知告知 —— &amp;ldquo;给我列一下所有任务&amp;rdquo;&lt;/li&gt;
&lt;li&gt;任务在上下文压缩后依然保留&lt;/li&gt;
&lt;li&gt;跨会话共享任务列表：&lt;code&gt;CLAUDE_CODE_TASK_LIST_ID=my-project claude&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;72-定时调度细节&#34;&gt;7.2 定时调度细节&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/loop 5m check deploy        &lt;span class=&#34;c1&#34;&gt;# 每 5 分钟检查一次&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/loop                         &lt;span class=&#34;c1&#34;&gt;# 自主维护循环（适合 CI 监控等场景）&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/loop check the PR            &lt;span class=&#34;c1&#34;&gt;# Claude 自我调节节奏&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/loop&lt;/code&gt; 只在当前会话存活期间有效，退出即终止&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/schedule&lt;/code&gt; 创建的 routine 是云端持久化的，与当前会话生命周期无关&lt;/li&gt;
&lt;li&gt;创建 &lt;code&gt;.claude/loop.md&lt;/code&gt; 可以自定义默认维护任务的提示词&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;八skills技能系统&#34;&gt;八、Skills（技能）系统&lt;/h2&gt;
&lt;p&gt;技能是扩展 Claude 能力的机制。核心优势：指令按需加载，不用的技能零成本。&lt;/p&gt;
&lt;h3 id=&#34;81-技能-vs-claudemd&#34;&gt;8.1 技能 vs CLAUDE.md&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;特性&lt;/th&gt;
          &lt;th&gt;CLAUDE.md&lt;/th&gt;
          &lt;th&gt;Skill&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;加载时机&lt;/td&gt;
          &lt;td&gt;每次对话自动全量加载&lt;/td&gt;
          &lt;td&gt;仅在调用时加载&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;适合内容&lt;/td&gt;
          &lt;td&gt;项目架构、常用命令、关键约束&lt;/td&gt;
          &lt;td&gt;专项流程、参考手册、长文档&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;调用方式&lt;/td&gt;
          &lt;td&gt;自动&lt;/td&gt;
          &lt;td&gt;用户 &lt;code&gt;/技能名&lt;/code&gt; 或 Claude 自动匹配&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;经验法则&lt;/strong&gt;：长参考文档、专项操作流程放 Skill；项目基础信息、核心约束放 CLAUDE.md。&lt;/p&gt;
&lt;h3 id=&#34;82-内置技能&#34;&gt;8.2 内置技能&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;命令&lt;/th&gt;
          &lt;th&gt;作用&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/batch &amp;lt;指令&amp;gt;&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;大规模并行修改：分解 5-30 个任务，在隔离 worktree 中并发执行，每个开 PR&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/claude-api&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;加载 Claude API 参考（Python/TS/Java/Go/Ruby/C#/PHP/curl）&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/debug [描述]&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;开启调试日志并辅助排查问题&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/fewer-permission-prompts&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;扫描历史记录，为常用只读命令生成项目 allowlist 减少授权弹窗&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/insights&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;分析使用数据生成 Claude Code 会话报告&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/simplify [关注点]&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;并发启动 3 个审查子代理审查代码质量，汇总后自动修复&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/statusline&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;配置终端状态栏&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/team-onboarding&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;根据你过去 30 天的使用历史生成团队入职指南&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/loop&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;循环执行命令&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/schedule&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;云端定时任务&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/init&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;初始化 CLAUDE.md&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/review&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;PR 审查&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/security-review&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;安全审查&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;83-创建自定义-skill&#34;&gt;8.3 创建自定义 Skill&lt;/h3&gt;
&lt;p&gt;在以下路径创建 &lt;code&gt;SKILL.md&lt;/code&gt; 文件：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;~/.claude/skills/&amp;lt;名称&amp;gt;/SKILL.md    # 个人（所有项目可用）
.claude/skills/&amp;lt;名称&amp;gt;/SKILL.md      # 项目级（可提交到仓库）
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;文件格式：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nn&#34;&gt;---&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;my-skill&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;description&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;这个技能做什么，何时使用&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;when_to_use&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;额外的触发短语&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;disable-model-invocation&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;true&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;   &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# 设为 true 则只能手动调用&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;user-invocable&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;false&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;            &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# 设为 true 则只能 Claude 自动调用&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;allowed-tools&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;Bash(git *)      &lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# 技能激活期间预批准的工具&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;model&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;sonnet                   &lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# 覆盖模型&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;effort&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;high                    &lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# 覆盖努力级别&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;context&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;fork                   &lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# 在隔离子代理中运行&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;agent: Explore                   # 配合 context&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;fork 指定子代理类型&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;paths&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;*.py&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;                    &lt;/span&gt;&lt;span class=&#34;c&#34;&gt;# 限制触发路径&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nn&#34;&gt;---&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;l&#34;&gt;技能指令内容...&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;84-技能调用与生命周期&#34;&gt;8.4 技能调用与生命周期&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;手动调用&lt;/strong&gt;：&lt;code&gt;/技能名 参数1 参数2&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自动调用&lt;/strong&gt;：Claude 根据 &lt;code&gt;description&lt;/code&gt; 字段自动匹配&lt;/li&gt;
&lt;li&gt;一旦调用，技能内容作为消息进入对话，保留整个会话&lt;/li&gt;
&lt;li&gt;上下文压缩时会保留最近一次调用（前 5000 token）&lt;/li&gt;
&lt;li&gt;技能目录被监视，编辑后即时生效无需重启&lt;/li&gt;
&lt;li&gt;支持 &lt;code&gt;!命令&lt;/code&gt; 语法在 prompt 到达 Claude 前做 shell 预处理&lt;/li&gt;
&lt;li&gt;变量替换：&lt;code&gt;$ARGUMENTS&lt;/code&gt;、&lt;code&gt;$0&lt;/code&gt;、&lt;code&gt;$1&lt;/code&gt;、&lt;code&gt;${CLAUDE_SESSION_ID}&lt;/code&gt;、&lt;code&gt;${CLAUDE_SKILL_DIR}&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;九hooks钩子系统&#34;&gt;九、Hooks（钩子）系统&lt;/h2&gt;
&lt;p&gt;钩子是用户定义的脚本/HTTP 端点/提示词/代理子进程，在特定生命周期事件时自动执行。&lt;/p&gt;
&lt;h3 id=&#34;91-所有事件一览&#34;&gt;9.1 所有事件一览&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;事件&lt;/th&gt;
          &lt;th&gt;触发时机&lt;/th&gt;
          &lt;th&gt;可阻断&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;SessionStart&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;会话开始或恢复&lt;/td&gt;
          &lt;td&gt;否&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;SessionEnd&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;会话终止&lt;/td&gt;
          &lt;td&gt;否&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;UserPromptSubmit&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;用户提交提示&lt;/td&gt;
          &lt;td&gt;是&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;UserPromptExpansion&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;斜杠命令展开为提示&lt;/td&gt;
          &lt;td&gt;是&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;PreToolUse&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;工具调用执行前&lt;/td&gt;
          &lt;td&gt;是（allow/deny/defer）&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;PostToolUse&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;工具调用成功执行后&lt;/td&gt;
          &lt;td&gt;否&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;PostToolUseFailure&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;工具调用执行失败后&lt;/td&gt;
          &lt;td&gt;否&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;PostToolBatch&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;所有并行工具调用完成后&lt;/td&gt;
          &lt;td&gt;是&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;PermissionRequest&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;权限对话框弹出时&lt;/td&gt;
          &lt;td&gt;是&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;PermissionDenied&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;auto 模式分类器拒绝工具时&lt;/td&gt;
          &lt;td&gt;否（可设重试）&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;Notification&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Claude 发送通知时&lt;/td&gt;
          &lt;td&gt;否&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;SubagentStart&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;子代理启动时&lt;/td&gt;
          &lt;td&gt;否&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;SubagentStop&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;子代理完成时&lt;/td&gt;
          &lt;td&gt;是&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;TaskCreated&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;任务创建时&lt;/td&gt;
          &lt;td&gt;是&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;TaskCompleted&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;任务标记完成时&lt;/td&gt;
          &lt;td&gt;是&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;Stop&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Claude 完成回复时&lt;/td&gt;
          &lt;td&gt;是&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;StopFailure&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;因 API 错误结束轮次时&lt;/td&gt;
          &lt;td&gt;否&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;TeammateIdle&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;队友即将空闲时&lt;/td&gt;
          &lt;td&gt;是&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;InstructionsLoaded&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;CLAUDE.md 或规则文件加载时&lt;/td&gt;
          &lt;td&gt;否&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;ConfigChange&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;会话中配置文件变更时&lt;/td&gt;
          &lt;td&gt;是&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;CwdChanged&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;工作目录变更时&lt;/td&gt;
          &lt;td&gt;否&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;FileChanged&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;被监视的文件在磁盘上变更时&lt;/td&gt;
          &lt;td&gt;否&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;WorktreeCreate&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Worktree 被创建时&lt;/td&gt;
          &lt;td&gt;是&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;WorktreeRemove&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Worktree 被删除时&lt;/td&gt;
          &lt;td&gt;否&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;PreCompact&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;上下文压缩前&lt;/td&gt;
          &lt;td&gt;是&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;PostCompact&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;上下文压缩后&lt;/td&gt;
          &lt;td&gt;否&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;Elicitation&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;MCP 服务器请求用户输入时&lt;/td&gt;
          &lt;td&gt;是&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;ElicitationResult&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;用户响应 elicitation 后&lt;/td&gt;
          &lt;td&gt;是&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;92-钩子类型&#34;&gt;9.2 钩子类型&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;类型&lt;/th&gt;
          &lt;th&gt;机制&lt;/th&gt;
          &lt;th&gt;适用场景&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;command&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Shell 命令，通过退出码和 stdout JSON 通信&lt;/td&gt;
          &lt;td&gt;本地检查、格式验证&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;http&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;POST JSON 到 HTTP 端点&lt;/td&gt;
          &lt;td&gt;外部服务集成&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;mcp_tool&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;调用已连接 MCP 服务器的工具&lt;/td&gt;
          &lt;td&gt;复用 MCP 能力&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;prompt&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;单轮 Claude 评估（yes/no 决策）&lt;/td&gt;
          &lt;td&gt;内容审查、是否放行&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;agent&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;启动子代理（有 Read/Grep/Glob 工具）&lt;/td&gt;
          &lt;td&gt;复杂前置检查（实验性）&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;93-退出码规则&#34;&gt;9.3 退出码规则&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;退出码&lt;/th&gt;
          &lt;th&gt;含义&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;成功。stdout 解析为 JSON 决策&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;2&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;阻断性错误。操作被阻止，stderr 展示给 Claude&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;其他&lt;/td&gt;
          &lt;td&gt;非阻断性错误。继续执行&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;94-配置位置&#34;&gt;9.4 配置位置&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;~/.claude/settings.json&lt;/code&gt; — 用户级&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.claude/settings.json&lt;/code&gt; — 项目级（可提交）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.claude/settings.local.json&lt;/code&gt; — 本地级（gitignore）&lt;/li&gt;
&lt;li&gt;插件 &lt;code&gt;hooks/hooks.json&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;企业托管策略设置&lt;/li&gt;
&lt;li&gt;Skill/Agent YAML 头信息&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;查看所有钩子：&lt;code&gt;/hooks&lt;/code&gt;。&lt;/p&gt;
&lt;h3 id=&#34;95-典型用法&#34;&gt;9.5 典型用法&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;桌面通知钩子&lt;/strong&gt;（&lt;code&gt;~/.claude/settings.json&lt;/code&gt;）：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;#34;hooks&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;nt&#34;&gt;&amp;#34;Notification&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nt&#34;&gt;&amp;#34;matcher&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;nt&#34;&gt;&amp;#34;hooks&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nt&#34;&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;nt&#34;&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;osascript -e &amp;#39;display notification \&amp;#34;Claude Code 需要注意\&amp;#34; with title \&amp;#34;Claude Code\&amp;#34;&amp;#39;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;      &lt;span class=&#34;p&#34;&gt;}]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;p&#34;&gt;}]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;matcher 可设：&lt;code&gt;permission_prompt&lt;/code&gt;、&lt;code&gt;idle_prompt&lt;/code&gt;、&lt;code&gt;auth_success&lt;/code&gt;、&lt;code&gt;elicitation_dialog&lt;/code&gt;。&lt;/p&gt;
&lt;h2 id=&#34;十快捷键&#34;&gt;十、快捷键&lt;/h2&gt;
&lt;h3 id=&#34;101-输入编辑&#34;&gt;10.1 输入编辑&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;快捷键&lt;/th&gt;
          &lt;th&gt;作用&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;Enter&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;提交消息（换行用 &lt;code&gt;Shift+Enter&lt;/code&gt; 或 &lt;code&gt;Alt+Enter&lt;/code&gt;）&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;Ctrl+O&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;切换详细查看器（显示思考过程）&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;Ctrl+J&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;在消息中插入换行（备选）&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;Ctrl+I&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;在消息末尾插入文件内容&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;Ctrl+K&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;将选中文字转为代码块&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;Ctrl+L&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;清空当前输入并重绘屏幕&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;Ctrl+G&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;在外部文本编辑器打开当前提示&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;Ctrl+R&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;反向搜索命令历史&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;Ctrl+C&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;取消当前输入/生成&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;Ctrl+D&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;中断正在执行的工具调用&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;Esc&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;取消当前输入&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;Esc + Esc&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;打开 rewind/checkpoint 菜单&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;102-模式与界面&#34;&gt;10.2 模式与界面&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;快捷键&lt;/th&gt;
          &lt;th&gt;作用&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;Shift+Tab&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;循环切换权限模式&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;Ctrl+E&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;打开/关闭思考模式&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;Ctrl+V&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;打开/关闭详细模式&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;Ctrl+B&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;后台运行任务（tmux 下按两次）&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;Ctrl+T&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;切换任务列表显示&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;Ctrl+S&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;保存当前对话到文件&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;Ctrl+W&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;查看当前 worktree 信息&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;Option+P&lt;/code&gt; / &lt;code&gt;Alt+P&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;切换模型&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;Option+T&lt;/code&gt; / &lt;code&gt;Alt+T&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;切换扩展思考&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;103-输入技巧&#34;&gt;10.3 输入技巧&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;快捷键/字符&lt;/th&gt;
          &lt;th&gt;作用&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;! 命令&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;直接运行 shell 命令，输出加入上下文&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;@ 文件路径&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;文件路径自动补全&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;输入 &lt;code&gt;/&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;列出所有可用斜杠命令&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;十一上下文管理&#34;&gt;十一、上下文管理&lt;/h2&gt;
&lt;h3 id=&#34;111-核心概念&#34;&gt;11.1 核心概念&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;每次对话有上下文窗口限制，超出后最早的消息会被截断&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/context&lt;/code&gt; 以彩色网格直观显示当前使用情况&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/compact&lt;/code&gt; 在会话中释放上下文（可附带保留重点的指令）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/clear&lt;/code&gt; 完全重置上下文&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;112-省上下文技巧&#34;&gt;11.2 省上下文技巧&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;长参考文档放入 Skill&lt;/strong&gt; 而非 CLAUDE.md：Skill 只在调用时加载&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;用 &lt;code&gt;/btw&lt;/code&gt; 处理临时疑问&lt;/strong&gt;：不记入对话历史&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;使用子代理处理大量查询&lt;/strong&gt;：返回摘要而非全量结果&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;定期 &lt;code&gt;/compact&lt;/code&gt;&lt;/strong&gt;：压缩已完成部分的细节，保留决策和结论&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;十二worktree工作树&#34;&gt;十二、Worktree（工作树）&lt;/h2&gt;
&lt;p&gt;在隔离的 git worktree 中工作，实验性修改不影响主工作区。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;claude --worktree feature-auth   &lt;span class=&#34;c1&#34;&gt;# 在新分支上创建隔离 worktree&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;claude --worktree bugfix-123     &lt;span class=&#34;c1&#34;&gt;# 另一个平行会话&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;claude -w                         &lt;span class=&#34;c1&#34;&gt;# 自动生成名称&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Worktree 创建在 &lt;code&gt;.claude/worktrees/&amp;lt;名称&amp;gt;/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;子代理也可使用 worktree 隔离（agent frontmatter 中 &lt;code&gt;isolation: worktree&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;退出后根据选择保留或删除&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;十三非交互headless模式&#34;&gt;十三、非交互（Headless）模式&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 单次问答&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;claude -p &lt;span class=&#34;s2&#34;&gt;&amp;#34;解释这个函数&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 管道输入&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cat errors.txt &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; claude -p &lt;span class=&#34;s2&#34;&gt;&amp;#34;找出错误原因&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 结构化输出&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;claude -p --output-format json &lt;span class=&#34;s2&#34;&gt;&amp;#34;分析 code.py 的结构&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; jq &lt;span class=&#34;s1&#34;&gt;&amp;#39;.&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 流式 JSON 输出&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;claude -p --output-format stream-json &lt;span class=&#34;s2&#34;&gt;&amp;#34;查询&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 约束 JSON Schema&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;claude -p --json-schema &lt;span class=&#34;s1&#34;&gt;&amp;#39;{&amp;#34;type&amp;#34;:&amp;#34;object&amp;#34;,...}&amp;#39;&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;分析并结构化返回&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 恢复上下文后单次执行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;claude --continue -p &lt;span class=&#34;s2&#34;&gt;&amp;#34;检查类型错误&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 无配置文件快速启动&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;claude --bare -p &lt;span class=&#34;s2&#34;&gt;&amp;#34;查询&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;十四checkpoint-与-rewind&#34;&gt;十四、Checkpoint 与 Rewind&lt;/h2&gt;
&lt;p&gt;Claude Code 自动为每一次文件编辑创建检查点。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/rewind&lt;/code&gt; 或 &lt;code&gt;Esc Esc&lt;/code&gt; — 回退对话和/或代码到之前某个检查点&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/diff&lt;/code&gt; — 查看逐轮 diff，对比每次变更&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/branch&lt;/code&gt; — 在当前点创建对话分支，保留原会话继续探索&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;十五agent-teams代理团队&#34;&gt;十五、Agent Teams（代理团队）&lt;/h2&gt;
&lt;p&gt;通过 &lt;code&gt;/config&lt;/code&gt; 启用。Claude 可并行启动多个队友（teammate）同时处理任务。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;最适合：并行代码审查、多假设验证、独立工作的并行展开&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--teammate-mode&lt;/code&gt; 控制显示方式：&lt;code&gt;in-process&lt;/code&gt;、&lt;code&gt;tmux&lt;/code&gt;、&lt;code&gt;auto&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;十六ide-与编辑器集成&#34;&gt;十六、IDE 与编辑器集成&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;VS Code / JetBrains 插件&lt;/strong&gt;：直接在 IDE 内使用全部功能，自动识别项目结构&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;Ctrl+G&lt;/code&gt;&lt;/strong&gt;：在 &lt;code&gt;$EDITOR&lt;/code&gt;/&lt;code&gt;$VISUAL&lt;/code&gt; 中打开当前提示&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Vim 模式&lt;/strong&gt;：&lt;code&gt;/config&lt;/code&gt; → 编辑器模式 → Vim（完整 vim 键位）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;macOS Option 键&lt;/strong&gt;：终端设置中启用 &amp;ldquo;将 Option 作为 Meta&amp;rdquo;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;PR 状态底部栏&lt;/strong&gt;：需要 &lt;code&gt;gh&lt;/code&gt; CLI，审查状态以彩色下划线显示&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;十七状态栏&#34;&gt;十七、状态栏&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;/statusline&lt;/code&gt; 配置终端状态栏，显示：上下文窗口使用率、git 状态、当前模型、费用等。支持自定义模板。&lt;/p&gt;
&lt;h2 id=&#34;十八账号与费用&#34;&gt;十八、账号与费用&lt;/h2&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;命令&lt;/th&gt;
          &lt;th&gt;作用&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/usage&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;会话费用、用量限制、活动统计&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/extra-usage&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;达速率上限时启用超额用量&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/login&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;登录 Anthropic 账户&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/logout&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;退出账户&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/upgrade&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;升级到更高计划套餐&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;十九常用工作流实例&#34;&gt;十九、常用工作流实例&lt;/h2&gt;
&lt;h3 id=&#34;代码审查&#34;&gt;代码审查&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;claude --resume       &lt;span class=&#34;c1&#34;&gt;# 恢复当前分支的会话&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/review               &lt;span class=&#34;c1&#34;&gt;# 审查变更&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/security-review      &lt;span class=&#34;c1&#34;&gt;# 安全审查&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;持续监控&#34;&gt;持续监控&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/loop 3m &lt;span class=&#34;s2&#34;&gt;&amp;#34;检查 CI 状态并报告结果&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 或创建云端持久化的 routine&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/schedule &lt;span class=&#34;s2&#34;&gt;&amp;#34;每天 9:00 检查 main 分支构建状态&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;大规模重构&#34;&gt;大规模重构&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/batch &lt;span class=&#34;s2&#34;&gt;&amp;#34;把所有 React class 组件改成函数组件&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;计划优先&#34;&gt;计划优先&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/plan &lt;span class=&#34;s2&#34;&gt;&amp;#34;重构认证模块，支持 OAuth2&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Claude 会先研究代码库，产出方案供你审查&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 满意后在计划模式下退出，进入编辑模式执行&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;跨会话工作&#34;&gt;跨会话工作&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 上午的工作&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;claude -n auth-refactor
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# ... 工作 ...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/exit
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 下午继续&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;claude --continue      &lt;span class=&#34;c1&#34;&gt;# 或 claude --resume auth-refactor&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;安全审查&#34;&gt;安全审查&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/security-review
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 审查所有未提交变更的安全问题&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 产生 OWASP Top 10 维度的报告&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;]]></content:encoded></item><item><title>Git 最佳实践</title><link>https://blog.rootfly.xyz/post/git-best-practices/</link><pubDate>Thu, 07 May 2026 00:00:00 +0000</pubDate><guid>https://blog.rootfly.xyz/post/git-best-practices/</guid><description>面向个人项目的 Git 工作流最佳实践，涵盖 .gitignore、分支策略、标签管理、回滚方式和日常操作速查。</description><content:encoded><![CDATA[&lt;h2 id=&#34;1-git-要解决什么问题&#34;&gt;1. Git 要解决什么问题&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;版本可追溯&lt;/strong&gt;：你能知道每次改了什么。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可回滚&lt;/strong&gt;：系统改坏了能立即回到稳定节点。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;分支隔离&lt;/strong&gt;：功能迭代不污染主线（main）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;只提交代码&lt;/strong&gt;：不把运行缓存、数据库、视频、截图、依赖目录提交进仓库（靠 &lt;code&gt;.gitignore&lt;/code&gt;）。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&#34;2-初始状态检查&#34;&gt;2. 初始状态检查&lt;/h2&gt;
&lt;p&gt;刚开始时你可能处于：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在 &lt;code&gt;main&lt;/code&gt; 分支&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;没有 commit&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;文件为 &lt;code&gt;Untracked&lt;/code&gt;（未纳入版本管理）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;下一步要做的是：
&lt;strong&gt;&lt;code&gt;.gitignore&lt;/code&gt; → &lt;code&gt;git add .&lt;/code&gt; → &lt;code&gt;git commit&lt;/code&gt; → &lt;code&gt;git tag&lt;/code&gt; → &lt;code&gt;git checkout -b&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;3-必备gitignore&#34;&gt;3. 必备：.gitignore&lt;/h2&gt;
&lt;p&gt;目的：避免提交运行产生的垃圾文件（例如构建产物、&lt;code&gt;node_modules&lt;/code&gt;、SQLite、上传视频、截图等）。&lt;/p&gt;
&lt;h3 id=&#34;31-检查-gitignore-是否生效&#34;&gt;3.1 检查 &lt;code&gt;.gitignore&lt;/code&gt; 是否生效&lt;/h3&gt;
&lt;p&gt;在项目根目录执行：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git status
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;你不应该看到这些被 Git 追踪：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;node_modules/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.next/&lt;/code&gt; 或其他构建产物目录&lt;/li&gt;
&lt;li&gt;数据库/上传/截图等运行时数据目录&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;32-如果发现上述目录出现在-status-里被追踪了&#34;&gt;3.2 如果发现上述目录出现在 status 里（被追踪了）&lt;/h3&gt;
&lt;p&gt;说明这些文件可能在 &lt;code&gt;.gitignore&lt;/code&gt; 生效之前已经被 Git 记录过。用下面命令&amp;quot;从 Git 里移除追踪，但保留本地文件&amp;quot;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git rm -r --cached node_modules .next data &lt;span class=&#34;o&#34;&gt;||&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git add .
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git commit -m &lt;span class=&#34;s2&#34;&gt;&amp;#34;chore: stop tracking generated/runtime files&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;4-建立第一个稳定节点baseline-checkpoint&#34;&gt;4. 建立第一个&amp;quot;稳定节点&amp;quot;（baseline checkpoint）&lt;/h2&gt;
&lt;h3 id=&#34;41-初始化仓库若还没执行过&#34;&gt;4.1 初始化仓库（若还没执行过）&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git init
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;42-将当前版本加入暂存区&#34;&gt;4.2 将当前版本加入暂存区&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git add .
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;43-检查将提交内容推荐必做&#34;&gt;4.3 检查将提交内容（推荐必做）&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git status
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;44-创建第一次提交基线&#34;&gt;4.4 创建第一次提交（基线）&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git commit -m &lt;span class=&#34;s2&#34;&gt;&amp;#34;checkpoint: runnable baseline&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;5-打标签做回滚锚点&#34;&gt;5. 打标签：做&amp;quot;回滚锚点&amp;quot;&lt;/h2&gt;
&lt;p&gt;标签（tag）= 你的&amp;quot;存档点&amp;quot;，以后随时可回到这个版本。&lt;/p&gt;
&lt;h3 id=&#34;51-给当前提交打标签&#34;&gt;5.1 给当前提交打标签&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git tag v0.1-checkpoint
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;52-查看标签是否存在&#34;&gt;5.2 查看标签是否存在&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git tag
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;53-查看最近提交带标签信息&#34;&gt;5.3 查看最近提交（带标签信息）&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git log --oneline --decorate -10
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;6-分支策略&#34;&gt;6. 分支策略&lt;/h2&gt;
&lt;h3 id=&#34;规则&#34;&gt;规则&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;main&lt;/code&gt;：保持稳定、可演示的版本&lt;/li&gt;
&lt;li&gt;&lt;code&gt;feature/*&lt;/code&gt;：所有新功能/大改动在功能分支做&lt;/li&gt;
&lt;li&gt;需要里程碑就打 tag（例如 v0.2 / v0.3）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;61-创建并切换到功能分支&#34;&gt;6.1 创建并切换到功能分支&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git checkout -b feature/ui-upgrades
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;62-查看当前分支&#34;&gt;6.2 查看当前分支&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git branch
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;7-日常工作流&#34;&gt;7. 日常工作流&lt;/h2&gt;
&lt;h3 id=&#34;71-每次开始一个新功能&#34;&gt;7.1 每次开始一个新功能&lt;/h3&gt;
&lt;p&gt;从 main 拉一个新分支：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git checkout main
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git checkout -b feature/&amp;lt;task-name&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;示例：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git checkout -b feature/alert-snapshots
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;72-开发过程中查看改动&#34;&gt;7.2 开发过程中查看改动&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git status
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git diff
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;73-分阶段提交&#34;&gt;7.3 分阶段提交&lt;/h3&gt;
&lt;p&gt;不要憋成一次超大提交：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git add .
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git commit -m &lt;span class=&#34;s2&#34;&gt;&amp;#34;feat: improve analysis UI&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;74-完成一个里程碑打标签可选&#34;&gt;7.4 完成一个里程碑，打标签（可选）&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git tag v0.2-ui-polish
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;8-回滚方式&#34;&gt;8. 回滚方式&lt;/h2&gt;
&lt;h3 id=&#34;81-推荐回滚从某个-tag-开新分支继续开发最安全&#34;&gt;8.1 推荐回滚：从某个 tag 开新分支继续开发（最安全）&lt;/h3&gt;
&lt;p&gt;不会破坏现有分支，也不会丢历史：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git checkout -b rollback-from-v0.1 v0.1-checkpoint
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;82-只查看某个-tag-的版本不建议长期停留&#34;&gt;8.2 只&amp;quot;查看&amp;quot;某个 tag 的版本（不建议长期停留）&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git checkout v0.1-checkpoint
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;注意：这会进入 &amp;ldquo;detached HEAD&amp;rdquo; 状态。若要继续开发，请开分支：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git checkout -b hotfix/from-v0.1 v0.1-checkpoint
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;83-强制把当前分支回到某个-tag慎用会丢未提交内容&#34;&gt;8.3 强制把当前分支回到某个 tag（慎用：会丢未提交内容）&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git reset --hard v0.1-checkpoint
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;若有未提交改动又不想丢，先 stash：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git stash -u
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git reset --hard v0.1-checkpoint
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git stash pop
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;9-推荐-tag-命名&#34;&gt;9. 推荐 tag 命名&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;v0.1-checkpoint&lt;/code&gt;：系统跑通&lt;/li&gt;
&lt;li&gt;&lt;code&gt;v0.2-alert-snapshots&lt;/code&gt;：告警证据截图可用&lt;/li&gt;
&lt;li&gt;&lt;code&gt;v0.3-ui-pro&lt;/code&gt;：UI 升级到高级控制台&lt;/li&gt;
&lt;li&gt;&lt;code&gt;v1.0-demo-ready&lt;/code&gt;：最终可演示/可答辩版本&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h2 id=&#34;10-可选接入远端仓库&#34;&gt;10. 可选：接入远端仓库&lt;/h2&gt;
&lt;p&gt;如果后面想同步到 GitHub/Gitee：&lt;/p&gt;
&lt;h3 id=&#34;101-添加远端&#34;&gt;10.1 添加远端&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git remote add origin &amp;lt;your-repo-url&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;102-推送-main-和-tags&#34;&gt;10.2 推送 main 和 tags&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git push -u origin main
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git push --tags
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;11-最常用命令速查&#34;&gt;11. 最常用命令速查&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;8
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git status
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git diff
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git add .
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git commit -m &lt;span class=&#34;s2&#34;&gt;&amp;#34;...&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git checkout -b feature/xxx
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git log --oneline --decorate -10
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git tag v0.x-xxx
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git checkout -b rollback-from-tag &amp;lt;tagname&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;]]></content:encoded></item><item><title>Mac 命令行环境配置备忘</title><link>https://blog.rootfly.xyz/post/mac-cli-setup/</link><pubDate>Thu, 07 May 2026 00:00:00 +0000</pubDate><guid>https://blog.rootfly.xyz/post/mac-cli-setup/</guid><description>Mac 终端环境的工具来源排查与 PATH 优先级备忘，涵盖 Git、Python/Conda、Homebrew、OrbStack 等关键组件。</description><content:encoded><![CDATA[&lt;blockquote&gt;
&lt;p&gt;目的：把 Mac 上&amp;quot;终端里能用的工具从哪来、优先级如何、怎么自查&amp;quot;整理成一份备忘。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;1-git&#34;&gt;1. Git&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;当前 Git&lt;/strong&gt;：&lt;code&gt;git version 2.50.1 (Apple Git-155)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可执行位置&lt;/strong&gt;：&lt;code&gt;/usr/bin/git&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;来源&lt;/strong&gt;：Apple / Xcode Command Line Tools（CLT）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CLT 路径&lt;/strong&gt;：&lt;code&gt;/Library/Developer/CommandLineTools&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;结论：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;这是&lt;strong&gt;命令行工具&lt;/strong&gt;，不是 GUI 应用，所以不会出现在「启动台」。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;更新方式&lt;/strong&gt;：随 &lt;strong&gt;macOS / Xcode / Command Line Tools 更新&lt;/strong&gt;而更新（不是像 brew 那样单独升级）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;自查命令：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git --version
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;which git
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;xcode-select -p
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;2-python--conda&#34;&gt;2. Python / Conda&lt;/h2&gt;
&lt;p&gt;终端提示符有 &lt;code&gt;(base)&lt;/code&gt;，conda 环境只有一个：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Conda 发行版&lt;/strong&gt;：Miniforge（以 Cask 安装）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;base 环境路径&lt;/strong&gt;：&lt;code&gt;/opt/homebrew/Caskroom/miniforge/base&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;当前默认 python/pip&lt;/strong&gt;（因 PATH 优先级）：
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;python&lt;/code&gt; → &lt;code&gt;/opt/homebrew/Caskroom/miniforge/base/bin/python&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;python3&lt;/code&gt; → &lt;code&gt;/opt/homebrew/Caskroom/miniforge/base/bin/python3&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pip&lt;/code&gt; → &lt;code&gt;/opt/homebrew/Caskroom/miniforge/base/bin/pip&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pip3&lt;/code&gt; → &lt;code&gt;/opt/homebrew/Caskroom/miniforge/base/bin/pip3&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;系统也有&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;python3&lt;/code&gt; → &lt;code&gt;/usr/bin/python3&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pip3&lt;/code&gt; → &lt;code&gt;/usr/bin/pip3&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;但由于 conda 路径在 PATH 更前面，日常默认使用 conda 的 python/pip。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;conda&lt;/code&gt; 的状态：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;conda&lt;/code&gt; 在 shell 中既是一个函数（来自 &lt;code&gt;~/.zshrc&lt;/code&gt;），也有多个可执行文件路径。&lt;/li&gt;
&lt;li&gt;这是 conda 初始化脚本的常见表现。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;自查命令：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;conda env list
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;conda list
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;type&lt;/span&gt; -a python python3 pip pip3 conda
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;3-homebrew命令行包管理器&#34;&gt;3. Homebrew（命令行包管理器）&lt;/h2&gt;
&lt;h3 id=&#34;31-手动安装的顶层包&#34;&gt;3.1 手动安装的顶层包&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;brew leaves&lt;/code&gt; 输出只有：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;node&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tree&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这通常意味着：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;真正&amp;quot;自己装来用&amp;quot;的命令行主工具基本就是 Node.js 和 tree&lt;/li&gt;
&lt;li&gt;&lt;code&gt;brew list&lt;/code&gt; 里看到的一大堆（&lt;code&gt;cairo/pango/libpng/...&lt;/code&gt; 等）多为依赖库/被间接安装的组件&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;自查命令：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;brew leaves
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;brew list
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;brew list --cask
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;brew uses --installed &amp;lt;包名&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;32-homebrew-是否只在-base-环境里可用&#34;&gt;3.2 Homebrew 是否&amp;quot;只在 base 环境里可用&amp;quot;？&lt;/h3&gt;
&lt;p&gt;不是。Homebrew 是系统级安装在 &lt;code&gt;/opt/homebrew&lt;/code&gt;（Apple Silicon 常见路径）。在 base 环境也能用 &lt;code&gt;brew/tree&lt;/code&gt; 的原因是：&lt;strong&gt;PATH 里包含 &lt;code&gt;/opt/homebrew/bin&lt;/code&gt;&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;验证命令：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;type&lt;/span&gt; -a brew tree
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;which brew
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;which tree
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;conda deactivate
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;type&lt;/span&gt; -a brew tree
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;4-orbstackdocker--kubernetes-命令来源&#34;&gt;4. OrbStack（Docker / Kubernetes 命令来源）&lt;/h2&gt;
&lt;p&gt;PATH 里有 &lt;code&gt;/Users/xiang/.orbstack/bin&lt;/code&gt;，该目录中包含：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;docker&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker-compose&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;docker-credential-osxkeychain&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;kubectl&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;orb&lt;/code&gt;、&lt;code&gt;orbctl&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;结论：当前的 &lt;code&gt;docker&lt;/code&gt; / &lt;code&gt;kubectl&lt;/code&gt; 很可能优先来自 OrbStack（取决于 PATH 排序）。&lt;/p&gt;
&lt;p&gt;自查命令：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;which docker
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;which docker-compose
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;which kubectl
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;type&lt;/span&gt; -a docker kubectl
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;5-path-优先级&#34;&gt;5. PATH 优先级&lt;/h2&gt;
&lt;p&gt;当前 PATH（按优先级从高到低）：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;/opt/homebrew/Caskroom/miniforge/base/bin&lt;/code&gt; ← conda base 的命令（python/pip 等）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/opt/homebrew/Caskroom/miniforge/base/condabin&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/opt/homebrew/bin&lt;/code&gt; ← Homebrew 命令（brew、tree、node 等）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/opt/homebrew/sbin&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/usr/local/bin&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/System/Cryptexes/App/usr/bin&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/usr/bin&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/bin&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/usr/sbin&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/sbin&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/opt/pmk/env/global/bin&lt;/code&gt; ← 非典型来源，可能是某个环境/工具链的全局 bin&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/Library/TeX/texbin&lt;/code&gt; ← TeX/LaTeX 工具链（装了 &lt;code&gt;mactex-no-gui&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/Users/xiang/.orbstack/bin&lt;/code&gt; ← OrbStack 的 docker/kubectl 等&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;重点记住：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;谁在 PATH 前面，谁就&amp;quot;覆盖/优先&amp;quot;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;目前：&lt;strong&gt;conda base 覆盖系统 python&lt;/strong&gt;，brew 在其后；OrbStack 在较后但仍可用&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;快速查看某个命令到底来自哪里：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;type&lt;/span&gt; -a &amp;lt;命令&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;which &amp;lt;命令&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;6-与命令行相关的-gui-应用homebrew-cask&#34;&gt;6. 与命令行相关的 GUI 应用（Homebrew Cask）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;miniforge&lt;/code&gt;（决定 conda / base）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;orbstack&lt;/code&gt;（提供 docker/kubectl 等）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;mactex-no-gui&lt;/code&gt;（带来 &lt;code&gt;/Library/TeX/texbin&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;visual-studio-code&lt;/code&gt;（开发编辑器）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;查看完整列表：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;brew list --cask
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;7-忘了装了啥时的推荐排查顺序&#34;&gt;7. &amp;ldquo;忘了装了啥&amp;quot;时的推荐排查顺序&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;先看 Homebrew 的&amp;quot;顶层包&amp;rdquo;：&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;brew leaves
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ol start=&#34;2&#34;&gt;
&lt;li&gt;再看 conda base 里装了什么（通常 python 相关在这里）：&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;conda list
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;python -m pip list
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ol start=&#34;3&#34;&gt;
&lt;li&gt;再看关键目录里有哪些可执行文件：&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ls -1 /opt/homebrew/bin &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; head -n &lt;span class=&#34;m&#34;&gt;80&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ls -1 /opt/pmk/env/global/bin 2&amp;gt;/dev/null &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; head -n &lt;span class=&#34;m&#34;&gt;80&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ls -1 ~/.orbstack/bin 2&amp;gt;/dev/null &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; head -n &lt;span class=&#34;m&#34;&gt;80&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;定位具体某个命令：&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;type&lt;/span&gt; -a &amp;lt;命令&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;8-关键结论一句话版&#34;&gt;8. 关键结论一句话版&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Git&lt;/strong&gt;：Apple Git（CLT 提供，随系统/CLT 更新）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Python&lt;/strong&gt;：主要来自 &lt;strong&gt;Miniforge conda base&lt;/strong&gt;（覆盖系统 python3）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Brew 顶层工具&lt;/strong&gt;：只剩 &lt;code&gt;node&lt;/code&gt;、&lt;code&gt;tree&lt;/code&gt;（其余多为依赖）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Docker/kubectl&lt;/strong&gt;：很可能来自 &lt;strong&gt;OrbStack&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
]]></content:encoded></item><item><title>Mac 深度残留清理助手</title><link>https://blog.rootfly.xyz/post/mac-deep-cleanup/</link><pubDate>Thu, 07 May 2026 00:00:00 +0000</pubDate><guid>https://blog.rootfly.xyz/post/mac-deep-cleanup/</guid><description>系统化清理已卸载软件遗留的缓存、日志、启动项，附带审批流程与交叉验证方法</description><content:encoded><![CDATA[&lt;p&gt;卸载 Mac 应用后，&lt;code&gt;~/Library&lt;/code&gt;、&lt;code&gt;/Library&lt;/code&gt;、Homebrew 等目录中常残留大量缓存、配置和失效启动项。本文提供一套系统化的清理方案，覆盖用户级和系统级路径，附带交叉验证逻辑与安全审批流程。&lt;/p&gt;
&lt;h2 id=&#34;清理约束&#34;&gt;清理约束&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;不动 &lt;code&gt;Downloads&lt;/code&gt;、&lt;code&gt;Desktop&lt;/code&gt;、&lt;code&gt;Documents&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;不删除正在使用的软件主数据，优先清理残留、缓存、日志、安装包工件、失效启动项&lt;/li&gt;
&lt;li&gt;操作分两步：先出审批表，确认后再执行删除&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;扫描范围&#34;&gt;扫描范围&lt;/h2&gt;
&lt;h3 id=&#34;用户级&#34;&gt;用户级&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;~/Library/
  Containers、Group Containers、Application Scripts
  Application Support、Preferences、Caches
  WebKit、HTTPStorages、Saved Application State、Biome

~/.cache/          ← 大型工具运行时/编译缓存常在此
~/.config/         ← XDG 规范工具配置，卸载后常残留
~/.local/share/    ← XDG 数据目录
~/（根目录隐藏 dotfiles）← .android .putty 等工具遗留
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;系统级&#34;&gt;系统级&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;/Library/
  LaunchAgents、LaunchDaemons、PrivilegedHelperTools
  Extensions、SystemExtensions、Application Support、Preferences
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&#34;homebrew&#34;&gt;Homebrew&lt;/h3&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;/opt/homebrew/Caskroom/              ← 多版本遗留及孤儿条目
~/Library/Caches/Homebrew/downloads/ ← 安装包缓存
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;交叉验证逻辑&#34;&gt;交叉验证逻辑&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;用 &lt;code&gt;ls /Applications ~/Applications&lt;/code&gt; + &lt;code&gt;brew list --cask&lt;/code&gt; 建立已安装 App 清单&lt;/li&gt;
&lt;li&gt;扫描上述路径时，对每条记录比对清单：找不到对应 App 的即为候选残留&lt;/li&gt;
&lt;li&gt;对模糊项（如系统框架插件、SDK 组件）进一步用 &lt;code&gt;mdfind&lt;/code&gt; / &lt;code&gt;kextstat&lt;/code&gt; 确认后再归类&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;审批表格式&#34;&gt;审批表格式&lt;/h2&gt;
&lt;h3 id=&#34;a-类--已卸载应用真实残留&#34;&gt;A 类 — 已卸载应用真实残留&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;编号&lt;/th&gt;
          &lt;th&gt;路径&lt;/th&gt;
          &lt;th&gt;大小&lt;/th&gt;
          &lt;th&gt;来源 App&lt;/th&gt;
          &lt;th&gt;风险&lt;/th&gt;
          &lt;th&gt;是否影响在用软件&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;—&lt;/td&gt;
          &lt;td&gt;—&lt;/td&gt;
          &lt;td&gt;—&lt;/td&gt;
          &lt;td&gt;—&lt;/td&gt;
          &lt;td&gt;—&lt;/td&gt;
          &lt;td&gt;—&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;b-类--可再生大型缓存&#34;&gt;B 类 — 可再生大型缓存&lt;/h3&gt;
&lt;p&gt;在用 App 产生，删后可自动重建。&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;编号&lt;/th&gt;
          &lt;th&gt;路径&lt;/th&gt;
          &lt;th&gt;大小&lt;/th&gt;
          &lt;th&gt;用途&lt;/th&gt;
          &lt;th&gt;清理方式&lt;/th&gt;
          &lt;th&gt;风险&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;—&lt;/td&gt;
          &lt;td&gt;—&lt;/td&gt;
          &lt;td&gt;—&lt;/td&gt;
          &lt;td&gt;—&lt;/td&gt;
          &lt;td&gt;—&lt;/td&gt;
          &lt;td&gt;—&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;c-类--后台持久化审查&#34;&gt;C 类 — 后台持久化审查&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;编号&lt;/th&gt;
          &lt;th&gt;路径&lt;/th&gt;
          &lt;th&gt;对应 App&lt;/th&gt;
          &lt;th&gt;KeepAlive&lt;/th&gt;
          &lt;th&gt;RunAtLoad&lt;/th&gt;
          &lt;th&gt;建议&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;—&lt;/td&gt;
          &lt;td&gt;—&lt;/td&gt;
          &lt;td&gt;—&lt;/td&gt;
          &lt;td&gt;—&lt;/td&gt;
          &lt;td&gt;—&lt;/td&gt;
          &lt;td&gt;—&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;执行要求&#34;&gt;执行要求&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;非 sudo 项&lt;/strong&gt;：确认后直接执行&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;需要 sudo 的项&lt;/strong&gt;：以 &lt;code&gt;sudo &amp;lt;命令&amp;gt;&lt;/code&gt; 格式提供，手动粘贴执行&lt;/li&gt;
&lt;li&gt;删除完成后对比「清理前 → 清理后」磁盘可用空间，以及各类合计释放量&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;实用命令速查&#34;&gt;实用命令速查&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 查看已安装 Cask&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;brew list --cask
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 搜索某 App 的所有残留文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mdfind &lt;span class=&#34;s2&#34;&gt;&amp;#34;kMDItemFSName == &amp;#39;AppName*&amp;#39;&amp;#34;&lt;/span&gt; -onlyin ~
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 查看 LaunchAgent/Daemon&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ls ~/Library/LaunchAgents/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ls /Library/LaunchAgents/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ls /Library/LaunchDaemons/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 查看磁盘可用空间&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;df -h /
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;]]></content:encoded></item><item><title>YOLO 训练运维速查</title><link>https://blog.rootfly.xyz/post/yolo-training-ops/</link><pubDate>Thu, 07 May 2026 00:00:00 +0000</pubDate><guid>https://blog.rootfly.xyz/post/yolo-training-ops/</guid><description>YOLO 模型训练的常用运维命令，包括后台启动、日志查看、进程管理和学术加速。</description><content:encoded><![CDATA[&lt;h2 id=&#34;1-启动训练后台运行&#34;&gt;1. 启动训练（后台运行）&lt;/h2&gt;
&lt;p&gt;先进入脚本所在目录，然后使用 &lt;code&gt;nohup&lt;/code&gt; 启动。注意加上 &lt;code&gt;-u&lt;/code&gt; 参数，否则日志会有严重延迟（写不进文件）。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 进入目录&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; /root/autodl-fs/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 启动命令 (解释：python -u 禁用缓存，&amp;gt; 输出到日志，2&amp;gt;&amp;amp;1 包含报错，&amp;amp; 后台运行)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nohup python -u ultralytics-yolo11-main/train_queue.py &amp;gt; train.log 2&amp;gt;&lt;span class=&#34;p&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;amp;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nohup python -u ultralytics-main/train_queue.py &amp;gt; train.log 2&amp;gt;&lt;span class=&#34;p&#34;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;&amp;amp;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;看见 &lt;code&gt;[1] xxxxx&lt;/code&gt; 提示即表示启动成功。&lt;/p&gt;
&lt;h2 id=&#34;2-查看日志实时监控&#34;&gt;2. 查看日志（实时监控）&lt;/h2&gt;
&lt;p&gt;训练在后台跑，你想看进度时：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;tail -f train.log
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;退出查看：按 &lt;code&gt;Ctrl + C&lt;/code&gt;（放心，这只会退出日志查看，不会停止训练）。&lt;/p&gt;
&lt;h2 id=&#34;3-管理进程查杀&#34;&gt;3. 管理进程（查杀）&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;检查还在不在跑：&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 方法A：看显卡有没有在转&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;nvidia-smi
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 方法B：搜进程号&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ps -ef &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep train_queue.py
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;停止训练（杀进程）：&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 假设上面查到的进程号是 12345&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;kill&lt;/span&gt; -9 &lt;span class=&#34;m&#34;&gt;12345&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;&lt;strong&gt;终止所有 Python 进程：&lt;/strong&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;pkill -9 python
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;4-学术资源加速&#34;&gt;4. 学术资源加速&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;source&lt;/span&gt; /etc/network_turbo
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;]]></content:encoded></item><item><title>终端网络代理配置手册</title><link>https://blog.rootfly.xyz/post/terminal-proxy-setup/</link><pubDate>Thu, 07 May 2026 00:00:00 +0000</pubDate><guid>https://blog.rootfly.xyz/post/terminal-proxy-setup/</guid><description>macOS 终端默认不走系统代理，导致 Homebrew、Git 等工具连接 GitHub 极慢。本文通过三个 Zsh 别名实现一键切换终端代理状态。</description><content:encoded><![CDATA[&lt;h2 id=&#34;问题背景&#34;&gt;问题背景&lt;/h2&gt;
&lt;p&gt;macOS 的终端（Terminal / iTerm2）默认不走系统代理设置，导致 &lt;code&gt;brew install&lt;/code&gt;、&lt;code&gt;git clone&lt;/code&gt;、&lt;code&gt;curl&lt;/code&gt; 等命令行工具无法连接 GitHub 或速度极慢。&lt;/p&gt;
&lt;p&gt;解决方案很简单：在 Zsh 配置中注入几个别名，手动控制终端的代理开关。&lt;/p&gt;
&lt;h2 id=&#34;配置代码&#34;&gt;配置代码&lt;/h2&gt;
&lt;p&gt;将以下代码块添加到 &lt;code&gt;~/.zshrc&lt;/code&gt; 的&lt;strong&gt;最底部&lt;/strong&gt;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# =================================================&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 终端代理控制 (Proxy Control)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Target: Clash Verge (Localhost: 7897)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# =================================================&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 开启代理&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;alias&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;proxy&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;export https_proxy=http://127.0.0.1:7897 http_proxy=http://127.0.0.1:7897 all_proxy=socks5://127.0.0.1:7897; echo &amp;#34;\n✅ 终端代理已开启 (Port: 7897)&amp;#34;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 关闭代理&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;alias&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;unproxy&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;unset https_proxy http_proxy all_proxy; echo &amp;#34;\n🚫 终端代理已关闭&amp;#34;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 检查当前 IP&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;alias&lt;/span&gt; &lt;span class=&#34;nv&#34;&gt;myip&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s1&#34;&gt;&amp;#39;curl -s ipinfo.io/json | grep -E &amp;#34;ip|country&amp;#34;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;生效步骤&#34;&gt;生效步骤&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;打开配置文件：&lt;code&gt;nano ~/.zshrc&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;将上述代码粘贴到文件末尾&lt;/li&gt;
&lt;li&gt;保存退出（&lt;code&gt;Ctrl+O&lt;/code&gt; → &lt;code&gt;Enter&lt;/code&gt; → &lt;code&gt;Ctrl+X&lt;/code&gt;）&lt;/li&gt;
&lt;li&gt;立即生效：&lt;code&gt;source ~/.zshrc&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;命令速查&#34;&gt;命令速查&lt;/h2&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;命令&lt;/th&gt;
          &lt;th&gt;说明&lt;/th&gt;
          &lt;th&gt;预期反馈&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;proxy&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;开启代理，在 &lt;code&gt;brew install&lt;/code&gt; 或 &lt;code&gt;git clone&lt;/code&gt; 前使用&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;✅ 终端代理已开启...&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;unproxy&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;关闭代理，恢复国内直连&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;🚫 终端代理已关闭...&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;myip&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;验证当前出口 IP 及国家&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;{ &amp;quot;ip&amp;quot;: &amp;quot;x.x.x.x&amp;quot;, &amp;quot;country&amp;quot;: &amp;quot;US&amp;quot; }&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;常见问题&#34;&gt;常见问题&lt;/h2&gt;
&lt;h3 id=&#34;端口变更&#34;&gt;端口变更&lt;/h3&gt;
&lt;p&gt;不同代理软件默认端口不同：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;ClashX Pro：&lt;code&gt;7890&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Surge：&lt;code&gt;6152&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Clash Verge：&lt;code&gt;7897&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;修改方法：打开 &lt;code&gt;~/.zshrc&lt;/code&gt;，将 &lt;code&gt;alias proxy=&#39;...&#39;&lt;/code&gt; 行中所有端口号替换为你的代理端口，然后 &lt;code&gt;source ~/.zshrc&lt;/code&gt; 生效。&lt;/p&gt;
&lt;h3 id=&#34;代理开启后依然超时&#34;&gt;代理开启后依然超时&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;确认代理软件正在运行，且&amp;quot;系统代理&amp;quot;开关已打开&lt;/li&gt;
&lt;li&gt;检查代理软件设置中的&amp;quot;混合端口 (Mixed Port)&amp;ldquo;是否与配置一致&lt;/li&gt;
&lt;li&gt;执行 &lt;code&gt;myip&lt;/code&gt; 确认出口 IP 是否已变化&lt;/li&gt;
&lt;/ol&gt;
]]></content:encoded></item><item><title>Mac 深度残留清理指南</title><link>https://blog.rootfly.xyz/post/deep-cleanup-guide/</link><pubDate>Wed, 06 May 2026 00:00:00 +0000</pubDate><guid>https://blog.rootfly.xyz/post/deep-cleanup-guide/</guid><description>卸载 Mac 软件后常有残留文件藏在 Library 深处。本文提供一套系统化的扫描与清理流程，覆盖用户级、系统级和 Homebrew 缓存。</description><content:encoded><![CDATA[&lt;h2 id=&#34;目标&#34;&gt;目标&lt;/h2&gt;
&lt;p&gt;清理已卸载软件的残留文件——GUI 中不明显、但仍占空间或有持久化痕迹的垃圾，同时不影响正在使用的软件。&lt;/p&gt;
&lt;h2 id=&#34;约束&#34;&gt;约束&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;不动 &lt;code&gt;Downloads&lt;/code&gt;、&lt;code&gt;Desktop&lt;/code&gt;、&lt;code&gt;Documents&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;不删除正在使用的软件主数据；优先清理残留、缓存、日志、安装包工件、失效启动项&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;先出审批表，确认后再执行删除&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;扫描范围&#34;&gt;扫描范围&lt;/h2&gt;
&lt;h3 id=&#34;用户级&#34;&gt;用户级&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;路径&lt;/th&gt;
          &lt;th&gt;说明&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;~/Library/Containers&lt;/code&gt;、&lt;code&gt;Group Containers&lt;/code&gt;、&lt;code&gt;Application Scripts&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;App 沙盒数据&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;~/Library/Application Support&lt;/code&gt;、&lt;code&gt;Preferences&lt;/code&gt;、&lt;code&gt;Caches&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;App 配置与缓存&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;~/Library/WebKit&lt;/code&gt;、&lt;code&gt;HTTPStorages&lt;/code&gt;、&lt;code&gt;Saved Application State&lt;/code&gt;、&lt;code&gt;Biome&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;系统级 App 痕迹&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;~/.cache/&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;重点：大型工具运行时/编译缓存&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;~/.config/&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;重点：XDG 规范工具配置，卸载后常残留&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;~/.local/share/&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;重点：XDG 数据目录&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;~/&lt;/code&gt;（根目录隐藏 dotfiles）&lt;/td&gt;
          &lt;td&gt;重点：&lt;code&gt;.android&lt;/code&gt;、&lt;code&gt;.putty&lt;/code&gt; 等工具遗留&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;系统级&#34;&gt;系统级&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;路径&lt;/th&gt;
          &lt;th&gt;说明&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/Library/LaunchAgents&lt;/code&gt;、&lt;code&gt;LaunchDaemons&lt;/code&gt;、&lt;code&gt;PrivilegedHelperTools&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;后台服务与开机启动项&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/Library/Extensions&lt;/code&gt;、&lt;code&gt;SystemExtensions&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;内核扩展&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/Library/Application Support&lt;/code&gt;、&lt;code&gt;Preferences&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;系统级 App 配置&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;homebrew&#34;&gt;Homebrew&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;路径&lt;/th&gt;
          &lt;th&gt;说明&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/opt/homebrew/Caskroom/&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;检查多版本遗留及孤儿条目&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;~/Library/Caches/Homebrew/downloads/&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;安装包缓存&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;交叉验证逻辑&#34;&gt;交叉验证逻辑&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;用 &lt;code&gt;ls /Applications ~/Applications&lt;/code&gt; + &lt;code&gt;brew list --cask&lt;/code&gt; 建立已安装 App 清单&lt;/li&gt;
&lt;li&gt;扫描上述路径时，对每条记录比对清单：找不到对应 App 的即为候选残留&lt;/li&gt;
&lt;li&gt;对模糊项（系统框架插件、SDK 组件）用 &lt;code&gt;mdfind&lt;/code&gt; / &lt;code&gt;kextstat&lt;/code&gt; 确认后再归类&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;审批表格式&#34;&gt;审批表格式&lt;/h2&gt;
&lt;h3 id=&#34;a-类已卸载应用真实残留&#34;&gt;A 类——已卸载应用真实残留&lt;/h3&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;编号&lt;/th&gt;
          &lt;th&gt;路径&lt;/th&gt;
          &lt;th&gt;大小&lt;/th&gt;
          &lt;th&gt;来源 App&lt;/th&gt;
          &lt;th&gt;风险&lt;/th&gt;
          &lt;th&gt;是否影响在用软件&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;b-类可再生大型缓存&#34;&gt;B 类——可再生大型缓存&lt;/h3&gt;
&lt;p&gt;在用 App 产生、删后可自动重建。&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;编号&lt;/th&gt;
          &lt;th&gt;路径&lt;/th&gt;
          &lt;th&gt;大小&lt;/th&gt;
          &lt;th&gt;用途&lt;/th&gt;
          &lt;th&gt;清理方式&lt;/th&gt;
          &lt;th&gt;风险&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;c-类后台持久化审查&#34;&gt;C 类——后台持久化审查&lt;/h3&gt;
&lt;p&gt;LaunchAgent / Daemon / PrivilegedHelper。&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;编号&lt;/th&gt;
          &lt;th&gt;路径&lt;/th&gt;
          &lt;th&gt;对应 App&lt;/th&gt;
          &lt;th&gt;KeepAlive&lt;/th&gt;
          &lt;th&gt;RunAtLoad&lt;/th&gt;
          &lt;th&gt;建议&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
          &lt;td&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;执行要求&#34;&gt;执行要求&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;非 sudo 项&lt;/strong&gt;：确认后直接执行&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;需要 sudo 的项&lt;/strong&gt;：以 &lt;code&gt;! sudo &amp;lt;命令&amp;gt;&lt;/code&gt; 格式提供，在对话框内粘贴执行&lt;/li&gt;
&lt;li&gt;删除完成后给出&amp;quot;清理前 → 清理后&amp;quot;磁盘可用空间对比及各类合计释放量&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;实用命令速查&#34;&gt;实用命令速查&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 查看已安装的 Cask&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;brew list --cask
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 查找某个 App 的所有残留文件&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mdfind &lt;span class=&#34;s2&#34;&gt;&amp;#34;kMDItemDisplayName == &amp;#39;AppName&amp;#39;&amp;#34;&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep -i appname
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 查看磁盘可用空间&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;df -h /
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 查看 LaunchDaemons 中的第三方项&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ls /Library/LaunchDaemons/ &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep -v com.apple
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 查看 LaunchAgents 中的第三方项&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ls /Library/LaunchAgents/ &lt;span class=&#34;p&#34;&gt;|&lt;/span&gt; grep -v com.apple
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 查看 Homebrew 下载缓存大小&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;du -sh ~/Library/Caches/Homebrew/downloads/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;]]></content:encoded></item><item><title>从零开始搭建你的第一个 Docker 服务</title><link>https://blog.rootfly.xyz/post/docker-tutorial/</link><pubDate>Thu, 16 Apr 2026 00:00:00 +0000</pubDate><guid>https://blog.rootfly.xyz/post/docker-tutorial/</guid><description>Docker 已经成为现代后端部署的标配工具。本文将带你用 20 分钟完成一次完整的容器化部署。</description><content:encoded><![CDATA[&lt;p&gt;Docker 已经成为现代后端部署的标配工具。本文将带你用 20 分钟，从零开始把一个 Python Web 服务容器化并运行起来。&lt;/p&gt;
&lt;h2 id=&#34;为什么要用-docker&#34;&gt;为什么要用 Docker&lt;/h2&gt;
&lt;p&gt;在没有 Docker 的时代，部署一个服务需要手动安装运行时、配置依赖、处理环境差异。&amp;ldquo;在我机器上能跑&amp;quot;成了经典甩锅语录。&lt;/p&gt;
&lt;p&gt;Docker 把应用和它的运行环境打包成一个&lt;strong&gt;镜像（Image）&lt;/strong&gt;，在任何装了 Docker 的机器上都能以相同方式运行。核心思路很简单：&lt;strong&gt;用代码定义环境，而不是手动配置&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;几个关键概念：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;镜像（Image）&lt;/strong&gt;：只读的模板，包含应用代码和运行所需的一切&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;容器（Container）&lt;/strong&gt;：镜像的运行实例，可以启动、停止、删除&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dockerfile&lt;/strong&gt;：构建镜像的配方文件&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;docker-compose.yml&lt;/strong&gt;：定义多个容器如何协同工作的配置文件&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;准备工作&#34;&gt;准备工作&lt;/h2&gt;
&lt;p&gt;确保机器上已安装 Docker 和 Docker Compose：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker --version
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker compose version
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;如果没装，参考 &lt;a href=&#34;https://docs.docker.com/engine/install/&#34;&gt;Docker 官方文档&lt;/a&gt;。Linux 用户装完后把当前用户加入 docker 组，免得每次都加 &lt;code&gt;sudo&lt;/code&gt;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;sudo usermod -aG docker &lt;span class=&#34;nv&#34;&gt;$USER&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;重新登录终端生效。&lt;/p&gt;
&lt;h2 id=&#34;第一步写一个简单的-web-服务&#34;&gt;第一步：写一个简单的 Web 服务&lt;/h2&gt;
&lt;p&gt;创建一个项目目录：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;mkdir docker-demo &lt;span class=&#34;o&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; docker-demo
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;写一个最小的 Flask 应用 &lt;code&gt;app.py&lt;/code&gt;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;kn&#34;&gt;from&lt;/span&gt; &lt;span class=&#34;nn&#34;&gt;flask&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Flask&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;n&#34;&gt;app&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;Flask&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;vm&#34;&gt;__name__&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nd&#34;&gt;@app.route&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;/&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;index&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;message&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;Hello from Docker!&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nd&#34;&gt;@app.route&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;/health&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;health&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;():&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;status&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;ok&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;vm&#34;&gt;__name__&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;__main__&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;n&#34;&gt;app&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;run&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;host&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;0.0.0.0&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;port&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;5000&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;再写一个 &lt;code&gt;requirements.txt&lt;/code&gt;：&lt;/p&gt;
&lt;pre tabindex=&#34;0&#34;&gt;&lt;code&gt;flask==3.1.*
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&#34;第二步编写-dockerfile&#34;&gt;第二步：编写 Dockerfile&lt;/h2&gt;
&lt;p&gt;在项目根目录创建 &lt;code&gt;Dockerfile&lt;/code&gt;：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-dockerfile&#34; data-lang=&#34;dockerfile&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;FROM&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;python:3.12-slim&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;WORKDIR&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;/app&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;COPY&lt;/span&gt; requirements.txt .&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;RUN&lt;/span&gt; pip install --no-cache-dir -r requirements.txt&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;COPY&lt;/span&gt; . .&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;EXPOSE&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s&#34;&gt;5000&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;CMD&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;python&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&amp;#34;app.py&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;err&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;逐行解释：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;指令&lt;/th&gt;
          &lt;th&gt;作用&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;FROM python:3.12-slim&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;基础镜像，slim 版本体积小&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;WORKDIR /app&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;设置容器内的工作目录&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;COPY requirements.txt .&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;先复制依赖文件，利用 Docker 层缓存&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;RUN pip install ...&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;安装依赖&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;COPY . .&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;再复制应用代码&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;EXPOSE 5000&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;声明端口（文档作用，不实际映射）&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;CMD [&amp;quot;python&amp;quot;, &amp;quot;app.py&amp;quot;]&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;容器启动时运行的命令&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;为什么分两步 COPY？&lt;/strong&gt; Docker 会缓存每一层。如果代码改了但 &lt;code&gt;requirements.txt&lt;/code&gt; 没变，&lt;code&gt;pip install&lt;/code&gt; 那层会直接走缓存，构建速度更快。&lt;/p&gt;
&lt;h2 id=&#34;第三步编写-docker-composeyml&#34;&gt;第三步：编写 docker-compose.yml&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;services&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;app&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;build&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ports&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;5000:5000&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;unless-stopped&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这比直接用 &lt;code&gt;docker run&lt;/code&gt; 更清晰，而且一条命令就能管理。&lt;/p&gt;
&lt;h2 id=&#34;第四步构建并运行&#34;&gt;第四步：构建并运行&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker compose up --build
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;第一次会下载基础镜像并安装依赖，之后再构建会很快。看到 Flask 的启动日志后，打开另一个终端测试：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;curl http://localhost:5000
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# {&amp;#34;message&amp;#34;:&amp;#34;Hello from Docker!&amp;#34;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;按 &lt;code&gt;Ctrl+C&lt;/code&gt; 停止。如果想后台运行：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker compose up -d      &lt;span class=&#34;c1&#34;&gt;# 后台启动&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker compose logs -f     &lt;span class=&#34;c1&#34;&gt;# 查看日志&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker compose down        &lt;span class=&#34;c1&#34;&gt;# 停止并移除容器&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;第五步加入数据库&#34;&gt;第五步：加入数据库&lt;/h2&gt;
&lt;p&gt;实际项目通常需要数据库。给 docker-compose.yml 加一个 PostgreSQL：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;13
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;14
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;15
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;16
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;17
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;18
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;19
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;20
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;21
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;22
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;23
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;24
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;25
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;26
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;27
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;services&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;app&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;build&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ports&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;5000:5000&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;DATABASE_URL&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;postgresql://postgres:secret@db:5432/app&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;depends_on&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;db&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;        &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;condition&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;service_healthy&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;restart&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;unless-stopped&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;db&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;image&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;postgres:16-alpine&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;environment&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;POSTGRES_PASSWORD&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;secret&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;POSTGRES_DB&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;app&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;volumes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;pgdata:/var/lib/postgresql/data&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;healthcheck&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;test&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;CMD-SHELL&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;pg_isready -U postgres&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;interval&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;5s&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;timeout&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;3s&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;retries&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;m&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;volumes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;pgdata&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;几个要点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;depends_on&lt;/code&gt; + &lt;code&gt;service_healthy&lt;/code&gt; 确保数据库就绪后才启动应用&lt;/li&gt;
&lt;li&gt;&lt;code&gt;volumes&lt;/code&gt; 让数据库数据持久化，容器删了数据还在&lt;/li&gt;
&lt;li&gt;同一个 compose 文件里的服务可以用&lt;strong&gt;服务名&lt;/strong&gt;（&lt;code&gt;db&lt;/code&gt;）作为主机名互相访问&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;常见问题&#34;&gt;常见问题&lt;/h2&gt;
&lt;h3 id=&#34;容器内访问宿主机服务&#34;&gt;容器内访问宿主机服务&lt;/h3&gt;
&lt;p&gt;用 &lt;code&gt;host.docker.internal&lt;/code&gt;（macOS/Windows）或 &lt;code&gt;host.network&lt;/code&gt;（Linux）。&lt;/p&gt;
&lt;h3 id=&#34;镜像太大&#34;&gt;镜像太大&lt;/h3&gt;
&lt;p&gt;用 &lt;code&gt;slim&lt;/code&gt; 或 &lt;code&gt;alpine&lt;/code&gt; 基础镜像；多阶段构建把构建工具和运行时分开。&lt;/p&gt;
&lt;h3 id=&#34;修改代码后不生效&#34;&gt;修改代码后不生效&lt;/h3&gt;
&lt;p&gt;挂载本地目录到容器内，开发时热更新：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;7
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;services&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;  &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;app&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;build&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;l&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;volumes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;l&#34;&gt;.:/app&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;    &lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;ports&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;w&#34;&gt;      &lt;/span&gt;- &lt;span class=&#34;s2&#34;&gt;&amp;#34;5000:5000&amp;#34;&lt;/span&gt;&lt;span class=&#34;w&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h3 id=&#34;如何查看运行中的容器&#34;&gt;如何查看运行中的容器&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt;1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker ps              &lt;span class=&#34;c1&#34;&gt;# 查看运行中的容器&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker compose ps      &lt;span class=&#34;c1&#34;&gt;# 查看当前项目的容器&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;docker &lt;span class=&#34;nb&#34;&gt;exec&lt;/span&gt; -it &amp;lt;容器名&amp;gt; bash   &lt;span class=&#34;c1&#34;&gt;# 进入容器内部&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;h2 id=&#34;生产环境建议&#34;&gt;生产环境建议&lt;/h2&gt;
&lt;p&gt;这篇文章覆盖的是开发环境的基本用法。上生产前还需要考虑：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;不要硬编码密码&lt;/strong&gt;：用 &lt;code&gt;.env&lt;/code&gt; 文件或密钥管理服务&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;网络隔离&lt;/strong&gt;：数据库端口不要映射到宿主机，只让应用容器访问&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;日志管理&lt;/strong&gt;：配置日志驱动，避免容器日志撑爆磁盘&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;资源限制&lt;/strong&gt;：设置 CPU 和内存上限，防止单个容器耗尽资源&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;小结&#34;&gt;小结&lt;/h2&gt;
&lt;p&gt;整个流程就是四步：写代码 → 写 Dockerfile → 写 docker-compose.yml → &lt;code&gt;docker compose up&lt;/code&gt;。Docker 的核心价值不在于技术有多复杂，而在于它把&amp;quot;部署&amp;quot;从一件靠记忆和运气的事，变成了一件可以版本控制、可以复现、可以自动化的事。&lt;/p&gt;
]]></content:encoded></item><item><title>关于间歇性断食，你可能想问的几个问题</title><link>https://blog.rootfly.xyz/post/intermittent-fasting/</link><pubDate>Thu, 16 Apr 2026 00:00:00 +0000</pubDate><guid>https://blog.rootfly.xyz/post/intermittent-fasting/</guid><description>关于间歇性断食的常见问题解答，涵盖 16:8 方案、咖啡、运动等话题。</description><content:encoded><![CDATA[&lt;h2 id=&#34;168-是什么意思&#34;&gt;16:8 是什么意思？&lt;/h2&gt;
&lt;p&gt;每天有 8 小时进食窗口，其余 16 小时禁食。比如中午 12 点到晚上 8 点之间可以正常吃，其他时间只喝水、黑咖啡或无糖茶。&lt;/p&gt;
&lt;p&gt;这是目前最流行的断食方案，因为进食窗口基本覆盖了午餐和晚餐，执行难度相对低。&lt;/p&gt;
&lt;p&gt;除了 16:8，常见的方案还有：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;18:6&lt;/strong&gt;：进食窗口压缩到 6 小时，断食 18 小时。适合已经适应 16:8 后想进一步挑战的人&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;20:4（战士饮食）&lt;/strong&gt;：每天只在 4 小时内进食，通常是一顿正餐加一份小食&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;5:2&lt;/strong&gt;：一周中 5 天正常吃，2 天大幅减少热量（约 500-600 大卡）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;24 小时断食&lt;/strong&gt;：一周选 1-2 天完全不吃，只喝水。对新手来说比较激进&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;大多数人从 16:8 开始最合适。它的门槛最低，不会对社交生活造成太大影响，而且身体通常在两周内就能适应。&lt;/p&gt;
&lt;h2 id=&#34;断食期间可以喝咖啡吗&#34;&gt;断食期间可以喝咖啡吗？&lt;/h2&gt;
&lt;p&gt;无糖黑咖啡可以。它热量极低，不会打破断食状态，还有一定的抑制食欲效果。绿茶、花草茶同理。&lt;/p&gt;
&lt;p&gt;加了奶或糖就不行了——哪怕是一点点也会激活胰岛素分泌，打破断食的代谢状态。&lt;/p&gt;
&lt;p&gt;断食期间可以喝的东西：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;水（白水、气泡水、加柠檬片的水）&lt;/li&gt;
&lt;li&gt;黑咖啡（不加任何东西）&lt;/li&gt;
&lt;li&gt;绿茶、红茶、花草茶（无糖）&lt;/li&gt;
&lt;li&gt;苹果醋兑水（少量）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;需要注意的是，代糖（如阿斯巴甜、赤藓糖醇）虽然没有热量，但有研究表明它们可能引起胰岛素的条件反射分泌。如果你追求严格的断食效果，最好也避免。&lt;/p&gt;
&lt;h2 id=&#34;会掉肌肉吗&#34;&gt;会掉肌肉吗？&lt;/h2&gt;
&lt;p&gt;在保证蛋白质摄入充足（每公斤体重至少 1.2g）并坚持力量训练的前提下，掉肌肉的风险很低。&lt;/p&gt;
&lt;p&gt;身体在断食状态下会优先燃烧脂肪，而不是分解肌肉——前提是你不处于极度热量赤字。&lt;/p&gt;
&lt;p&gt;一些具体建议：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;蛋白质分配&lt;/strong&gt;：把每日蛋白质需求分散到两顿正餐中，每顿 30-40g，吸收效率最高&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;训练时机&lt;/strong&gt;：在进食窗口内或刚结束时训练效果最好，此时身体有足够的氨基酸供应&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;补剂&lt;/strong&gt;：如果担心，可以在进食窗口开始时补充 BCAA 或乳清蛋白&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;不要过度节食&lt;/strong&gt;：断食不等于节食，进食窗口内要吃够基础代谢所需的热量&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;实际上，很多人反映在间歇性断食配合适当力量训练后，体脂率下降的同时肌肉量反而有所增加。关键在于吃得够、练得对。&lt;/p&gt;
&lt;h2 id=&#34;断食期间饿了怎么办&#34;&gt;断食期间饿了怎么办？&lt;/h2&gt;
&lt;p&gt;刚开始的前两周，饥饿感是最明显的。几个实用的应对方法：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;喝水&lt;/strong&gt;：很多时候口渴和饥饿的信号容易混淆，先喝一杯水等 15 分钟&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;黑咖啡&lt;/strong&gt;：咖啡因有明显的抑制食欲效果&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;保持忙碌&lt;/strong&gt;：饥饿感是波浪式的，通常持续 15-20 分钟就会消退。投入到工作中，等注意力转移后就不觉得饿了&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;慢慢缩窗口&lt;/strong&gt;：如果 16:8 太难，先从 12:12 开始（比如晚 8 点到早 8 点不吃），每周推迟一小时进食，逐步过渡&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;一般坚持两周后，身体会适应新的进食节奏，饥饿感会显著减弱。很多人甚至会觉得早餐不再必要。&lt;/p&gt;
&lt;h2 id=&#34;对健康有什么好处&#34;&gt;对健康有什么好处？&lt;/h2&gt;
&lt;p&gt;除了减脂，间歇性断食还有一些被研究支持的潜在好处：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;改善胰岛素敏感性&lt;/strong&gt;：断食期间胰岛素水平下降，细胞对胰岛素的敏感度提高，有助于预防 2 型糖尿病&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;促进自噬&lt;/strong&gt;：细胞在断食状态下会启动自我清理机制，清除受损的蛋白质和细胞器。这个发现获得了 2016 年诺贝尔生理学或医学奖&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;降低炎症标记物&lt;/strong&gt;：多项研究表明间歇性断食可以降低 C 反应蛋白等炎症指标&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;改善心血管健康&lt;/strong&gt;：部分研究发现断食可以降低血压、改善血脂谱&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;提升认知清晰度&lt;/strong&gt;：很多人反映断食期间注意力更集中，可能与酮体供能有关&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;不过需要指出的是，很多研究还停留在动物实验阶段，人体的长期效果仍需要更多数据支撑。&lt;/p&gt;
&lt;h2 id=&#34;不适合哪些人&#34;&gt;不适合哪些人？&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;孕期、哺乳期女性&lt;/li&gt;
&lt;li&gt;有低血糖史或进食障碍史的人&lt;/li&gt;
&lt;li&gt;正在服用需要随餐吃的药物的人&lt;/li&gt;
&lt;li&gt;体重过轻（BMI &amp;lt; 18.5）的人&lt;/li&gt;
&lt;li&gt;糖尿病患者（尤其是使用胰岛素的）&lt;/li&gt;
&lt;li&gt;青少年和发育期的儿童&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;有慢性病或长期用药的人，建议先咨询医生再尝试。&lt;/p&gt;
&lt;h2 id=&#34;执行上的几个细节&#34;&gt;执行上的几个细节&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;进食窗口怎么选？&lt;/strong&gt; 大多数人选中午 12 点到晚上 8 点，因为这样可以和同事吃午饭、和家人吃晚饭。但如果你是早起型的人，选上午 10 点到下午 6 点也完全可以。关键是保持一致。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;周末可以放松吗？&lt;/strong&gt; 可以，但不建议完全打破节奏。周末把窗口调成 14:10 或 12:12 就够了，周一再回到 16:8。频繁地完全中断会让身体不断重新适应，反而更难受。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;要不要计算热量？&lt;/strong&gt; 前期建议大致记录一下，确保自己没有在进食窗口内暴食。等养成习惯后可以不记——8 小时的进食窗口天然限制了你吃太多。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;断食可以和生酮搭配吗？&lt;/strong&gt; 可以，而且效果会叠加。生酮饮食本身就会让身体进入酮供能状态，配合断食会更高效。但两者同时开始对身体的冲击比较大，建议先适应断食再尝试生酮。&lt;/p&gt;
&lt;h2 id=&#34;我的建议&#34;&gt;我的建议&lt;/h2&gt;
&lt;p&gt;间歇性断食不是什么神奇的减肥法，它本质上是一种进食时间管理工具。它的最大优势在于简单——不需要计算卡路里、不需要买特殊食物、不需要改变你吃什么，只需要调整你什么时候吃。&lt;/p&gt;
&lt;p&gt;如果你正在考虑尝试，我的建议是：从 16:8 开始，坚持两周看看感觉。不要对自己太严格，偶尔破戒也没关系。重要的是建立一个可以长期维持的节奏，而不是追求短期的极端效果。&lt;/p&gt;
]]></content:encoded></item><item><title>开源大模型生态 2025 年中盘点</title><link>https://blog.rootfly.xyz/post/llm-2025/</link><pubDate>Thu, 16 Apr 2026 00:00:00 +0000</pubDate><guid>https://blog.rootfly.xyz/post/llm-2025/</guid><description>2025 年上半年开源大模型生态盘点，涵盖端侧部署、多模态、工具调用三大趋势。</description><content:encoded><![CDATA[&lt;p&gt;2025 年上半年，开源大模型赛道持续升温。多个头部团队相继发布参数规模在 700B 以上的新模型，推理效率较去年同期提升显著。&lt;/p&gt;
&lt;h2 id=&#34;三大趋势&#34;&gt;三大趋势&lt;/h2&gt;
&lt;h3 id=&#34;端侧部署普及&#34;&gt;端侧部署普及&lt;/h3&gt;
&lt;p&gt;4B 以下的小模型在手机、边缘设备上的落地场景快速增多。量化技术的成熟让普通消费级 GPU 也能流畅运行 7B 模型。&lt;/p&gt;
&lt;p&gt;具体来看：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;手机端&lt;/strong&gt;：苹果的 Core ML 和高通的 AI Engine 都在加速适配小模型，Llama 3.2 3B 在 iPhone 15 Pro 上可以实现每秒 30+ token 的生成速度&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;边缘设备&lt;/strong&gt;：NVIDIA Jetson、树莓派 5 等设备跑 7B 模型已经不是新鲜事，量化到 4-bit 后内存占用可以控制在 4GB 以内&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;桌面端&lt;/strong&gt;：Ollama、LM Studio 等工具让本地部署变得极其简单，一行命令就能跑起来&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这个趋势的意义在于：很多对延迟敏感、对隐私要求高的场景（如医疗问诊、企业内部知识库）不再需要把数据送到云端。&lt;/p&gt;
&lt;h3 id=&#34;多模态能力标配化&#34;&gt;多模态能力标配化&lt;/h3&gt;
&lt;p&gt;图文理解已成为主流开源模型的基础能力，视频理解正在跟进。以前需要专门的视觉模型，现在一个通用模型就能搞定。&lt;/p&gt;
&lt;p&gt;几个关键进展：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;图文理解&lt;/strong&gt;：Llama 3.2 Vision、Qwen2.5-VL 等模型在图表理解、OCR、文档解析等任务上已经接近商业 API 的水平&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;视频理解&lt;/strong&gt;：虽然还处于早期，但已经出现了可以处理短视频（30 秒以内）并回答问题的开源模型&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;音频理解&lt;/strong&gt;：Whisper 的后继者们在语音识别和理解上持续进步，多语言支持越来越好&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;跨模态生成&lt;/strong&gt;：文生图领域 Stable Diffusion 3 和 FLUX 系列开源后，图片生成的质量和可控性有了质的飞跃&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;多模态能力的普及意味着开发者可以用一个模型处理多种类型的数据，降低了应用架构的复杂度。&lt;/p&gt;
&lt;h3 id=&#34;工具调用成熟度提升&#34;&gt;工具调用成熟度提升&lt;/h3&gt;
&lt;p&gt;多个模型在 BFCL 等基准上接近或超越闭源模型，Agent 应用的可靠性有了实质性进步。&lt;/p&gt;
&lt;p&gt;工具调用（Function Calling）是大模型走向实际应用的关键能力。2025 年的变化包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;标准化&lt;/strong&gt;：OpenAI 定义的 function calling 格式已经成为事实标准，主流开源模型都支持&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;准确率提升&lt;/strong&gt;：在 Berkeley Function Calling Leaderboard 上，开源模型的最佳成绩已经非常接近 GPT-4&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;复杂调用&lt;/strong&gt;：从单步调用发展到多步调用、嵌套调用、并行调用，模型可以完成更复杂的任务链&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MCP 协议&lt;/strong&gt;：Anthropic 推出的 Model Context Protocol 为工具调用提供了统一的接口规范，生态正在快速建立&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;值得关注的模型&#34;&gt;值得关注的模型&lt;/h2&gt;
&lt;h3 id=&#34;llama-系列&#34;&gt;Llama 系列&lt;/h3&gt;
&lt;p&gt;Meta 持续更新，生态最完善，微调资源最多。Llama 3.1 提供了 8B、70B、405B 三个规格，覆盖从端侧到云端的完整需求。Hugging Face 上的衍生模型超过 10 万个，社区活跃度无人能及。&lt;/p&gt;
&lt;p&gt;优势：社区大、资源多、微调工具链成熟。
劣势：中文能力相对弱于 Qwen，大规格模型的推理成本高。&lt;/p&gt;
&lt;h3 id=&#34;qwen-系列&#34;&gt;Qwen 系列&lt;/h3&gt;
&lt;p&gt;阿里出品，中文能力突出，对中文用户友好。Qwen 2.5 在多个中文基准上表现优异，同时英文能力也在快速追赶。最新的 Qwen 2.5 提供了从 0.5B 到 72B 的完整规格线。&lt;/p&gt;
&lt;p&gt;优势：中文能力强、规格线完整、开源协议友好。
劣势：英文社区影响力不如 Llama，部分工具链适配滞后。&lt;/p&gt;
&lt;h3 id=&#34;mistral-系列&#34;&gt;Mistral 系列&lt;/h3&gt;
&lt;p&gt;法国团队，以小博大，推理效率高。Mistral 的模型以参数效率著称——用更少的参数达到相近的效果。Mixtral 8x7B 的 MoE 架构在推理时只激活部分参数，实现了性能和效率的平衡。&lt;/p&gt;
&lt;p&gt;优势：推理效率高、架构创新、欧洲数据合规友好。
劣势：大规格模型缺失，中文能力一般。&lt;/p&gt;
&lt;h3 id=&#34;deepseek-系列&#34;&gt;DeepSeek 系列&lt;/h3&gt;
&lt;p&gt;国内团队 DeepSeek 在 2025 年初的表现令人瞩目。DeepSeek-V3 和 R1 在推理任务上展现了极强的竞争力，尤其是 R1 的思维链推理能力在数学和编程任务上接近甚至超越闭源模型。&lt;/p&gt;
&lt;p&gt;优势：推理能力强、开源彻底、训练成本控制出色。
劣势：生态还在建设中，企业级部署工具链不够完善。&lt;/p&gt;
&lt;h2 id=&#34;闭源-vs-开源&#34;&gt;闭源 vs 开源&lt;/h2&gt;
&lt;p&gt;分析人士指出，开源与闭源之间的能力差距正在缩小，但在复杂推理和超长上下文任务上仍有明显差距。对于大多数实际应用场景，开源模型已经足够。&lt;/p&gt;
&lt;p&gt;几个具体维度的对比：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;维度&lt;/th&gt;
          &lt;th&gt;开源&lt;/th&gt;
          &lt;th&gt;闭源&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;通用对话&lt;/td&gt;
          &lt;td&gt;接近&lt;/td&gt;
          &lt;td&gt;略优&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;复杂推理&lt;/td&gt;
          &lt;td&gt;差距缩小&lt;/td&gt;
          &lt;td&gt;仍有优势&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;代码生成&lt;/td&gt;
          &lt;td&gt;接近&lt;/td&gt;
          &lt;td&gt;接近&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;多模态&lt;/td&gt;
          &lt;td&gt;快速追赶&lt;/td&gt;
          &lt;td&gt;领先半年&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;超长上下文&lt;/td&gt;
          &lt;td&gt;差距较大&lt;/td&gt;
          &lt;td&gt;明显优势&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;成本控制&lt;/td&gt;
          &lt;td&gt;优势明显&lt;/td&gt;
          &lt;td&gt;API 费用高&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;数据隐私&lt;/td&gt;
          &lt;td&gt;完全可控&lt;/td&gt;
          &lt;td&gt;依赖第三方&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;对于企业来说，选择开源还是闭源不再是一个非此即彼的问题。很多团队的做法是：核心业务用开源模型私有化部署，探索性项目用闭源 API 快速验证。&lt;/p&gt;
&lt;h2 id=&#34;开发者生态&#34;&gt;开发者生态&lt;/h2&gt;
&lt;p&gt;2025 年开源大模型的开发者生态也发生了显著变化：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;微调工具链成熟&lt;/strong&gt;：Axolotl、LLaMA-Factory、Unsloth 等工具让微调的门槛大幅降低。以前需要写大量训练代码，现在准备好数据集、选好参数就能开始训练。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;推理引擎竞争&lt;/strong&gt;：vLLM、TensorRT-LLM、SGLang 等推理引擎在吞吐量和延迟上持续优化，部署成本进一步下降。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;评估标准统一&lt;/strong&gt;：Open LLM Leaderboard、AlpacaEval、MT-Bench 等评估基准帮助开发者快速对比不同模型的表现。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;模型合并兴起&lt;/strong&gt;：不需要训练，通过合并多个现有模型的权重来创造新模型。DARE、TIES 等合并策略让社区可以快速迭代出针对特定场景优化的模型。&lt;/p&gt;
&lt;h2 id=&#34;展望&#34;&gt;展望&lt;/h2&gt;
&lt;p&gt;2025 年下半年，几个方向值得持续关注：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;推理效率&lt;/strong&gt;：MoE 架构和投机解码（Speculative Decoding）技术会进一步降低推理成本&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;长上下文&lt;/strong&gt;：128K 以上的上下文窗口会成为标配，RAG 的必要性可能会被重新评估&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Agent 生态&lt;/strong&gt;：模型能力不再是瓶颈，Agent 框架和工具生态会成为竞争焦点&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;合成数据&lt;/strong&gt;：用大模型生成训练数据来训练小模型的范式会更加成熟&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;开源大模型的黄金时代才刚刚开始。&lt;/p&gt;
]]></content:encoded></item><item><title>设计系统演示 (Design System Demo)</title><link>https://blog.rootfly.xyz/post/design-system-demo/</link><pubDate>Thu, 16 Apr 2026 00:00:00 +0000</pubDate><guid>https://blog.rootfly.xyz/post/design-system-demo/</guid><description>展示博客&amp;#34;克制、书卷气&amp;#34;设计语言的演示文章，涵盖文本排版、引用块、代码高亮、数学公式等常见 Markdown 元素。</description><content:encoded><![CDATA[&lt;p&gt;本文是一篇用于展示“克制、书卷气”前端设计的演示文章。它尽可能详尽地包含了博客排版中常见的所有基础与高级 Markdown 元素，方便您直观地预览全局设计语言。&lt;/p&gt;
&lt;h2 id=&#34;1-文本排版与格式&#34;&gt;1. 文本排版与格式&lt;/h2&gt;
&lt;p&gt;在这里，我们测试基础的文字排版效果。我们选用了&lt;strong&gt;华文中宋&lt;/strong&gt;作为主要字体，赋予页面纸质阅读的沉浸感。大行高（&lt;code&gt;2.0&lt;/code&gt;）与适当的字间距（&lt;code&gt;0.02em&lt;/code&gt;）让视线能够在字里行间自由呼吸。&lt;/p&gt;
&lt;p&gt;这也是一段包含&lt;strong&gt;加粗 (Bold)&lt;/strong&gt;、&lt;em&gt;斜体 (Italic)&lt;/em&gt;、&lt;del&gt;删除线 (Strikethrough)&lt;/del&gt; 以及 &lt;mark&gt;高亮标记 (Highlight)&lt;/mark&gt; 的测试文本。中英文混排时，适当的间距也是优雅阅读的关键，例如 Apple、Design 以及 Typography。我们还可以添加上标和下标：H&lt;sub&gt;2&lt;/sub&gt;O 和 X&lt;sup&gt;2&lt;/sup&gt;。&lt;/p&gt;
&lt;p&gt;如果你需要引用外部链接，可以点击 &lt;a href=&#34;https://google.com&#34;&gt;这里访问 Google&lt;/a&gt; 或者查看 &lt;a href=&#34;#fn:1&#34;&gt;文章底部的脚注&lt;/a&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;2-杂志风引用块&#34;&gt;2. 杂志风引用块&lt;/h2&gt;
&lt;p&gt;这是我们最新优化的杂志风格引用块。它去除了沉重的背景和边框，回归文字本身的力量：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“在一片喧嚣的互联网中，克制是一种稀缺的品质。设计不是为了填满屏幕，而是为了引导视线，让读者与文字本身产生对话。”&lt;/p&gt;
&lt;p&gt;—— 摘自《设计与留白》&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;并且它支持多段落和嵌套：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;第一层引用，讨论了排版的基本原则。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;这是嵌套的第二层引用，通常用于引用中的引用或多重视角对话。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;3-媒体与图片融合&#34;&gt;3. 媒体与图片融合&lt;/h2&gt;
&lt;p&gt;在亮色模式下，图片会带有极其微弱的 1px 边框；而在深色模式下，它会自动降低亮度并去除边框（Media Blending），以免刺伤眼睛。鼠标悬浮于图片之上时可恢复其原本的亮度。&lt;/p&gt;
&lt;p&gt;
  &lt;img src=&#34;https://blog.rootfly.xyz/post/design-system-demo/demo.jpg&#34;
       alt=&#34;演示图片&#34;
       loading=&#34;lazy&#34;
       decoding=&#34;async&#34;
       width=&#34;800&#34;
       height=&#34;400&#34;&gt;
&lt;/p&gt;
&lt;h2 id=&#34;4-代码块与视觉降噪&#34;&gt;4. 代码块与视觉降噪&lt;/h2&gt;
&lt;p&gt;所有的代码块顶部都加上了轻盈的红黄绿小圆点（Mac-style dots）。同时，原生厚重的复制按钮被隐藏了。当您&lt;strong&gt;将鼠标悬浮在代码块上&lt;/strong&gt;时，右上角的语言标签（如 PYTHON）会优雅地隐去，而纯文本的 &lt;code&gt;Copy&lt;/code&gt; 按钮会平滑地在原位置浮现出来。代码的字体也做了 Fallback 优化。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;div class=&#34;chroma&#34;&gt;
&lt;table class=&#34;lntable&#34;&gt;&lt;tr&gt;&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code&gt;&lt;span class=&#34;lnt&#34;&gt; 1
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 2
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 3
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 4
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 5
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 6
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 7
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 8
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt; 9
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;10
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;11
&lt;/span&gt;&lt;span class=&#34;lnt&#34;&gt;12
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class=&#34;lntd&#34;&gt;
&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt; &lt;span class=&#34;nf&#34;&gt;fibonacci&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;s2&#34;&gt;&amp;#34;&amp;#34;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;    计算斐波那契数列的第 n 项
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;s2&#34;&gt;    &amp;#34;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;n&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;elif&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;n&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;        &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fibonacci&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fibonacci&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;n&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# 测试代码&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;print&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;sa&#34;&gt;f&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;The 10th Fibonacci number is &lt;/span&gt;&lt;span class=&#34;si&#34;&gt;{&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;fibonacci&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;si&#34;&gt;}&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;我们也支持行内代码的渲染：例如在终端中执行 &lt;code&gt;sudo apt update&lt;/code&gt; 或 &lt;code&gt;npm install&lt;/code&gt;。&lt;/p&gt;
&lt;h2 id=&#34;5-复杂的表格&#34;&gt;5. 复杂的表格&lt;/h2&gt;
&lt;p&gt;下面展示了一个支持对齐方式的 Markdown 表格排版，表格本身也没有多余的粗边框，保持极致干净：&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th style=&#34;text-align: left&#34;&gt;属性 (左对齐)&lt;/th&gt;
          &lt;th style=&#34;text-align: center&#34;&gt;值 (居中)&lt;/th&gt;
          &lt;th style=&#34;text-align: right&#34;&gt;描述 (右对齐)&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;margin&lt;/code&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;10px&lt;/code&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;控制外边距&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;padding&lt;/code&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;2em&lt;/code&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;控制内边距&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td style=&#34;text-align: left&#34;&gt;&lt;code&gt;border&lt;/code&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: center&#34;&gt;&lt;code&gt;none&lt;/code&gt;&lt;/td&gt;
          &lt;td style=&#34;text-align: right&#34;&gt;移除所有边框&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;6-列表系统&#34;&gt;6. 列表系统&lt;/h2&gt;
&lt;p&gt;无序列表，常用于随意的列举：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第一项：极简滚动条 (Minimalist Scrollbar)&lt;/li&gt;
&lt;li&gt;第二项：极细分割线 (Hairline Borders)
&lt;ul&gt;
&lt;li&gt;子项目 A&lt;/li&gt;
&lt;li&gt;子项目 B&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;第三项：双主题平滑切换 (Dark/Light mode)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;有序列表，带有明确的顺序：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;构思设计语言&lt;/li&gt;
&lt;li&gt;调整 CSS 变量
&lt;ol&gt;
&lt;li&gt;定义颜色&lt;/li&gt;
&lt;li&gt;调整间距&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;部署与重构&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;任务列表（Task List），用于待办事项跟踪：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 修复 LaTeX 无法渲染的问题&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 优化代码块文字与右上角按钮交互&lt;/li&gt;
&lt;li&gt;&lt;input checked=&#34;&#34; disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 补全所有 Markdown 元素的测试样例&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&#34;&#34; type=&#34;checkbox&#34;&gt; 继续撰写新的博客文章&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;7-数学公式-latex&#34;&gt;7. 数学公式 (LaTeX)&lt;/h2&gt;
&lt;p&gt;感谢注入了 KaTeX 引擎，现在博客可以完美渲染复杂的数学公式了。&lt;/p&gt;
&lt;p&gt;这是行内公式的展示：质能方程 $E = mc^2$ 以及欧拉公式 $e^{i\pi} + 1 = 0$。&lt;/p&gt;
&lt;p&gt;这是块级公式（Display Math）的展示，支持多行和积分等复杂符号：&lt;/p&gt;
$$
\mathcal{L} = \int \left( \frac{1}{2} (\partial_\mu \phi)(\partial^\mu \phi) - \frac{1}{2} m^2 \phi^2 \right) d^4x
$$$$
f(x) = \int_{-\infty}^\infty \hat f(\xi)\,e^{2 \pi i \xi x} \,d\xi
$$&lt;h2 id=&#34;8-交互折叠块-details--summary&#34;&gt;8. 交互折叠块 (Details / Summary)&lt;/h2&gt;
&lt;p&gt;我们还为原生的 HTML 折叠块添加了平滑的下拉动画：&lt;/p&gt;
&lt;p&gt;{{&amp;lt; details &amp;ldquo;点击这里展开查看隐藏的惊喜&amp;rdquo; &amp;gt;}}
这是被隐藏的内容！在点击上方文字后，它会带有平滑的向下展开动画（slide-down animation）浮现出来。非常适合用于剧透警告或大段非核心代码的折叠。
{{&amp;lt; /details &amp;gt;}}&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id=&#34;总结&#34;&gt;总结&lt;/h2&gt;
&lt;p&gt;所有的细节（如边框、阴影、间距、字体权重的把控，以及修复后的代码展示与数学公式）共同构成了目前的“纯粹书卷”风格。您可以利用右上角的太阳/月亮图标，随时切换深浅模式，查看这些元素在不同光线下的表现。&lt;/p&gt;
]]></content:encoded></item><item><title>一个人的深夜食堂</title><link>https://blog.rootfly.xyz/post/midnight-kitchen/</link><pubDate>Thu, 16 Apr 2026 00:00:00 +0000</pubDate><guid>https://blog.rootfly.xyz/post/midnight-kitchen/</guid><description>凌晨十二点，给自己做一顿简单的深夜料理。</description><content:encoded><![CDATA[&lt;p&gt;凌晨十二点，冰箱里只剩半块豆腐、两个鸡蛋和一把小葱。&lt;/p&gt;
&lt;p&gt;这种时候不适合想太多。烧水、切豆腐、打蛋，动作自然而然地接起来。油热了倒进去，滋的一声，整间厨房一下子有了烟火气。&lt;/p&gt;
&lt;p&gt;做好端上桌，配一碗白米饭，窗外偶尔有车驶过。没什么特别的，但吃完感觉好多了。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;深夜做饭这件事，有一种白天很难体会到的专注。&lt;/p&gt;
&lt;p&gt;白天做饭的时候，脑子里总在转别的事情——下午的会议、还没回的消息、明天要交的东西。刀在切菜，心思却不在。有时候切完一盘黄瓜，发现自己根本不记得是怎么切的。&lt;/p&gt;
&lt;p&gt;但深夜不一样。整个世界都安静了，没有消息要回，没有电话会响。你只需要面对眼前的食材，听油在锅里的声音，闻葱花遇到热油时瞬间爆发的香气。每一个动作都被放大了，每一个细节都变得清晰。&lt;/p&gt;
&lt;p&gt;这种专注本身就很治愈。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;我深夜做得最多的是三样东西：蛋炒饭、番茄鸡蛋面、葱油拌面。&lt;/p&gt;
&lt;p&gt;蛋炒饭的关键是隔夜饭。刚煮好的米饭太湿，炒不出粒粒分明的效果。头天晚上多煮一点，放冰箱过夜，第二天晚上拿出来刚好。油热了先把蛋液倒进去，半凝固的时候把饭倒进去一起翻炒，让每一粒米都裹上蛋液。最后撒一把葱花，盐都不用放太多，米饭本身的甜味就出来了。&lt;/p&gt;
&lt;p&gt;番茄鸡蛋面更简单。番茄切块，炒出汁，加水煮开，下面条，打个蛋花进去。整个过程不超过十分钟，但热汤下肚的那一刻，整个人从胃暖到心。&lt;/p&gt;
&lt;p&gt;葱油拌面是跟一个朋友学的。小葱切段，小火慢炸，等葱变成深棕色、变得酥脆的时候捞出来。面条煮好过凉水，拌上葱油、生抽、一点点糖。简单到不能再简单，但那个葱油的香气能让人暂时忘掉所有烦心事。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;深夜做饭还有个好处：没有人评判你。&lt;/p&gt;
&lt;p&gt;白天做饭，总会不自觉地想这道菜够不够好看、味道够不够好、是不是太简单了。但深夜的厨房是完全属于你自己的空间。你可以把鸡蛋煎糊了重来，可以把面条煮烂了也照吃，可以把所有调料都放多一点——反正是给自己吃的，怎么开心怎么来。&lt;/p&gt;
&lt;p&gt;我有个朋友说，他深夜最喜欢做的是泡面加芝士片和午餐肉。听起来很粗糙，但他说那是他一天中最放松的时刻。我觉得这就够了。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;有时候做着做着，会想起一些很久没想起的事。&lt;/p&gt;
&lt;p&gt;切豆腐的时候想起小时候妈妈做麻婆豆腐的样子——她总是先把豆腐在盐水里泡一会儿，说这样豆腐不容易碎。我不知道这个技巧有没有科学依据，但我每次切豆腐前都会泡一下，好像这样就能和她多一点联系。&lt;/p&gt;
&lt;p&gt;打蛋的时候想起大学食堂的番茄炒蛋。食堂阿姨做的番茄炒蛋永远是甜的，我一开始觉得奇怪，后来吃了四年，竟然也习惯了。现在自己做的时候，偶尔也会放一小勺糖。&lt;/p&gt;
&lt;p&gt;食物是记忆的容器。你以为你只是在做饭，其实你是在和过去的自己对话。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;很多时候治愈自己的方式就这么朴素：给自己认认真真做一顿饭，哪怕只是豆腐炒蛋。&lt;/p&gt;
&lt;p&gt;不需要摆盘，不需要发朋友圈，就是坐在自己家的桌前，安静地吃完，然后洗碗，然后睡觉。&lt;/p&gt;
&lt;p&gt;有时候我觉得，一个人能把自己照顾好，就已经很了不起了。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;吃完饭，把碗筷洗干净放好，擦干净灶台。厨房恢复整洁，好像什么都没发生过。&lt;/p&gt;
&lt;p&gt;但你知道，那顿饭已经安安静静地完成了它的使命。&lt;/p&gt;
&lt;p&gt;关灯，回房间。窗外的城市还在运转，但此刻的你是安静的。带着一点点饱足感和一点点困意，钻进被窝。&lt;/p&gt;
&lt;p&gt;明天又是新的一天，但至少今晚，你好好吃了顿饭。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;我认识的人里，深夜做饭的不少。&lt;/p&gt;
&lt;p&gt;有个朋友喜欢在凌晨烤面包。他说喜欢面团发酵的过程——你把酵母揉进去，然后等待，面团会自己膨胀起来。这种&amp;quot;你什么都不用做，它自己会变好&amp;quot;的感觉让他安心。&lt;/p&gt;
&lt;p&gt;另一个朋友深夜只煮粥。白米粥，什么都不加，煮到米粒开花。她说小时候生病了妈妈就煮这个，所以每次觉得累的时候就想喝一碗。&lt;/p&gt;
&lt;p&gt;还有人深夜只泡茶。不是什么名贵的茶，就是普通的茉莉花茶，烧一壶开水，看茶叶在杯子里慢慢舒展。喝茶本身不算做饭，但那种仪式感是一样的——你在用一个简单的动作告诉自己：今天到此为止了。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;深夜的厨房是一个很特别的空间。&lt;/p&gt;
&lt;p&gt;它不像白天的厨房那样功能明确——早餐匆匆忙忙烤个面包，午餐晚餐有固定的菜式。深夜的厨房是自由的，你可以做任何你想做的东西，没有&amp;quot;应该吃什么&amp;quot;的约束。&lt;/p&gt;
&lt;p&gt;也不像深夜的酒吧或便利店——那些地方虽然也属于深夜，但它们是公共的，你只是其中一个顾客。厨房是完全私密的，只有你一个人，只有你和食物之间的对话。&lt;/p&gt;
&lt;p&gt;我觉得每个人家里都应该有一个这样的角落。不一定是厨房，也可以是阳台、书房、甚至浴室。一个你在深夜可以去的地方，做一件简单的事，让自己从白天的喧嚣中安静下来。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;写到这里，已经凌晨一点了。&lt;/p&gt;
&lt;p&gt;窗外的车声更少了，远处偶尔传来一两声狗叫。厨房的灯还亮着，灶台擦得很干净，锅里还有一点余温。&lt;/p&gt;
&lt;p&gt;明天我会在正常时间起床，正常时间吃早饭、午饭、晚饭。深夜做饭这件事会被日常的节奏覆盖，就像什么都没发生过。&lt;/p&gt;
&lt;p&gt;但我知道，在某个睡不着的夜晚，我还会走进厨房，打开冰箱，看看有什么能做的。&lt;/p&gt;
&lt;p&gt;因为有些时候，最好的治愈不是别的，就是给自己认认真真做一顿饭。&lt;/p&gt;
]]></content:encoded></item><item><title>用了三个月 Obsidian，我有话说</title><link>https://blog.rootfly.xyz/post/obsidian-review/</link><pubDate>Thu, 16 Apr 2026 00:00:00 +0000</pubDate><guid>https://blog.rootfly.xyz/post/obsidian-review/</guid><description>使用 Obsidian 三个月后的真实体验，从本地存储、双向链接到插件生态。</description><content:encoded><![CDATA[&lt;p&gt;三个月前，我把笔记软件从 Notion 换成了 Obsidian。现在回头看，这是今年做得最对的几件事之一。&lt;/p&gt;
&lt;h2 id=&#34;最喜欢的地方&#34;&gt;最喜欢的地方&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;本地存储&lt;/strong&gt;让我彻底告别了万一服务器挂了怎么办的焦虑。所有笔记都是纯 Markdown 文件，用任何编辑器都能打开。&lt;/p&gt;
&lt;p&gt;这一点在实际使用中比想象中更重要。Notion 的数据导出虽然支持 Markdown，但格式经常出问题——嵌套的数据库、内嵌的图片、复杂的表格，导出来基本没法直接用。而 Obsidian 的笔记从第一天起就是标准 Markdown，不管你以后换什么工具，这些笔记都能无缝迁移。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;双向链接&lt;/strong&gt;一开始觉得是噱头，用了一段时间后发现它真的改变了我的思维方式——记录一个想法时，自然会去想它和哪些旧知识有关联。&lt;/p&gt;
&lt;p&gt;举个例子：我在写一篇关于 Docker 的笔记时，提到了网络配置。在 Notion 里我可能就写一句&amp;quot;详见网络配置文档&amp;quot;然后放个链接。但在 Obsidian 里，我直接写 &lt;code&gt;[[Docker 网络配置]]&lt;/code&gt;，这会自动建立双向关联——以后打开&amp;quot;Docker 网络配置&amp;quot;那篇笔记时，我能直接看到谁引用了它。&lt;/p&gt;
&lt;p&gt;时间长了，这些关联形成了一张知识网络。用 Obsidian 自带的 Graph View 看，你能直观地看到哪些概念联系紧密、哪些领域你还涉足不深。这种可视化的知识地图是传统文件夹结构做不到的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;插件生态&lt;/strong&gt;非常丰富。从日历视图、Kanban 看板到 LaTeX 公式渲染，几乎你能想到的需求都有插件覆盖。&lt;/p&gt;
&lt;p&gt;我目前在用的插件清单：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Calendar&lt;/strong&gt;：日历视图，快速定位到某一天的日记&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dataview&lt;/strong&gt;：把笔记当数据库查询，比如&amp;quot;列出所有未完成的任务&amp;quot;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Templater&lt;/strong&gt;：高级模板引擎，新建笔记自动填充日期、标题等&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tasks&lt;/strong&gt;：跨笔记的任务管理，支持到期日、重复任务&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Excalidraw&lt;/strong&gt;：在笔记里嵌入手绘图，适合画架构图和流程图&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kanban&lt;/strong&gt;：看板视图，适合项目管理&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Git&lt;/strong&gt;：自动同步笔记到 Git 仓库，相当于免费的版本控制和备份&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;不太满意的地方&#34;&gt;不太满意的地方&lt;/h2&gt;
&lt;p&gt;移动端体验比桌面端差一截，同步需要额外付费或自己折腾 iCloud / Syncthing。对于重度手机用户来说，这是一个实际的障碍。&lt;/p&gt;
&lt;p&gt;具体来说：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;同步方案&lt;/strong&gt;：官方的 Obsidian Sync 要 8 美元一个月，对个人用户来说不算便宜。免费方案是 iCloud（仅限苹果设备）或 Syncthing（需要一定技术能力）。我目前用的是 iCloud，偶尔会遇到同步冲突&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;移动端性能&lt;/strong&gt;：打开大型 Vault 时明显比桌面端慢，插件加载也需要等&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;编辑体验&lt;/strong&gt;：手机上编辑 Markdown 不如在电脑上顺畅，尤其是长文档&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;学习曲线也比 Notion 陡一些——刚上手时面对空白的 Vault 可能会有点迷茫，不知道从哪里开始组织。&lt;/p&gt;
&lt;p&gt;Notion 的开箱即用体验确实更好：数据库、看板、日历都是内置的，不需要装插件就能用。而 Obsidian 的很多核心功能需要通过插件实现，新手面对上百个插件可能会选择困难。&lt;/p&gt;
&lt;p&gt;我的建议是：不要一开始就装太多插件。先用原生功能写两周笔记，等你真正感到&amp;quot;要是有个 XX 功能就好了&amp;quot;的时候，再去搜插件。这样你装的每一个插件都是真正需要的，不会被花哨的功能分散注意力。&lt;/p&gt;
&lt;h2 id=&#34;和-notion-的对比&#34;&gt;和 Notion 的对比&lt;/h2&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;维度&lt;/th&gt;
          &lt;th&gt;Obsidian&lt;/th&gt;
          &lt;th&gt;Notion&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;数据存储&lt;/td&gt;
          &lt;td&gt;本地 Markdown 文件&lt;/td&gt;
          &lt;td&gt;云端专有格式&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;离线使用&lt;/td&gt;
          &lt;td&gt;完全支持&lt;/td&gt;
          &lt;td&gt;部分支持&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;双向链接&lt;/td&gt;
          &lt;td&gt;原生支持，体验好&lt;/td&gt;
          &lt;td&gt;支持但不够自然&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;插件生态&lt;/td&gt;
          &lt;td&gt;极其丰富&lt;/td&gt;
          &lt;td&gt;有限的集成&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;协作&lt;/td&gt;
          &lt;td&gt;弱（需要额外工具）&lt;/td&gt;
          &lt;td&gt;强（原生支持）&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;数据库&lt;/td&gt;
          &lt;td&gt;通过 Dataview 插件&lt;/td&gt;
          &lt;td&gt;原生支持，体验好&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;学习曲线&lt;/td&gt;
          &lt;td&gt;较陡&lt;/td&gt;
          &lt;td&gt;平缓&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;价格&lt;/td&gt;
          &lt;td&gt;免费（同步另算）&lt;/td&gt;
          &lt;td&gt;免费版有限制&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;数据导出&lt;/td&gt;
          &lt;td&gt;天然 Markdown&lt;/td&gt;
          &lt;td&gt;导出格式有限&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;简单来说：Obsidian 适合个人深度使用，Notion 适合团队协作。如果你的笔记主要是给自己看的，Obsidian 更好；如果需要频繁和别人共享、协作编辑，Notion 更方便。&lt;/p&gt;
&lt;h2 id=&#34;我的使用场景&#34;&gt;我的使用场景&lt;/h2&gt;
&lt;p&gt;经过三个月的摸索，我目前的 Obsidian 主要用于三个场景：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;技术笔记&lt;/strong&gt;：学习新技术时记录要点、代码示例、踩坑记录。用标签分类（&lt;code&gt;#docker&lt;/code&gt;、&lt;code&gt;#python&lt;/code&gt;、&lt;code&gt;#前端&lt;/code&gt;），用双向链接把相关概念串起来。这是我用得最多的部分。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;日记&lt;/strong&gt;：用 Templater 插件自动创建每日日记模板，记录当天做了什么、遇到什么问题、有什么想法。不用写很多，几句话就行。回头看的时候能清楚地看到自己这段时间在忙什么。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;项目管理&lt;/strong&gt;：用 Kanban 插件管理待办事项。每个项目一个看板，分&amp;quot;待办&amp;quot;、&amp;ldquo;进行中&amp;rdquo;、&amp;ldquo;已完成&amp;quot;三列。比单纯的待办清单更直观，也比 Notion 的数据库更轻量。&lt;/p&gt;
&lt;h2 id=&#34;适合谁用&#34;&gt;适合谁用&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;愿意花时间配置，且主要在电脑上工作的人 → &lt;strong&gt;强烈推荐&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;需要开箱即用、多端无缝同步 → Notion 可能更适合&lt;/li&gt;
&lt;li&gt;学术党、需要大量引用和 LaTeX → &lt;strong&gt;非常适合&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;程序员、技术人员 → &lt;strong&gt;强烈推荐&lt;/strong&gt;（Markdown 是你们的母语）&lt;/li&gt;
&lt;li&gt;写作者、需要长期积累知识体系的人 → &lt;strong&gt;非常推荐&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;需要团队协作、多人编辑 → &lt;strong&gt;不推荐&lt;/strong&gt;，用 Notion 或飞书&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;一些实用建议&#34;&gt;一些实用建议&lt;/h2&gt;
&lt;p&gt;如果你决定尝试 Obsidian，以下是我踩过坑后总结的建议：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;先用起来再优化&lt;/strong&gt;：不要花一周时间研究插件和主题，先写笔记。等你对工具足够熟悉后，再根据需求调整&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;文件夹结构保持简单&lt;/strong&gt;：三层以内就够了。我见过有人建了七八层目录，最后自己都找不到笔记在哪&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;善用标签&lt;/strong&gt;：标签比文件夹灵活，一个笔记可以有多个标签。我的习惯是用标签做主题分类，文件夹只按时间或项目分&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;定期回顾&lt;/strong&gt;：每周花 10 分钟翻翻最近的笔记，看看有没有可以合并或整理的。笔记不回顾等于没记&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;备份一定要有&lt;/strong&gt;：虽然本地存储很安全，但硬盘坏了就是没了。用 Git 或者云盘同步至少一份副本&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;常见问题&#34;&gt;常见问题&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Q：Obsidian 免费吗？&lt;/strong&gt;
A：软件本身完全免费，包括所有核心功能。收费的只有两个可选服务：Obsidian Sync（云同步，8 美元/月）和 Obsidian Publish（发布笔记为网站，16 美元/月）。对于大多数用户，免费功能完全够用。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q：从 Notion 迁移过来麻烦吗？&lt;/strong&gt;
A：Notion 支持批量导出为 Markdown，导出后丢进 Obsidian 的 Vault 文件夹就行。图片链接需要手动修复（Notion 导出的图片路径格式不同），但文本内容基本没问题。我迁移了大约 200 篇笔记，花了一个下午。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q：数据安全吗？&lt;/strong&gt;
A：本地存储意味着你的数据完全在你手里，不受任何服务商的影响。但反过来，你也需要自己负责备份。我的方案是 Git 仓库 + iCloud 双重备份，基本不用担心数据丢失。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Q：插件会不会导致笔记数据被读取？&lt;/strong&gt;
A：Obsidian 插件是运行在本地的 JavaScript 代码，理论上可以访问你的文件。但 Obsidian 的插件审核比较严格，而且代码都是开源的。如果你特别在意隐私，可以只安装你信任的插件，或者自己审查代码。&lt;/p&gt;
&lt;h2 id=&#34;最终评价&#34;&gt;最终评价&lt;/h2&gt;
&lt;p&gt;三个月用下来，Obsidian 给我最大的感受是：它尊重你的数据。&lt;/p&gt;
&lt;p&gt;不像 Notion 把你的笔记锁在云端、用专有格式存储，Obsidian 把一切交给你。你的笔记就是普通的 Markdown 文件，存在你的硬盘上，你想怎么备份就怎么备份，想用什么工具打开就用什么工具打开。&lt;/p&gt;
&lt;p&gt;这种开放性是有代价的——你需要自己处理同步、自己选择插件、自己组织结构。但换来的是完全的控制权和自由度。&lt;/p&gt;
&lt;p&gt;对于我这种主要在电脑上工作、喜欢折腾、重视数据所有权的人来说，这个交换非常值得。&lt;/p&gt;
]]></content:encoded></item><item><title>第一篇文章</title><link>https://blog.rootfly.xyz/post/hello-world/</link><pubDate>Wed, 15 Apr 2026 00:00:00 +0000</pubDate><guid>https://blog.rootfly.xyz/post/hello-world/</guid><description>Xiang&amp;#39;s Blog 的第一篇文章，记录博客的起点。</description><content:encoded><![CDATA[&lt;p&gt;欢迎来到 Xiang&amp;rsquo;s Blog！&lt;/p&gt;
&lt;p&gt;这里会记录我的学习笔记、论文心得和个人思考。&lt;/p&gt;
]]></content:encoded></item><item><title>Changelog</title><link>https://blog.rootfly.xyz/changelog/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://blog.rootfly.xyz/changelog/</guid><description>&lt;h2 id="站点更新日志"&gt;站点更新日志&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;2026-05&lt;/strong&gt; 全面优化&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;引入 Palatino + 华文中宋双字体方案，Latin/CJK 自动匹配&lt;/li&gt;
&lt;li&gt;RSS 支持 XSL 样式渲染&lt;/li&gt;
&lt;li&gt;首页增加社交图标（GitHub、Email、RSS）&lt;/li&gt;
&lt;li&gt;评论系统深度定制（字号、编辑器、IP 属地、楼中楼）&lt;/li&gt;
&lt;li&gt;文章页增加图片放大、标题锚点、TOC 高亮、相关推荐&lt;/li&gt;
&lt;li&gt;引用块改为左侧竖线样式&lt;/li&gt;
&lt;li&gt;翻页导航视觉优化&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;2026-04&lt;/strong&gt; 站点上线&lt;/p&gt;</description><content:encoded><![CDATA[&lt;h2 id=&#34;站点更新日志&#34;&gt;站点更新日志&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;2026-05&lt;/strong&gt; 全面优化&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;引入 Palatino + 华文中宋双字体方案，Latin/CJK 自动匹配&lt;/li&gt;
&lt;li&gt;RSS 支持 XSL 样式渲染&lt;/li&gt;
&lt;li&gt;首页增加社交图标（GitHub、Email、RSS）&lt;/li&gt;
&lt;li&gt;评论系统深度定制（字号、编辑器、IP 属地、楼中楼）&lt;/li&gt;
&lt;li&gt;文章页增加图片放大、标题锚点、TOC 高亮、相关推荐&lt;/li&gt;
&lt;li&gt;引用块改为左侧竖线样式&lt;/li&gt;
&lt;li&gt;翻页导航视觉优化&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;2026-04&lt;/strong&gt; 站点上线&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Hugo + PaperMod 搭建&lt;/li&gt;
&lt;li&gt;自定义 CSS 设计系统（Catppuccin 配色）&lt;/li&gt;
&lt;li&gt;Twikoo 评论系统集成&lt;/li&gt;
&lt;li&gt;KaTeX 数学公式支持&lt;/li&gt;
&lt;li&gt;日夜模式切换&lt;/li&gt;
&lt;/ul&gt;
]]></content:encoded></item><item><title>Contact</title><link>https://blog.rootfly.xyz/contact/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://blog.rootfly.xyz/contact/</guid><description>&lt;h2 id="联系我"&gt;联系我&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GitHub&lt;/strong&gt;：&lt;a href="https://github.com/nasymonk"&gt;github.com/nasymonk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Email&lt;/strong&gt;：&lt;a href="mailto:2947461909@qq.com"&gt;2947461909@qq.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;欢迎技术交流与讨论。文章中的疑问可直接在对应页面评论区留言。&lt;/p&gt;</description><content:encoded><![CDATA[&lt;h2 id=&#34;联系我&#34;&gt;联系我&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GitHub&lt;/strong&gt;：&lt;a href=&#34;https://github.com/nasymonk&#34;&gt;github.com/nasymonk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Email&lt;/strong&gt;：&lt;a href=&#34;mailto:2947461909@qq.com&#34;&gt;2947461909@qq.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;欢迎技术交流与讨论。文章中的疑问可直接在对应页面评论区留言。&lt;/p&gt;
]]></content:encoded></item><item><title>Copyright</title><link>https://blog.rootfly.xyz/copyright/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://blog.rootfly.xyz/copyright/</guid><description>&lt;h2 id="版权声明"&gt;版权声明&lt;/h2&gt;
&lt;p&gt;本博客所有原创文章，除特别说明外，均采用 &lt;a href="https://creativecommons.org/licenses/by-nc-sa/4.0/"&gt;CC BY-NC-SA 4.0&lt;/a&gt; 许可协议。&lt;/p&gt;
&lt;p&gt;你可以自由地：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;分享&lt;/strong&gt; — 在任何媒介复制和分发本作品&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;演绎&lt;/strong&gt; — 修改、转换或以本作品为基础进行创作&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;但需遵守以下条件：&lt;/p&gt;</description><content:encoded><![CDATA[&lt;h2 id=&#34;版权声明&#34;&gt;版权声明&lt;/h2&gt;
&lt;p&gt;本博客所有原创文章，除特别说明外，均采用 &lt;a href=&#34;https://creativecommons.org/licenses/by-nc-sa/4.0/&#34;&gt;CC BY-NC-SA 4.0&lt;/a&gt; 许可协议。&lt;/p&gt;
&lt;p&gt;你可以自由地：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;分享&lt;/strong&gt; — 在任何媒介复制和分发本作品&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;演绎&lt;/strong&gt; — 修改、转换或以本作品为基础进行创作&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;但需遵守以下条件：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;署名&lt;/strong&gt; — 必须给出适当的署名，提供指向本许可协议的链接&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;非商业性使用&lt;/strong&gt; — 不得将本作品用于商业目的&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;相同方式共享&lt;/strong&gt; — 如果你修改或基于本作品创作，必须以相同许可协议分发&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;博客中的代码片段（如无特殊说明）可自由使用，不受上述协议限制。&lt;/p&gt;
]]></content:encoded></item><item><title>Now</title><link>https://blog.rootfly.xyz/now/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://blog.rootfly.xyz/now/</guid><description>&lt;h2 id="此刻在做"&gt;此刻在做&lt;/h2&gt;
&lt;p&gt;受 &lt;a href="https://sivers.org/now"&gt;Derek Sivers /now page&lt;/a&gt; 启发，记录当前阶段的状态。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;学习&lt;/strong&gt;：持续关注 LLM / Agent 方向，补系统设计与分布式基础。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;阅读&lt;/strong&gt;：重读《Designing Data-Intensive Applications》。&lt;/p&gt;</description><content:encoded><![CDATA[&lt;h2 id=&#34;此刻在做&#34;&gt;此刻在做&lt;/h2&gt;
&lt;p&gt;受 &lt;a href=&#34;https://sivers.org/now&#34;&gt;Derek Sivers /now page&lt;/a&gt; 启发，记录当前阶段的状态。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;学习&lt;/strong&gt;：持续关注 LLM / Agent 方向，补系统设计与分布式基础。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;阅读&lt;/strong&gt;：重读《Designing Data-Intensive Applications》。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;生活&lt;/strong&gt;：规律作息与间歇性断食实验中。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;最后更新：2026 年 5 月&lt;/em&gt;&lt;/p&gt;
]]></content:encoded></item><item><title>Privacy</title><link>https://blog.rootfly.xyz/privacy/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://blog.rootfly.xyz/privacy/</guid><description>&lt;h2 id="隐私说明"&gt;隐私说明&lt;/h2&gt;
&lt;p&gt;本博客为个人站点，原则上不收集任何访客个人信息。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;评论系统&lt;/strong&gt;使用 Artalk，评论内容存储于博主自有服务器。提交评论时你可能需要填写昵称、邮箱（可选）、网址（可选）。邮箱仅用于 Gravatar 头像展示，不会公开或用于其他用途。&lt;/p&gt;</description><content:encoded><![CDATA[&lt;h2 id=&#34;隐私说明&#34;&gt;隐私说明&lt;/h2&gt;
&lt;p&gt;本博客为个人站点，原则上不收集任何访客个人信息。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;评论系统&lt;/strong&gt;使用 Artalk，评论内容存储于博主自有服务器。提交评论时你可能需要填写昵称、邮箱（可选）、网址（可选）。邮箱仅用于 Gravatar 头像展示，不会公开或用于其他用途。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;访问日志&lt;/strong&gt;由 Nginx 默认记录，包含 IP 地址、访问时间、User-Agent 等，仅用于排查技术问题，不会与第三方共享。&lt;/p&gt;
&lt;p&gt;本博客不嵌入任何第三方追踪脚本或广告。&lt;/p&gt;
]]></content:encoded></item><item><title>关于</title><link>https://blog.rootfly.xyz/about/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://blog.rootfly.xyz/about/</guid><description>about</description><content:encoded><![CDATA[&lt;!-- raw HTML omitted --&gt;
&lt;h2 id=&#34;-你好&#34;&gt;👋 你好&lt;/h2&gt;
&lt;p&gt;我是 Xiang，一个对技术充满好奇的学生。日常和大模型、容器、开发工具打交道，偶尔也在深夜厨房里给自己做一顿饭。&lt;/p&gt;
&lt;p&gt;这个博客是我的数字笔记本：记录学到的东西、踩过的坑、以及那些值得写下来的思考。如果某篇文章对你有帮助，或者你有不同的想法，欢迎在评论区聊聊。&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
]]></content:encoded></item></channel></rss>