<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Posts on 我的博客</title><link>https://blog.5616760.com/posts/</link><description>Recent content in Posts on 我的博客</description><generator>Hugo -- gohugo.io</generator><language>zh</language><lastBuildDate>Thu, 17 Sep 2026 09:30:00 +0800</lastBuildDate><atom:link href="https://blog.5616760.com/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>Git 与 GitHub 完全入门指南：从零开始到日常协作</title><link>https://blog.5616760.com/0007.html</link><pubDate>Thu, 17 Sep 2026 09:30:00 +0800</pubDate><guid>https://blog.5616760.com/0007.html</guid><description>&lt;h2 id="一前言为什么每个开发者都要学-git-与-github"&gt;一、前言：为什么每个开发者都要学 Git 与 GitHub&#10;&lt;/h2&gt;&lt;p&gt;如果你写过代码、保存过文档，就会知道一个常见的痛点：&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;报告_v1.docx&#10;报告_v1_最终.docx&#10;报告_v1_最终_真的不改了.docx&#10;报告_v1_最终_真的不改了_老板说要改.docx&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Git 的出现彻底解决了这个问题。它是一套&lt;strong&gt;分布式版本控制系统&lt;/strong&gt;，可以精确记录文件的每一次改动，让你随时回退、对比、分支实验，并与他人无缝协作。&lt;/p&gt;&#10;&lt;p&gt;而 &lt;strong&gt;GitHub&lt;/strong&gt; 是目前全球最大的代码托管平台，基于 Git 构建，提供了远程仓库、Pull Request、Issue、Actions、Pages 等一整套协作工具。&lt;/p&gt;&#10;&lt;p&gt;简单地说：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Git&lt;/strong&gt; = 本地版本管理工具（命令行）&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;GitHub&lt;/strong&gt; = 远端协作平台（网站 + 服务）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;两者配合的典型场景就是：&lt;strong&gt;本地写代码 → Git 记录改动 → 推送到 GitHub → 团队成员从 GitHub 同步 → 通过 PR 合并代码&lt;/strong&gt;。你正在看的这篇文章，就是 Hugo + Git + GitHub + Vercel 这条流水线自动构建发布的。&lt;/p&gt;&#10;&lt;p&gt;本文将从零开始，按&amp;quot;概念 → 安装 → 命令 → 协作 → 实战&amp;quot;的顺序，逐步带你掌握 Git 与 GitHub 的完整日常用法。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="二必须先理解的-8-个核心概念"&gt;二、必须先理解的 8 个核心概念&#10;&lt;/h2&gt;&lt;p&gt;在敲命令之前，请把下面这 8 个概念记牢。它们会贯穿你使用 Git 的每分每秒。&lt;/p&gt;&#10;&lt;h3 id="1-仓库repository简称-repo"&gt;1. 仓库（Repository，简称 Repo）&#10;&lt;/h3&gt;&lt;p&gt;存放你项目文件 + 所有改动历史的目录。一个项目对应一个仓库。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;本地仓库&lt;/strong&gt;：你电脑上的 &lt;code&gt;.git&lt;/code&gt; 目录及其管理的文件&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;远程仓库&lt;/strong&gt;：托管在 GitHub / GitLab / Gitee 等平台上的副本&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="2-工作区暂存区版本库三区模型"&gt;2. 工作区、暂存区、版本库（三区模型）&#10;&lt;/h3&gt;&lt;p&gt;这是 Git 最核心的状态机：&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart LR&#10; W["工作区&lt;br/&gt;Working&lt;br/&gt;你编辑的文件"]&#10; S["暂存区&lt;br/&gt;Staged&lt;br/&gt;下次提交的快照"]&#10; R["版本库&lt;br/&gt;Repository&lt;br/&gt;HEAD 指向的历史"]&#10; M["远程仓库&lt;br/&gt;Remote&lt;br/&gt;GitHub"]&#10;&#10; W --&gt;|"git add"| S&#10; S --&gt;|"git commit"| R&#10; R --&gt;|"git push"| M&#10; M -.-&gt;|"git pull"| W&#10; S -.-&gt;|"git restore --staged"| W&#10; R -.-&gt;|"git reset"| W&#10;&#10; style W fill:#f59e0b,stroke:#b45309,stroke-width:2px,color:#fff&#10; style S fill:#3b82f6,stroke:#1e40af,stroke-width:2px,color:#fff&#10; style R fill:#10b981,stroke:#047857,stroke-width:2px,color:#fff&#10; style M fill:#8b5cf6,stroke:#6d28d9,stroke-width:2px,color:#fff&lt;/pre&gt;&lt;p&gt;四个区域的作用：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;工作区&lt;/strong&gt;：你正在编辑的文件&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;暂存区&lt;/strong&gt;：已标记&amp;quot;下次要提交&amp;quot;的快照（一个中间层，让你可以精确控制哪些改动进一次提交）&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;版本库&lt;/strong&gt;：已经提交、永久保存的历史&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;远程仓库&lt;/strong&gt;：托管在 GitHub / GitLab / Gitee 等平台上的副本，本质是版本库的远端镜像&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;不理解暂存区是初学者最大的卡点。&lt;strong&gt;记住一句话&lt;/strong&gt;：暂存区是&amp;quot;草稿箱&amp;quot;，版本库是&amp;quot;档案柜&amp;quot;。你可以把多个改动分批放进草稿箱，分多次提交进档案柜。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="3-提交commit"&gt;3. 提交（Commit）&#10;&lt;/h3&gt;&lt;p&gt;一次提交 = 一个&lt;strong&gt;带说明的快照&lt;/strong&gt;。每次 commit 都有一个全球唯一的哈希值（如 &lt;code&gt;a1b2c3d...&lt;/code&gt;），是回退、对比、定位的钥匙。&lt;/p&gt;&#10;&lt;h3 id="4-分支branch"&gt;4. 分支（Branch）&#10;&lt;/h3&gt;&lt;p&gt;指向某个 commit 的轻量指针。主分支默认叫 &lt;code&gt;main&lt;/code&gt;（老项目可能是 &lt;code&gt;master&lt;/code&gt;）。分支存在的意义是&lt;strong&gt;让你在不影响主线的情况下做实验&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;h3 id="5-head"&gt;5. HEAD&#10;&lt;/h3&gt;&lt;p&gt;一个特殊的&amp;quot;指针&amp;quot;，永远指向&lt;strong&gt;你当前所在的位置&lt;/strong&gt;（通常是某分支的最新 commit）。&lt;/p&gt;&#10;&lt;h3 id="6-远程remote"&gt;6. 远程（Remote）&#10;&lt;/h3&gt;&lt;p&gt;本地仓库对远端仓库的&amp;quot;昵称&amp;quot;，默认叫 &lt;code&gt;origin&lt;/code&gt;，可以配多个（如 &lt;code&gt;origin&lt;/code&gt; + &lt;code&gt;upstream&lt;/code&gt;）。&lt;/p&gt;&#10;&lt;h3 id="7-合并mergevs-变基rebase"&gt;7. 合并（Merge）vs 变基（Rebase）&#10;&lt;/h3&gt;&lt;p&gt;把两条分支&amp;quot;合到一起&amp;quot;的两种不同方式：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;merge&lt;/strong&gt;：保留分支历史，会产生合并 commit&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;rebase&lt;/strong&gt;：把当前分支&amp;quot;接到&amp;quot;目标分支顶端，历史是线性的（更干净，但会改写 commit 哈希）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="8-冲突conflict"&gt;8. 冲突（Conflict）&#10;&lt;/h3&gt;&lt;p&gt;两个分支对同一文件的同一行做了不同的修改，Git 会停下来让你手动决定保留哪一方。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="三环境准备安装-git-与注册-github"&gt;三、环境准备：安装 Git 与注册 GitHub&#10;&lt;/h2&gt;&lt;h3 id="1-安装-git"&gt;1. 安装 Git&#10;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Windows&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;方式 A（推荐）：&lt;a class="link" href="https://git-scm.com/download/win" target="_blank" rel="noopener"&#10; &gt;Git 官网&lt;/a&gt; 下载安装包，一路 Next&lt;/li&gt;&#10;&lt;li&gt;方式 B（包管理器）：&lt;code&gt;winget install Git.Git&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;安装完打开 Git Bash（Git 自带的终端），后续命令都在这里敲&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;macOS&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;自带 Xcode Command Line Tools：&lt;code&gt;xcode-select --install&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;或 Homebrew：&lt;code&gt;brew install git&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;Linux（Debian/Ubuntu）&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt update &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo apt install git -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;验证安装&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 输出示例：git version 2.45.0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="2-首次配置告诉-git-你是谁"&gt;2. 首次配置：告诉 Git 你是谁&#10;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;必须配&lt;/strong&gt;，不然无法 commit：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git config --global user.name &lt;span style="color:#e6db74"&gt;&amp;#34;你的名字&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git config --global user.email &lt;span style="color:#e6db74"&gt;&amp;#34;你的邮箱@example.com&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;邮箱建议用 GitHub 注册邮箱&lt;/strong&gt;，这样你的 commit 在 GitHub 上会显示头像。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;常用配置项：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 默认分支名（GitHub 新仓库默认是 main，老项目可能是 master）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git config --global init.defaultBranch main&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 中文文件名不转义（Windows 常用）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git config --global core.quotepath false&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 提交时自动转换 CRLF（推荐 Windows 用户）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git config --global core.autocrlf true&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# macOS / Linux 用户&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git config --global core.autocrlf input&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 漂亮的 log（强烈推荐，后面会介绍怎么配别名）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git config --global alias.lg &lt;span style="color:#e6db74"&gt;&amp;#34;log --oneline --graph --decorate --all&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;查看所有配置：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git config --list&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="3-注册-github-账号"&gt;3. 注册 GitHub 账号&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;打开 &lt;a class="link" href="https://github.com/" target="_blank" rel="noopener"&#10; &gt;github.com&lt;/a&gt; → Sign up&lt;/li&gt;&#10;&lt;li&gt;选用户名（这会是你的个人主页域名的一部分，如 &lt;code&gt;github.com/xxx&lt;/code&gt;，慎重）&lt;/li&gt;&#10;&lt;li&gt;邮箱 + 密码 + 验证&lt;/li&gt;&#10;&lt;li&gt;建议勾选&amp;quot;接收产品更新邮件&amp;quot;（了解新功能）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="4-配置-ssh-密钥强烈推荐省去每次输入密码"&gt;4. 配置 SSH 密钥（强烈推荐，省去每次输入密码）&#10;&lt;/h3&gt;&lt;h4 id="第一步生成密钥"&gt;第一步：生成密钥&#10;&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ssh-keygen -t ed25519 -C &lt;span style="color:#e6db74"&gt;&amp;#34;你的邮箱@example.com&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 一路回车，使用默认路径与空密码即可&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;生成的密钥文件在：&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;文件&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;用途&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;路径（Windows / macOS·Linux）&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;id_ed25519&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;私钥&lt;/strong&gt;，留在本地，绝不能泄露&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;C:\Users\你的用户名\.ssh\id_ed25519&lt;/code&gt; / &lt;code&gt;~/.ssh/id_ed25519&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;id_ed25519.pub&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;公钥&lt;/strong&gt;，需要上传到 GitHub&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;同目录下的 &lt;code&gt;.pub&lt;/code&gt; 文件&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h4 id="第二步把公钥告诉-github"&gt;第二步：把公钥告诉 GitHub&#10;&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 查看并复制公钥内容&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cat ~/.ssh/id_ed25519.pub&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;打开 GitHub → 右上角头像 → &lt;strong&gt;Settings&lt;/strong&gt; → &lt;strong&gt;SSH and GPG keys&lt;/strong&gt; → &lt;strong&gt;New SSH key&lt;/strong&gt; → Title 任意，Key 类型选 Authentication，把公钥粘贴进去 → Add SSH key。&lt;/p&gt;&#10;&lt;h4 id="第三步测试连通性"&gt;第三步：测试连通性&#10;&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ssh -T git@github.com&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 首次会问是否信任，输入 yes&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 看到 &amp;#34;Hi &amp;lt;用户名&amp;gt;! You&amp;#39;ve successfully authenticated...&amp;#34; 就成功了&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;HTTPS vs SSH&lt;/strong&gt;：HTTPS 每次 push 要输用户名密码（或 PAT），SSH 配置一次永久免密。&lt;strong&gt;强烈推荐 SSH&lt;/strong&gt;。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="四最小工作流3-条命令搞定本地版本管理"&gt;四、最小工作流：3 条命令搞定本地版本管理&#10;&lt;/h2&gt;&lt;p&gt;假设你已经在本地有一个项目目录 &lt;code&gt;my-project&lt;/code&gt;，想用 Git 管理它。&lt;/p&gt;&#10;&lt;h3 id="第-1-步初始化仓库"&gt;第 1 步：初始化仓库&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd my-project&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git init&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;执行后目录下会多出一个 &lt;code&gt;.git&lt;/code&gt; 隐藏目录，这就是 Git 的&amp;quot;大脑&amp;quot;。&lt;/p&gt;&#10;&lt;h3 id="第-2-步查看状态"&gt;第 2 步：查看状态&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git status&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这是你最常用的命令之一，随时告诉你&amp;quot;现在哪些文件被改了、哪些被暂存了&amp;quot;。&lt;/p&gt;&#10;&lt;h3 id="第-3-步第一次提交"&gt;第 3 步：第一次提交&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 把所有文件加入暂存区&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git add .&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 提交到版本库&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git commit -m &lt;span style="color:#e6db74"&gt;&amp;#34;第一次提交：初始化项目&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;到这里，本地 Git 仓库就建好了。完整流程如下：&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart LR&#10; A[1. 创建文件&lt;br/&gt;echo &amp;gt; README.md] --&gt; B[2. git init&lt;br/&gt;初始化仓库]&#10; B --&gt; C[3. git add&lt;br/&gt;加入暂存区]&#10; C --&gt; D[4. git commit&lt;br/&gt;写入版本库]&#10; D --&gt; E([git log&lt;br/&gt;查看历史])&lt;/pre&gt;&lt;p&gt;完整命令行版（可直接复制执行）：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#34;# My Project&amp;#34;&lt;/span&gt; &amp;gt; README.md&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git init&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git add README.md&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git commit -m &lt;span style="color:#e6db74"&gt;&amp;#34;Initial commit&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git log --oneline &lt;span style="color:#75715e"&gt;# 查看提交历史&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#10;&lt;h2 id="五必须吃透的-12-条核心命令"&gt;五、必须吃透的 12 条核心命令&#10;&lt;/h2&gt;&lt;p&gt;下面这些命令覆盖 90% 的日常使用，&lt;strong&gt;务必熟记&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;命令&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;作用&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;常用场景&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;git status&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;查看工作区与暂存区状态&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;任何时候不确定&amp;quot;现在是什么状态&amp;quot;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;git add &amp;lt;file&amp;gt;&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;把文件加入暂存区&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;修改后准备提交&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;git commit -m &amp;quot;msg&amp;quot;&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;提交暂存区的内容到版本库&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;每次&amp;quot;完成一个小功能&amp;quot;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;git log&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;查看提交历史&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;想看过去做过什么&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;git diff&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;查看未暂存的改动&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;提交前确认改了什么&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;git diff --staged&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;查看已暂存的改动&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;提交前最后确认&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;git restore &amp;lt;file&amp;gt;&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;撤销工作区修改（未暂存）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;改错了想回退&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;git restore --staged &amp;lt;file&amp;gt;&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;把文件从暂存区撤回到工作区&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;add 多了想撤销&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;git reset --hard &amp;lt;commit&amp;gt;&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;回退到某个 commit（危险）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;想彻底回到过去&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;git revert &amp;lt;commit&amp;gt;&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;新建一个 commit 撤销指定 commit&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;已推送的内容要回退&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;git stash&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;临时藏起来未提交的改动&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;切分支前不想提交&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;git stash pop&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;把藏起来的改动恢复回来&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;切回分支后继续改&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h3 id="详细解释与示例"&gt;详细解释与示例&#10;&lt;/h3&gt;&lt;h4 id="git-log看历史"&gt;&lt;code&gt;git log&lt;/code&gt;：看历史&#10;&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git log &lt;span style="color:#75715e"&gt;# 完整输出&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git log --oneline &lt;span style="color:#75715e"&gt;# 每个 commit 一行（推荐）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git log --oneline --graph --all &lt;span style="color:#75715e"&gt;# 图形化显示所有分支&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git log --author&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;你的名字&amp;#34;&lt;/span&gt; &lt;span style="color:#75715e"&gt;# 按作者过滤&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git log --since&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;2026-01-01&amp;#34;&lt;/span&gt; &lt;span style="color:#75715e"&gt;# 按时间过滤&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git log -p &amp;lt;file&amp;gt; &lt;span style="color:#75715e"&gt;# 看某个文件的全部改动历史&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="git-diff看差异"&gt;&lt;code&gt;git diff&lt;/code&gt;：看差异&#10;&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git diff &lt;span style="color:#75715e"&gt;# 工作区 vs 暂存区（未 add 的改动）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git diff --staged &lt;span style="color:#75715e"&gt;# 暂存区 vs 版本库（已 add 未 commit 的改动）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git diff main feature &lt;span style="color:#75715e"&gt;# 两个分支的差异&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git diff HEAD~1 HEAD &lt;span style="color:#75715e"&gt;# 当前 commit vs 上一个 commit&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="git-add精确控制粒度"&gt;&lt;code&gt;git add&lt;/code&gt;：精确控制粒度&#10;&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git add file.txt &lt;span style="color:#75715e"&gt;# 单个文件&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git add dir/ &lt;span style="color:#75715e"&gt;# 整个目录&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git add . &lt;span style="color:#75715e"&gt;# 当前目录下所有改动&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git add -p &lt;span style="color:#75715e"&gt;# 交互式：逐个 hunk（代码块）选择是否 add（高级但极好用）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="git-commit写好提交说明"&gt;&lt;code&gt;git commit&lt;/code&gt;：写好提交说明&#10;&lt;/h4&gt;&lt;p&gt;好习惯是&lt;strong&gt;一行不超过 50 字的祈使句&lt;/strong&gt;，如：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;✅ &lt;code&gt;fix: 修复用户登录失败问题&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;✅ &lt;code&gt;docs: 更新 README 安装步骤&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;❌ &lt;code&gt;改了点东西&lt;/code&gt;（太模糊）&lt;/li&gt;&#10;&lt;li&gt;❌ &lt;code&gt;Updated some files.&lt;/code&gt;（同义反复）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;更复杂的多行说明：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git commit -m &lt;span style="color:#e6db74"&gt;&amp;#34;feat: 增加用户导出功能&amp;#34;&lt;/span&gt; -m &lt;span style="color:#e6db74"&gt;&amp;#34;- 支持 CSV 格式&amp;#34;&lt;/span&gt; -m &lt;span style="color:#e6db74"&gt;&amp;#34;- 修复分页边界问题&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;或者用编辑器写：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git commit &lt;span style="color:#75715e"&gt;# 会打开默认编辑器，写完保存关闭即提交&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="撤销类重点中的重点"&gt;撤销类（重点中的重点）&#10;&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 撤销工作区的修改（文件回到上次 add 或 commit 的状态）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git restore file.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 把已 add 的文件撤回到工作区（暂存区取消，但工作区保留）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git restore --staged file.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 修改最后一次 commit（追加改动 / 修改说明）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git commit --amend&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# ⚠️ 注意：amend 会改写 commit hash，**只对**未推送的 commit 使用&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 回退到指定 commit（--hard 会丢掉之后所有改动，慎用）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git reset --hard HEAD~1 &lt;span style="color:#75715e"&gt;# 回退 1 个 commit&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git reset --hard a1b2c3d &lt;span style="color:#75715e"&gt;# 回退到指定哈希&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 安全回退（已推送到远端时用这个，会产生新 commit 撤销改动）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git revert HEAD&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;黄金法则&lt;/strong&gt;：&lt;code&gt;reset&lt;/code&gt; 用来操作本地未推送的 commit；&lt;code&gt;revert&lt;/code&gt; 用来操作已经推送到远端的 commit。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h4 id="git-stash临时存放"&gt;&lt;code&gt;git stash&lt;/code&gt;：临时存放&#10;&lt;/h4&gt;&lt;p&gt;切分支时手头还有改动没提交，又不想带过去污染分支：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git stash &lt;span style="color:#75715e"&gt;# 藏起来&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git stash list &lt;span style="color:#75715e"&gt;# 查看藏起来的列表&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git stash pop &lt;span style="color:#75715e"&gt;# 恢复并删除 stash&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git stash apply stash@&lt;span style="color:#f92672"&gt;{&lt;/span&gt;0&lt;span style="color:#f92672"&gt;}&lt;/span&gt; &lt;span style="color:#75715e"&gt;# 恢复但不删除（可恢复多次）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git stash drop stash@&lt;span style="color:#f92672"&gt;{&lt;/span&gt;0&lt;span style="color:#f92672"&gt;}&lt;/span&gt; &lt;span style="color:#75715e"&gt;# 删除指定 stash&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git stash clear &lt;span style="color:#75715e"&gt;# 清空所有 stash&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#10;&lt;h2 id="六把仓库推上-github远程协作入门"&gt;六、把仓库推上 GitHub：远程协作入门&#10;&lt;/h2&gt;&lt;h3 id="1-在-github-上创建空仓库"&gt;1. 在 GitHub 上创建空仓库&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;登录 GitHub → 右上角 &lt;strong&gt;+&lt;/strong&gt; → &lt;strong&gt;New repository&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;Repository name：&lt;code&gt;my-project&lt;/code&gt;（最好和本地目录同名）&lt;/li&gt;&#10;&lt;li&gt;选 &lt;strong&gt;Public&lt;/strong&gt;（公开，任何人可看）或 &lt;strong&gt;Private&lt;/strong&gt;（私有）&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;不要&lt;/strong&gt;勾选 &amp;ldquo;Add a README&amp;rdquo; / &amp;ldquo;.gitignore&amp;rdquo; / &amp;ldquo;license&amp;rdquo;（避免和本地冲突）&lt;/li&gt;&#10;&lt;li&gt;点 &lt;strong&gt;Create repository&lt;/strong&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="2-本地关联远端"&gt;2. 本地关联远端&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd my-project &lt;span style="color:#75715e"&gt;# 进入你的本地仓库&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 添加远程仓库（SSH 方式，推荐）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git remote add origin git@github.com:你的用户名/my-project.git&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 如果你用的是 HTTPS&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# git remote add origin https://github.com/你的用户名/my-project.git&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 查看远程仓库&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git remote -v&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="3-第一次推送"&gt;3. 第一次推送&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 推送 main 分支到 origin&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git push -u origin main&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# -u 是 --set-upstream 的简写，建立本地分支与远端分支的关联&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 之后只需 git push 即可&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="4-后续日常推送"&gt;4. 后续日常推送&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git add .&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git commit -m &lt;span style="color:#e6db74"&gt;&amp;#34;feat: xxx&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git push &lt;span style="color:#75715e"&gt;# 不再需要写 origin main，因为 -u 已经记住&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="5-从远端拉取"&gt;5. 从远端拉取&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git pull &lt;span style="color:#75715e"&gt;# 拉取并自动合并（= git fetch + git merge）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git fetch &lt;span style="color:#75715e"&gt;# 只拉取不合并（更安全，适合先看看远端有什么）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;建议&lt;/strong&gt;：日常用 &lt;code&gt;pull&lt;/code&gt;，遇到不确定的远端变更用 &lt;code&gt;fetch&lt;/code&gt; 先看一眼。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="七分支管理团队协作的核心武器"&gt;七、分支管理：团队协作的核心武器&#10;&lt;/h2&gt;&lt;p&gt;分支是 Git 区别于其他版本控制系统的灵魂。它让你在不影响主线的情况下自由实验。&lt;/p&gt;&#10;&lt;h3 id="1-分支的直观理解"&gt;1. 分支的直观理解&#10;&lt;/h3&gt;&lt;pre class="mermaid" style="visibility:hidden"&gt;gitGraph&#10; commit id: "A"&#10; commit id: "B"&#10; branch feature-login&#10; checkout feature-login&#10; commit id: "C"&#10; commit id: "D"&#10; commit id: "E"&#10; checkout main&#10; commit id: "F"&#10; commit id: "G"&#10; merge feature-login&lt;/pre&gt;&lt;p&gt;&lt;code&gt;main&lt;/code&gt; 在 B 之后分叉出 &lt;code&gt;feature-login&lt;/code&gt;，你在 &lt;code&gt;feature-login&lt;/code&gt; 上做了 C/D/E，主线 &lt;code&gt;main&lt;/code&gt; 继续往前走到 F/G。等你做完功能后，把 &lt;code&gt;feature-login&lt;/code&gt; 合并回 &lt;code&gt;main&lt;/code&gt;，历史就合到一起了。&lt;/p&gt;&#10;&lt;h3 id="2-常用分支命令"&gt;2. 常用分支命令&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 查看所有本地分支&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git branch&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 查看所有分支（包括远端）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git branch -a&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 创建分支&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git branch feature-login&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 切换到指定分支（旧语法）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git checkout feature-login&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 创建并切换（新语法，推荐）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git switch -c feature-login&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 或：git checkout -b feature-login&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 删除已合并的分支&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git branch -d feature-login&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 强制删除未合并的分支（会丢改动，慎用）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git branch -D feature-login&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 重命名当前分支&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git branch -m new-name&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="3-合并分支"&gt;3. 合并分支&#10;&lt;/h3&gt;&lt;h4 id="merge-方式保留历史"&gt;Merge 方式（保留历史）&#10;&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 切回主分支&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git switch main&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 把 feature 分支合并进来&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git merge feature-login&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;合并后会产生一个&lt;strong&gt;合并 commit&lt;/strong&gt;，完整保留分支历史。&lt;/p&gt;&#10;&lt;h4 id="rebase-方式线性历史"&gt;Rebase 方式（线性历史）&#10;&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 在 feature 分支上&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git switch feature-login&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git rebase main&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# feature 分支的 commit 会被&amp;#34;重放&amp;#34;到 main 顶端&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;之后切回 main 做 fast-forward merge，历史就是干净的直线。&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;何时用哪个&lt;/strong&gt;：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;个人本地分支、还没推送&lt;/strong&gt;：随便 rebase，历史更干净&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;多人共享的远端分支&lt;/strong&gt;：&lt;strong&gt;绝对不要 rebase&lt;/strong&gt;，会扰乱其他人的本地历史&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;不确定时&lt;/strong&gt;：用 merge&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;两种方式的结果对比&lt;/strong&gt;（同一起点 &lt;code&gt;B&lt;/code&gt;，分支 &lt;code&gt;feature&lt;/code&gt; 上做了 C/D/E，主线在 B 之后又走了 F）：&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;%% merge 方式：保留分支拓扑，多一个合并 commit&#10;gitGraph&#10; commit id: "A"&#10; commit id: "B"&#10; branch feature&#10; checkout feature&#10; commit id: "C"&#10; commit id: "D"&#10; commit id: "E"&#10; checkout main&#10; commit id: "F"&#10; merge feature tag: "merge commit"&lt;/pre&gt;&lt;pre class="mermaid" style="visibility:hidden"&gt;%% rebase 方式：feature 被"重放"到 main 顶端，main merge 时是 fast-forward&#10;gitGraph&#10; commit id: "A"&#10; commit id: "B"&#10; branch feature&#10; checkout feature&#10; commit id: "C'"&#10; commit id: "D'"&#10; commit id: "E'"&#10; checkout main&#10; commit id: "F"&#10; merge feature tag: "fast-forward"&lt;/pre&gt;&lt;h3 id="4-冲突解决"&gt;4. 冲突解决&#10;&lt;/h3&gt;&lt;p&gt;当你 merge / rebase / pull 时，两个分支对同一行做了不同修改，Git 会暂停并提示：&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;CONFLICT (content): Merge conflict in src/app.js&#10;Automatic merge failed; fix conflicts and then commit the result.&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;打开冲突文件，会看到冲突标记：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;HEAD&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;main 分支的代码&amp;#34;&lt;/span&gt;);&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;=======&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;feature 分支的代码&amp;#34;&lt;/span&gt;);&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;feature&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;login&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;手动编辑保留正确内容&lt;/strong&gt;，删除 &lt;code&gt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;/code&gt; &lt;code&gt;====&lt;/code&gt; &lt;code&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;/code&gt; 标记，然后：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git add src/app.js&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git commit &lt;span style="color:#75715e"&gt;# 完成合并&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 如果是 rebase，继续：git rebase --continue&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="5-一个推荐的工作流git-flow-简化版"&gt;5. 一个推荐的工作流（Git Flow 简化版）&#10;&lt;/h3&gt;&lt;p&gt;适合个人 / 小团队：&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;分支&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;用途&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;从哪拉&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;合并到&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;main&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;稳定版本&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;—&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;—&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;dev&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;开发集成&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;main&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;main&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;feature/*&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;新功能&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;dev&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;dev&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;fix/*&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;修 bug&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;dev&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;dev&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;日常节奏：在 &lt;code&gt;feature/xxx&lt;/code&gt; 上写功能 → PR 合并到 &lt;code&gt;dev&lt;/code&gt; → 稳定后 &lt;code&gt;dev&lt;/code&gt; 合并到 &lt;code&gt;main&lt;/code&gt;。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="八pull-request团队协作的灵魂"&gt;八、Pull Request：团队协作的灵魂&#10;&lt;/h2&gt;&lt;p&gt;Pull Request（PR，GitLab 上叫 Merge Request）是 GitHub 的&amp;quot;代码评审&amp;quot;机制。&lt;/p&gt;&#10;&lt;h3 id="1-典型流程"&gt;1. 典型流程&#10;&lt;/h3&gt;&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart TD&#10; A[Fork 主仓库&lt;br/&gt;到自己的账号] --&gt; B[Clone 到本地&lt;br/&gt;git clone fork-url]&#10; B --&gt; C[添加 upstream 远程&lt;br/&gt;指向原作者仓库]&#10; C --&gt; D[新建功能分支&lt;br/&gt;git switch -c fix-bug]&#10; D --&gt; E[改代码 + add + commit&lt;br/&gt;+ push 到 fork 分支]&#10; E --&gt; F[在 GitHub 创建 PR&lt;br/&gt;Compare &amp; pull request]&#10; F --&gt; G{评审结果}&#10; G --&gt;|需修改| H[本地继续修改&lt;br/&gt;+ 重新 push]&#10; H --&gt; F&#10; G --&gt;|通过| I[Merge 到主分支]&#10; I --&gt; J([本地 PR 已合并])&lt;/pre&gt;&lt;p&gt;要点展开：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;Fork 主仓库&lt;/strong&gt;（在 GitHub 网页上点 Fork）到自己的账号下&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;克隆 fork 仓库&lt;/strong&gt;到本地：&lt;code&gt;git clone git@github.com:你的用户名/project.git&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;添加上游：&lt;code&gt;git remote add upstream git@github.com:原作者/project.git&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;创建分支：&lt;code&gt;git switch -c fix-bug&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;改代码 → &lt;code&gt;add&lt;/code&gt; → &lt;code&gt;commit&lt;/code&gt; → &lt;code&gt;push&lt;/code&gt; 到自己 fork 的 &lt;code&gt;fix-bug&lt;/code&gt; 分支&lt;/li&gt;&#10;&lt;li&gt;在 GitHub 上点 &lt;strong&gt;Compare &amp;amp; pull request&lt;/strong&gt; → 写标题和说明 → 创建 PR&lt;/li&gt;&#10;&lt;li&gt;项目维护者评审（review）→ 讨论 → 同意后合并（merge）&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="2-写好-pr-说明"&gt;2. 写好 PR 说明&#10;&lt;/h3&gt;&lt;p&gt;好的 PR 模板：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;## 改了什么&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; 新增 xxx 接口&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; 修复 yyy bug&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;## 怎么测&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;1.&lt;/span&gt; 启动 xxx 服务&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;2.&lt;/span&gt; 调用 xxx 接口&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;3.&lt;/span&gt; 看到返回 zzz&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;## 截图 / 日志&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;（可选）&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;## 相关 Issue&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Closes #123&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="3-code-review-基本礼仪"&gt;3. Code Review 基本礼仪&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;对别人的 PR：就事论事、对代码不对人；提问而非命令（&amp;ldquo;这里我不太理解&amp;rdquo; vs &amp;ldquo;这里写错了&amp;rdquo;）&lt;/li&gt;&#10;&lt;li&gt;对自己的 PR：保持小颗粒度（一个 PR 只做一件事）；自己先 review 一遍再请求评审&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="九撤销与恢复挽救你的误操作"&gt;九、撤销与恢复：挽救你的&amp;quot;误操作&amp;quot;&#10;&lt;/h2&gt;&lt;h3 id="1-撤销工作区的改动"&gt;1. 撤销工作区的改动&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git restore file.txt &lt;span style="color:#75715e"&gt;# 撤销单个文件&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git restore . &lt;span style="color:#75715e"&gt;# 撤销所有改动&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="2-撤销暂存"&gt;2. 撤销暂存&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git restore --staged file.txt &lt;span style="color:#75715e"&gt;# 撤销单个文件的暂存&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git restore --staged . &lt;span style="color:#75715e"&gt;# 撤销所有暂存&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="3-撤销最后一次-commit未推送"&gt;3. 撤销最后一次 commit（未推送）&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git commit --amend &lt;span style="color:#75715e"&gt;# 改写最后一次 commit&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 或&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git reset --soft HEAD~1 &lt;span style="color:#75715e"&gt;# 撤销 commit 但保留改动在暂存区&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git reset HEAD~1 &lt;span style="color:#75715e"&gt;# 撤销 commit 改动回到工作区&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git reset --hard HEAD~1 &lt;span style="color:#75715e"&gt;# 撤销 commit 并丢弃所有改动（⚠️ 危险）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="4-撤销已推送的-commit"&gt;4. 撤销已推送的 commit&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 生成一个新 commit 撤销指定 commit 的改动（推荐，保留历史）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git revert a1b2c3d&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git push&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 或者直接回退远端分支（⚠️ 危险，会影响其他人）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git reset --hard HEAD~1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git push --force-with-lease&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;code&gt;git push --force&lt;/code&gt; 是危险操作，会&lt;strong&gt;覆盖&lt;/strong&gt;远端历史，可能让协作者的工作丢失。优先用 &lt;code&gt;--force-with-lease&lt;/code&gt;（如果远端有你不知道的新 commit，会拒绝覆盖）。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="5-找回丢失的-commit"&gt;5. 找回丢失的 commit&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git reflog &lt;span style="color:#75715e"&gt;# 查看所有 HEAD 移动记录（30 天内）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 找到你想要的哈希，然后&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git reset --hard &amp;lt;哈希&amp;gt; &lt;span style="color:#75715e"&gt;# 回到那个 commit&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;reflog&lt;/code&gt; 是 Git 的&amp;quot;后悔药&amp;quot;，大多数丢失的 commit 都能从这里找回来。&lt;/p&gt;&#10;&lt;h3 id="6-恢复误删的分支"&gt;6. 恢复误删的分支&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git reflog | grep &lt;span style="color:#e6db74"&gt;&amp;#34;分支删除前的提交&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git switch -c branch-name &amp;lt;哈希&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#10;&lt;h2 id="十gitignore忽略不该追踪的文件"&gt;十、.gitignore：忽略不该追踪的文件&#10;&lt;/h2&gt;&lt;p&gt;你不想把 &lt;code&gt;node_modules/&lt;/code&gt;、&lt;code&gt;__pycache__/&lt;/code&gt;、&lt;code&gt;.env&lt;/code&gt;、&lt;code&gt;*.log&lt;/code&gt;、&lt;code&gt;dist/&lt;/code&gt; 这些文件提交到仓库。&lt;code&gt;.gitignore&lt;/code&gt; 就是干这个的。&lt;/p&gt;&#10;&lt;h3 id="1-创建方式"&gt;1. 创建方式&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;方式 A：仓库根目录创建 &lt;code&gt;.gitignore&lt;/code&gt; 文件&lt;/li&gt;&#10;&lt;li&gt;方式 B：&lt;code&gt;hugo new site&lt;/code&gt; 等命令会自动生成模板&lt;/li&gt;&#10;&lt;li&gt;方式 C：GitHub 仓库创建时直接选模板&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="2-常用模板按语言--框架"&gt;2. 常用模板（按语言 / 框架）&#10;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Node.js&lt;/strong&gt;&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;node_modules/&#10;dist/&#10;.env&#10;npm-debug.log*&#10;yarn-debug.log*&#10;yarn-error.log*&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Python&lt;/strong&gt;&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;__pycache__/&#10;*.py[cod]&#10;*.egg-info/&#10;.venv/&#10;venv/&#10;.env&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Hugo&lt;/strong&gt;&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;public/&#10;resources/_gen/&#10;.hugo_build.lock&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;通用建议&lt;/strong&gt;&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;.DS_Store # macOS&#10;Thumbs.db # Windows&#10;*.swp # Vim&#10;.vscode/ # VSCode 个人配置（按需）&#10;.idea/ # JetBrains 个人配置（按需）&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="3-已经被追踪的文件怎么办"&gt;3. 已经被追踪的文件怎么办？&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;.gitignore&lt;/code&gt; 只对&lt;strong&gt;未追踪&lt;/strong&gt;的文件生效。如果某个文件已经被 &lt;code&gt;git add&lt;/code&gt; 过了，需要先取消追踪：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 从版本库移除但保留本地文件&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git rm --cached file.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 然后提交&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git commit -m &lt;span style="color:#e6db74"&gt;&amp;#34;chore: 从追踪列表移除 file.txt&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="4-一行速记"&gt;4. 一行速记&#10;&lt;/h3&gt;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;模式&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;含义&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;*.log&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;所有 .log 文件&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;/TODO&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;根目录的 TODO 文件&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;build/&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;所有 build 目录&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;doc/*.txt&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;doc 目录下（不递归）的 .txt&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;doc/**/*.txt&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;doc 目录及其子目录的所有 .txt&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;!README.md&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;否定，不忽略这个&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="十一github-进阶功能"&gt;十一、GitHub 进阶功能&#10;&lt;/h2&gt;&lt;h3 id="1-issue任务与缺陷追踪"&gt;1. Issue：任务与缺陷追踪&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;任何人都可以在公开仓库提 Issue&lt;/li&gt;&#10;&lt;li&gt;标题 + 描述 + 标签（bug / enhancement / question / documentation）&lt;/li&gt;&#10;&lt;li&gt;用 &lt;code&gt;#123&lt;/code&gt; 在 commit / PR 中引用，会自动建立双向链接&lt;/li&gt;&#10;&lt;li&gt;在 commit message 写 &lt;code&gt;Fixes #123&lt;/code&gt; 或 &lt;code&gt;Closes #123&lt;/code&gt;，合并 PR 后会自动关闭对应 Issue&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="2-projects看板"&gt;2. Projects：看板&#10;&lt;/h3&gt;&lt;p&gt;类似 Trello 的项目看板，可以把 Issue / PR 拖拽到不同列（Todo / In Progress / Done），适合个人任务管理。&lt;/p&gt;&#10;&lt;h3 id="3-wiki项目文档"&gt;3. Wiki：项目文档&#10;&lt;/h3&gt;&lt;p&gt;仓库内的多页面文档系统，适合写详细文档、API 参考、FAQ。&lt;/p&gt;&#10;&lt;h3 id="4-github-actions自动化-cicd"&gt;4. GitHub Actions：自动化 CI/CD&#10;&lt;/h3&gt;&lt;p&gt;在仓库的 &lt;code&gt;.github/workflows/&lt;/code&gt; 下放 YAML 文件，可以做到：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;PR 触发自动跑测试&lt;/li&gt;&#10;&lt;li&gt;push 后自动部署（你正在看的 Hugo 博客就是这条链路）&lt;/li&gt;&#10;&lt;li&gt;自动发版、自动发 release notes&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;示例 &lt;code&gt;.github/workflows/hugo.yml&lt;/code&gt;：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Deploy Hugo to GitHub Pages&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;on&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;push&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;branches&lt;/span&gt;: [&lt;span style="color:#ae81ff"&gt;main]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;jobs&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;build&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;runs-on&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ubuntu-latest&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;steps&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;uses&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;actions/checkout@v4&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;uses&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;peaceiris/actions-hugo@v3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;with&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;hugo-version&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;latest&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;extended&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;run&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;hugo --minify&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;uses&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;actions/upload-pages-artifact@v3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;with&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;path&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;./public&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;id&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;deployment&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;uses&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;actions/deploy-pages@v4&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="5-github-pages免费静态网站"&gt;5. GitHub Pages：免费静态网站&#10;&lt;/h3&gt;&lt;p&gt;仓库 Settings → Pages → 选分支 → 即可发布静态站点。&lt;strong&gt;个人博客 / 项目文档最简方案&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;h3 id="6-gist代码片段"&gt;6. Gist：代码片段&#10;&lt;/h3&gt;&lt;p&gt;适合分享单文件 / 小段代码。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="十二常见坑与最佳实践"&gt;十二、常见坑与最佳实践&#10;&lt;/h2&gt;&lt;h3 id="1-提交粒度"&gt;1. 提交粒度&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;✅ &lt;strong&gt;一个 commit 只做一件事&lt;/strong&gt;：修一个 bug / 加一个功能 / 改一处文档&lt;/li&gt;&#10;&lt;li&gt;❌ 一次 commit 改 50 个文件、跨多个功能&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;好粒度让你能精准回退、精准 cherry-pick。&lt;/p&gt;&#10;&lt;h3 id="2-不要提交的东西"&gt;2. 不要提交的东西&#10;&lt;/h3&gt;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;类型&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;例子&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;处理&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;编译产物&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;dist/&lt;/code&gt; &lt;code&gt;build/&lt;/code&gt; &lt;code&gt;public/&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;加 &lt;code&gt;.gitignore&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;依赖&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;node_modules/&lt;/code&gt; &lt;code&gt;vendor/&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;加 &lt;code&gt;.gitignore&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;敏感信息&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;.env&lt;/code&gt; &lt;code&gt;config.json&lt;/code&gt; 里的密码&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;加 &lt;code&gt;.gitignore&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;IDE 配置&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;.idea/&lt;/code&gt; &lt;code&gt;.vscode/&lt;/code&gt;（团队统一除外）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;加 &lt;code&gt;.gitignore&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;系统文件&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;.DS_Store&lt;/code&gt; &lt;code&gt;Thumbs.db&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;加 &lt;code&gt;.gitignore&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;大型二进制&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;视频、设计稿 PSD&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;用 Git LFS&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h3 id="3-已经提交了敏感信息"&gt;3. 已经提交了敏感信息？&#10;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;立刻做两件事&lt;/strong&gt;：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;改密码 / 撤销凭证&lt;/li&gt;&#10;&lt;li&gt;从 Git 历史清除（用 &lt;code&gt;git filter-repo&lt;/code&gt; 或 BFG Repo-Cleaner）&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;只在最新 commit 改不够，&lt;strong&gt;必须清理历史&lt;/strong&gt;。如果推到 GitHub 是公开仓库，敏感信息相当于已经泄露。&lt;/p&gt;&#10;&lt;h3 id="4-大文件用-git-lfs"&gt;4. 大文件：用 Git LFS&#10;&lt;/h3&gt;&lt;p&gt;Git 不擅长管理大型二进制文件（几十 MB 以上）。Git LFS（Large File Storage）会用指针文件替代真实内容，存到独立存储。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git lfs install&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git lfs track &lt;span style="color:#e6db74"&gt;&amp;#34;*.psd&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git add .gitattributes&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git add *.psd&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git commit -m &lt;span style="color:#e6db74"&gt;&amp;#34;add design files via LFS&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="5-避免-force-push-到共享分支"&gt;5. 避免 force push 到共享分支&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git push --force-with-lease &lt;span style="color:#75715e"&gt;# 安全版：远端没新 commit 才允许&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;绝对禁止 &lt;code&gt;git push --force&lt;/code&gt; 到 &lt;code&gt;main&lt;/code&gt; / &lt;code&gt;dev&lt;/code&gt; 等多人协作的分支。&lt;/p&gt;&#10;&lt;h3 id="6-别在主分支上直接改"&gt;6. 别在主分支上直接改&#10;&lt;/h3&gt;&lt;p&gt;永远在 feature 分支上改，PR 合并。即便是个人项目，也养成这个习惯。&lt;/p&gt;&#10;&lt;h3 id="7-commit-message-模板"&gt;7. commit message 模板&#10;&lt;/h3&gt;&lt;p&gt;在仓库根目录放 &lt;code&gt;.gitmessage&lt;/code&gt;：&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;# &amp;lt;type&amp;gt;(&amp;lt;scope&amp;gt;): &amp;lt;subject&amp;gt;&#10;#&#10;# body (optional)&#10;#&#10;# footer (optional)&#10;&#10;# type: feat fix docs style refactor test chore&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;配置：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git config commit.template .gitmessage&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="8-提速别名与工具"&gt;8. 提速：别名与工具&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 配别名（写到 ~/.gitconfig 也行）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git config --global alias.st status&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git config --global alias.co switch&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git config --global alias.br branch&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git config --global alias.lg &lt;span style="color:#e6db74"&gt;&amp;#34;log --oneline --graph --decorate --all&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git config --global alias.unstage &lt;span style="color:#e6db74"&gt;&amp;#34;restore --staged&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;之后 &lt;code&gt;git st&lt;/code&gt; 就等于 &lt;code&gt;git status&lt;/code&gt;。&lt;/p&gt;&#10;&lt;h3 id="9-出错了怎么办"&gt;9. 出错了怎么办？&#10;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;任何误操作，先 &lt;code&gt;git reflog&lt;/code&gt;&lt;/strong&gt;。它会告诉你 HEAD 走过的每一步，绝大多数情况都能恢复。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="十三推荐学习路径"&gt;十三、推荐学习路径&#10;&lt;/h2&gt;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;第一周&lt;/strong&gt;：掌握第 1～6 节命令，足够日常提交、推送&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;第二周&lt;/strong&gt;：学分支管理与冲突处理&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;第三周&lt;/strong&gt;：上手一次 PR 流程（哪怕是自己的仓库）&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;第一个月&lt;/strong&gt;：配置 SSH、&lt;code&gt;.gitignore&lt;/code&gt;、GitHub Actions&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;持续练习&lt;/strong&gt;：用 Git 管理一切文本内容（博客 / 笔记 / 配置文件）&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="推荐资源"&gt;推荐资源&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://git-scm.com/book/zh/v2" target="_blank" rel="noopener"&#10; &gt;Pro Git 中文版&lt;/a&gt;（官方免费书，最权威）&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://learngitbranching.js.org/?locale=zh_CN" target="_blank" rel="noopener"&#10; &gt;Learn Git Branching&lt;/a&gt;（交互式可视化练习，强烈推荐）&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://ohshitgit.com/" target="_blank" rel="noopener"&#10; &gt;Oh Shit, Git!?!&lt;/a&gt;（急救手册，英文）&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://docs.github.com/zh" target="_blank" rel="noopener"&#10; &gt;GitHub Docs&lt;/a&gt;（官方中文文档）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="十四速查表cheat-sheet"&gt;十四、速查表（Cheat Sheet）&#10;&lt;/h2&gt;&lt;h3 id="仓库操作"&gt;仓库操作&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git init &lt;span style="color:#75715e"&gt;# 初始化仓库&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git clone &amp;lt;url&amp;gt; &lt;span style="color:#75715e"&gt;# 克隆远端仓库&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git remote add origin &amp;lt;url&amp;gt; &lt;span style="color:#75715e"&gt;# 添加远程&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git remote -v &lt;span style="color:#75715e"&gt;# 查看远程&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="文件操作"&gt;文件操作&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git status &lt;span style="color:#75715e"&gt;# 查看状态&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git add &amp;lt;file&amp;gt; &lt;span style="color:#75715e"&gt;# 加入暂存区&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git add . &lt;span style="color:#75715e"&gt;# 暂存区所有改动&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git commit -m &lt;span style="color:#e6db74"&gt;&amp;#34;msg&amp;#34;&lt;/span&gt; &lt;span style="color:#75715e"&gt;# 提交&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git commit --amend &lt;span style="color:#75715e"&gt;# 改写最后一次 commit&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git restore &amp;lt;file&amp;gt; &lt;span style="color:#75715e"&gt;# 撤销工作区改动&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git restore --staged &amp;lt;file&amp;gt; &lt;span style="color:#75715e"&gt;# 撤销暂存&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git rm &amp;lt;file&amp;gt; &lt;span style="color:#75715e"&gt;# 删除文件并暂存&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git mv &amp;lt;old&amp;gt; &amp;lt;new&amp;gt; &lt;span style="color:#75715e"&gt;# 重命名文件并暂存&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="查看历史"&gt;查看历史&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git log &lt;span style="color:#75715e"&gt;# 完整历史&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git log --oneline &lt;span style="color:#75715e"&gt;# 简洁历史&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git log --graph --all &lt;span style="color:#75715e"&gt;# 图形化所有分支&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git diff &lt;span style="color:#75715e"&gt;# 工作区 vs 暂存区&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git diff --staged &lt;span style="color:#75715e"&gt;# 暂存区 vs 版本库&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git show &amp;lt;commit&amp;gt; &lt;span style="color:#75715e"&gt;# 看某次提交详情&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="分支"&gt;分支&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git branch &lt;span style="color:#75715e"&gt;# 列出本地分支&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git branch -a &lt;span style="color:#75715e"&gt;# 列出所有分支&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git branch &amp;lt;name&amp;gt; &lt;span style="color:#75715e"&gt;# 创建分支&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git switch &amp;lt;name&amp;gt; &lt;span style="color:#75715e"&gt;# 切换分支&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git switch -c &amp;lt;name&amp;gt; &lt;span style="color:#75715e"&gt;# 创建并切换&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git branch -d &amp;lt;name&amp;gt; &lt;span style="color:#75715e"&gt;# 删除已合并分支&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git branch -D &amp;lt;name&amp;gt; &lt;span style="color:#75715e"&gt;# 强制删除分支&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="合并"&gt;合并&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git merge &amp;lt;branch&amp;gt; &lt;span style="color:#75715e"&gt;# 合并分支&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git rebase &amp;lt;branch&amp;gt; &lt;span style="color:#75715e"&gt;# 变基&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git rebase -i HEAD~3 &lt;span style="color:#75715e"&gt;# 交互式 rebase（改写最近 3 个 commit）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="远程"&gt;远程&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git fetch &lt;span style="color:#75715e"&gt;# 拉取远端（不合并）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git pull &lt;span style="color:#75715e"&gt;# 拉取并合并&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git push &lt;span style="color:#75715e"&gt;# 推送到远端&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git push -u origin &amp;lt;branch&amp;gt; &lt;span style="color:#75715e"&gt;# 首次推送并建立关联&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git push --force-with-lease &lt;span style="color:#75715e"&gt;# 安全强推&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="撤销与恢复"&gt;撤销与恢复&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git reset --soft HEAD~1 &lt;span style="color:#75715e"&gt;# 撤销 commit 改动留暂存区&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git reset --mixed HEAD~1 &lt;span style="color:#75715e"&gt;# 撤销 commit 改动回工作区&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git reset --hard HEAD~1 &lt;span style="color:#75715e"&gt;# 撤销 commit 并丢弃改动&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git revert &amp;lt;commit&amp;gt; &lt;span style="color:#75715e"&gt;# 新 commit 撤销指定 commit&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git stash &lt;span style="color:#75715e"&gt;# 临时存放改动&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git stash pop &lt;span style="color:#75715e"&gt;# 恢复并删除 stash&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git reflog &lt;span style="color:#75715e"&gt;# 查看 HEAD 历史（救命用）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#10;&lt;h2 id="十五写在最后"&gt;十五、写在最后&#10;&lt;/h2&gt;&lt;p&gt;Git 的学习曲线前陡后缓：&lt;strong&gt;前 2 小时会觉得概念很多、命令记不住&lt;/strong&gt;；&lt;strong&gt;用满一周后会有&amp;quot;豁然开朗&amp;quot;的感觉&lt;/strong&gt;；&lt;strong&gt;用满一个月后你就再也离不开它了&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;不要试图一次背完所有命令。&lt;strong&gt;先记住 5 条&lt;/strong&gt;：&lt;code&gt;add&lt;/code&gt; / &lt;code&gt;commit&lt;/code&gt; / &lt;code&gt;push&lt;/code&gt; / &lt;code&gt;pull&lt;/code&gt; / &lt;code&gt;status&lt;/code&gt;，跑起来再说。其它的查速查表或本文就好。&lt;/p&gt;&#10;&lt;p&gt;最后送一句 Git 社区的老话：&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;&amp;ldquo;Commit early, commit often, push frequently.&amp;rdquo;&lt;/strong&gt;&#10;（早提交，多提交，常推送。）&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;祝你在版本控制的路上少踩坑、多享受。&lt;/p&gt;&#10;</description></item><item><title>BIM 模型审查引擎・第三方空间几何算法包调研报告</title><link>https://blog.5616760.com/0006.html</link><pubDate>Wed, 16 Sep 2026 14:00:00 +0800</pubDate><guid>https://blog.5616760.com/0006.html</guid><description>&lt;h2 id="1-调研背景"&gt;1 调研背景&#10;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;项目目标&lt;/strong&gt;：开发类似 Solibri 的 BIM 模型审查插件，核心需求为&lt;strong&gt;三维构件空间关系判定&lt;/strong&gt;——碰撞检测、距离计算、包含 / 相交 / 分离、空间包围盒、实体布尔、模型拓扑校验，支撑 BIM 合规性规则检查（管线净距、构件冲突、空间占位、洞口校核等）。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;调研对象&lt;/strong&gt;：开源空间几何内核、空间索引库、IFC 几何处理组件；重点评估适配 .NET 栈（Revit 插件，.NET 10）、支持 BIM 三角网格 / 实体 BREP、可做空间查询、许可友好、性能可用于大规模模型场景。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;调研目的&lt;/strong&gt;：对比各算法包能力、限制、集成成本，输出技术路线选型建议，为审查引擎架构定案提供依据。&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;业务边界说明&lt;/strong&gt;：Solibri 核心能力 = IFC 模型解析 + 空间索引 + 三维几何相交 / 距离计算 + 规则引擎。本次调研聚焦&lt;strong&gt;空间几何与空间索引&lt;/strong&gt;算法包，&lt;strong&gt;不含&lt;/strong&gt;规则引擎、IFC 解析库（IFC 解析可单独选用 IfcOpenShell 等）。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h2 id="2-需求拆解审查引擎核心空间能力清单"&gt;2 需求拆解（审查引擎核心空间能力清单）&#10;&lt;/h2&gt;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;类别&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;具体能力需求&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;BIM 审查场景&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;基础几何&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;点 / 线 / 面 / 实体、包围盒 AABB/OBB、三角网格、BREP 实体&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;构件粗筛、包围盒预检测&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;空间关系判断&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;相交、包含、分离、接触、最小距离、穿透深度&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;碰撞检查、构件净距校验&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;布尔运算&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;实体求交、求差、求和&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;空间扣除、洞口校核、体积计算&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;空间索引&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;AABB 树、BVH、八叉树，批量构件快速筛选（减少两两几何计算）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;大模型性能优化（上万构件）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;网格处理&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;三角网格简化、缝合、修复非流形&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Revit 导出模型存在烂面、破面&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;接口与集成&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;.NET 原生 / C++ 可封装 C#、支持嵌入 Revit 插件、支持 IFC/STEP 几何&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;插件部署限制&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;许可&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;MIT/Apache 2.0 等宽松开源，避免 GPL 传染性开源&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;商用插件发布风险&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h2 id="3-候选开源空间算法包调研详情"&gt;3 候选开源空间算法包调研详情&#10;&lt;/h2&gt;&lt;h3 id="31-opencascadeocct"&gt;3.1 OpenCASCADE（OCCT）&#10;&lt;/h3&gt;&lt;p&gt;工业级三维几何内核，C++ 开发，老牌 BREP 实体几何引擎，STEP/IGES 原生支持，大量 BIM/CAE 软件底层依赖（FreeCAD 底层就是 OCCT）。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;✅ &lt;strong&gt;支持&lt;/strong&gt;：BREP 实体、曲面、布尔运算、实体相交、距离计算、拓扑分析；自带 AABB 包围盒；支持 STEP/IGES；可处理参数化实体&lt;/li&gt;&#10;&lt;li&gt;⚠️ &lt;strong&gt;限制&lt;/strong&gt;：&#10;&lt;ul&gt;&#10;&lt;li&gt;C++ 库，.NET 需要自行封装（OCCT .NET wrapper 非官方，如 OCC.Net）&lt;/li&gt;&#10;&lt;li&gt;编译、部署复杂；体积大&lt;/li&gt;&#10;&lt;li&gt;对破损 BIM 模型（非流形、碎面）容错较差&lt;/li&gt;&#10;&lt;li&gt;无内置 BVH 空间索引，需要自己实现或搭配第三方 BVH 库做构件加速筛选&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;📜 &lt;strong&gt;License&lt;/strong&gt;：LGPL 2.1。&lt;strong&gt;商用注意&lt;/strong&gt;：动态链接 LGPL 库不传染源码；静态链接会触发 LGPL 开源义务，插件打包需要关注发布方式&lt;/li&gt;&#10;&lt;li&gt;🎯 &lt;strong&gt;适用场景&lt;/strong&gt;：需要高精度实体布尔、拓扑检查；适合做精确几何计算。Solibri 早期底层几何内核同类路线&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="32-cgalcomputational-geometry-algorithms-library"&gt;3.2 CGAL（Computational Geometry Algorithms Library）&#10;&lt;/h3&gt;&lt;p&gt;C++ 计算几何算法库，学术 + 工业级，算法种类最全，支持三角网格、布尔、网格修复、BVH 空间查询。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;✅ &lt;strong&gt;支持&lt;/strong&gt;：精确几何谓词、三角网格布尔、网格修复、BVH / 空间索引、距离、相交检测；点云、多边形、多面体处理能力极强&lt;/li&gt;&#10;&lt;li&gt;⚠️ &lt;strong&gt;限制&lt;/strong&gt;：&#10;&lt;ul&gt;&#10;&lt;li&gt;C++ 库，需要 C++/CLI 封装给 .NET；编译门槛高&lt;/li&gt;&#10;&lt;li&gt;大量算法是精确算术，大规模 BIM 模型性能开销大；可切换浮点数模式，但会引入精度问题&lt;/li&gt;&#10;&lt;li&gt;不原生支持 BREP 实体，偏重三角网格&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;📜 &lt;strong&gt;License&lt;/strong&gt;：混合开源（GPL/LGPL），&lt;strong&gt;部分模块 GPL&lt;/strong&gt;，商用项目需要谨慎挑选模块&lt;/li&gt;&#10;&lt;li&gt;🎯 &lt;strong&gt;适用场景&lt;/strong&gt;：网格修复、复杂空间查询；如果 BIM 全部转三角网格后做审查，CGAL 是强候选&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="33-bullet-physicsbullet3"&gt;3.3 Bullet Physics（Bullet3）&#10;&lt;/h3&gt;&lt;p&gt;C++ 物理引擎，内置成熟 BVH、AABB、碰撞检测库，游戏 / 可视化领域大量使用。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;✅ &lt;strong&gt;支持&lt;/strong&gt;：AABB/OBB、BVH 加速结构、三角网格碰撞、距离查询；对海量三角面性能优秀；跨平台&lt;/li&gt;&#10;&lt;li&gt;⚠️ &lt;strong&gt;限制&lt;/strong&gt;：只做碰撞相交，&lt;strong&gt;不支持实体布尔运算，不支持 BREP 拓扑&lt;/strong&gt;；几何是离散三角网格，无实体拓扑信息；不适合体积、洞口布尔扣除场景&lt;/li&gt;&#10;&lt;li&gt;📜 &lt;strong&gt;License&lt;/strong&gt;：zlib 许可，极其宽松，商用无源码传染风险&lt;/li&gt;&#10;&lt;li&gt;🎯 &lt;strong&gt;适用场景&lt;/strong&gt;：粗碰撞筛查、净距检测，不适合实体拓扑类审查。&lt;strong&gt;适合作为第一层空间索引加速层&lt;/strong&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="34-embreeintel"&gt;3.4 Embree（Intel）&#10;&lt;/h3&gt;&lt;p&gt;Intel 开源光线追踪内核，高性能 BVH，面向光线投射、包围盒查询。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;✅ &lt;strong&gt;支持&lt;/strong&gt;：高性能 BVH 构建、光线相交查询；大规模三角面查询速度极快&lt;/li&gt;&#10;&lt;li&gt;⚠️ &lt;strong&gt;限制&lt;/strong&gt;：只做光线 / 三角面相交，无实体布尔、无空间距离谓词；不是通用几何库&lt;/li&gt;&#10;&lt;li&gt;📜 &lt;strong&gt;License&lt;/strong&gt;：Apache 2.0，商用友好&lt;/li&gt;&#10;&lt;li&gt;🎯 &lt;strong&gt;适用场景&lt;/strong&gt;：BIM 空间射线查询（房间空间拾取、遮挡检测），不适合构件碰撞和布尔&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="35-triangle--tetgen"&gt;3.5 Triangle / TetGen&#10;&lt;/h3&gt;&lt;p&gt;三角面、四面体网格生成库，仅用于网格剖分，&lt;strong&gt;不能做空间关系判断与布尔&lt;/strong&gt;，仅辅助几何预处理，不适合作为主引擎。&lt;/p&gt;&#10;&lt;h3 id="36-net-原生库适合-revit-c-插件直接调用"&gt;3.6 .NET 原生库（适合 Revit C# 插件直接调用）&#10;&lt;/h3&gt;&lt;h4 id="361-mathnetnumerics"&gt;3.6.1 MathNet.Numerics&#10;&lt;/h4&gt;&lt;p&gt;纯 .NET 数值库，矩阵、向量基础运算；&lt;strong&gt;无三维实体 / 网格相交、无空间索引&lt;/strong&gt;，只能做底层数学工具，不能作为空间引擎。License MIT。&lt;/p&gt;&#10;&lt;h4 id="362-rhino3dmrhino3d-开源-net-库"&gt;3.6.2 Rhino3dm（Rhino3D 开源 .NET 库）&#10;&lt;/h4&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;重点&lt;/strong&gt;：McNeel 官方开源 .NET 库，Rhino 几何内核剥离，NuGet 包直接 C# 引用，&lt;strong&gt;无需 C++ 封装&lt;/strong&gt;！&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;✅ &lt;strong&gt;支持&lt;/strong&gt;：BREP 实体、NURBS 曲面、三角网格；相交、距离、布尔运算；AABB/OBB；内置 BVH；支持 STEP 导入；纯 .NET 托管调用&lt;/li&gt;&#10;&lt;li&gt;⚠️ &lt;strong&gt;限制&lt;/strong&gt;：&#10;&lt;ul&gt;&#10;&lt;li&gt;开源版 Rhino3dm 是几何数据模型 + 基础计算，&lt;strong&gt;不包含完整 Rhino 空间加速全套高级算法&lt;/strong&gt;；大规模上万构件场景性能需要测试&lt;/li&gt;&#10;&lt;li&gt;复杂破损 IFC 模型 BREP 转换容易失败&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;/li&gt;&#10;&lt;li&gt;📜 &lt;strong&gt;License&lt;/strong&gt;：MIT，商用非常友好，无传染性开源&lt;/li&gt;&#10;&lt;li&gt;🎯 &lt;strong&gt;亮点&lt;/strong&gt;：&lt;strong&gt;唯一可直接在 Revit C# 插件中引用、无需 C++ 封装的 BREP + 网格几何库&lt;/strong&gt;，集成成本最低，开发速度最快&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h4 id="363-nettopologysuitents"&gt;3.6.3 NetTopologySuite（NTS）&#10;&lt;/h4&gt;&lt;p&gt;JTS 拓扑套件 .NET 移植版本，&lt;strong&gt;二维几何王者，三维能力弱&lt;/strong&gt;，仅支持简单 3D 点线面，不支持 BREP、三维实体布尔。MIT 许可。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;结论&lt;/strong&gt;：NTS 适合 2D 图纸审查，不适合三维 BIM 构件空间审查。&lt;/p&gt;&#10;&lt;h3 id="37-ifcopenshell补充非纯空间算法包"&gt;3.7 IfcOpenShell（补充，非纯空间算法包）&#10;&lt;/h3&gt;&lt;p&gt;C++/Python/C# 绑定，&lt;strong&gt;IFC 解析库&lt;/strong&gt;，可将 IFC 构件解析成 OCCT 几何；职责是 IFC→几何转换，不是审查计算内核，常搭配 OCCT 一起使用。LGPL。&lt;/p&gt;&#10;&lt;h2 id="4-候选包横向对比汇总表"&gt;4 候选包横向对比汇总表&#10;&lt;/h2&gt;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;算法包&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;开发语言&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;BREP 实体&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;三角网格布尔&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;空间索引 (BVH)&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;三维相交 / 距离&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;.NET 集成难度&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;License&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;商用风险&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;OpenCASCADE (OCCT)&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;C++&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;✅&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;✅&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;❌ 需自建&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;✅&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;高（C++ 封装）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;LGPL 2.1&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;中等（静态链接风险）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;CGAL&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;C++&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;❌&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;✅&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;✅&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;✅&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;很高&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;GPL/LGPL 混合&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;高（部分模块 GPL）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Bullet3&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;C++&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;❌&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;✅&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;✅&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;✅（仅碰撞）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;中&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;zlib&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;低&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Rhino3dm&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;.NET&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;✅&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;✅&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;✅ 基础&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;✅&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;极低（NuGet）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;MIT&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;低&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Embree&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;C++&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;❌&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;❌&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;✅&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;仅光线相交&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;中&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Apache 2.0&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;低&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;NTS&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;.NET&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;❌&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;❌&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;❌&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;仅弱 3D&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;极低&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;MIT&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;低&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h2 id="5-技术路线方案对比审查引擎架构可选路线"&gt;5 技术路线方案对比（审查引擎架构可选路线）&#10;&lt;/h2&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;目标&lt;/strong&gt;：开发 Revit 插件，BIM 构件空间审查（Solibri 同类功能）&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="方案-arhino3dm-为主内核推荐快速原型路线"&gt;方案 A：Rhino3dm 为主内核（&lt;strong&gt;推荐【快速原型路线】&lt;/strong&gt;）&#10;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;架构&lt;/strong&gt;：Revit 插件 (C#) → Rhino3dm（BREP + 网格几何、相交、布尔、BVH）→ 空间关系判断 → 规则引擎&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;优势&lt;/strong&gt;：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;.NET 原生 NuGet，无 C++ 编译、跨平台封装难题，直接嵌入 Revit 插件，&lt;strong&gt;开发周期短&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;MIT 许可，商用无风险；BREP 与三角网格双支持；自带 BVH&lt;/li&gt;&#10;&lt;li&gt;可以直接读取 Revit 几何转换到 Rhino 几何对象，&lt;strong&gt;转换链路短&lt;/strong&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;短板&lt;/strong&gt;：超大模型（几万构件）下 BVH 性能上限低于 OCCT/CGAL；极端破损模型鲁棒性一般&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;适用&lt;/strong&gt;：MVP 原型开发、中小规模 BIM 模型审查；团队以 C#/.NET 开发为主，缺少 C++ 底层开发人力&lt;/p&gt;&#10;&lt;h3 id="方案-bocct-为主内核--bullet-做空间索引加速推荐高性能生产路线"&gt;方案 B：OCCT 为主内核 + Bullet 做空间索引加速（&lt;strong&gt;推荐【高性能生产路线】&lt;/strong&gt;）&#10;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;架构&lt;/strong&gt;：Revit 插件 (C#) ↔ C++ 封装层 ↔ OCCT（BREP 实体布尔、拓扑） + Bullet（BVH 批量包围盒预筛选）&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;流程&lt;/strong&gt;：&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart LR&#10; A["N² 候选构件对&lt;br/&gt;（如 10000 构件 → 5000 万对）"] --&gt; B["Bullet BVH&lt;br/&gt;包围盒预筛选"]&#10; B --&gt;|不相交| Z["直接跳过&lt;br/&gt;（占 90%+）"]&#10; B --&gt;|相交| C["OCCT BREP&lt;br/&gt;精确相交检测"]&#10; C --&gt; D{"有交集？"}&#10; D --&gt;|否| E["计算最小距离"]&#10; D --&gt;|是| F["布尔运算&lt;br/&gt;求交 / 求差"]&#10; E --&gt; G["输出审查报告"]&#10; F --&gt; G&#10; Z --&gt; G&lt;/pre&gt;&lt;p&gt;两层职责清晰分离**：Bullet 只负责&amp;quot;快速过滤候选&amp;quot;，OCCT 只在&amp;quot;高置信度需要精确计算&amp;quot;时才被调用，整体性能远优于纯 OCCT 两两比对。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;优势&lt;/strong&gt;：工业级精度，Solibri 同类底层思路；处理实体拓扑、洞口扣除、体积计算能力最强&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;短板&lt;/strong&gt;：C++ 封装、编译、部署复杂；LGPL 许可管控；开发周期长；需要 C++ 开发人力&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;适用&lt;/strong&gt;：长期产品化，面向大型轨道交通 / 机场复杂 BIM 项目，&lt;strong&gt;上万构件高精度审查场景&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h3 id="方案-ccgal--bullet纯网格路线"&gt;方案 C：CGAL + Bullet（纯网格路线）&#10;&lt;/h3&gt;&lt;p&gt;全部构件转三角网格，CGAL 做网格布尔 / 修复，Bullet 做 BVH 加速。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;短板&lt;/strong&gt;：丢失 BREP 拓扑信息；不能做实体参数化分析；许可风险高&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;适用&lt;/strong&gt;：仅做网格碰撞，&lt;strong&gt;不推荐作为 BIM 审查主引擎&lt;/strong&gt;&lt;/p&gt;&#10;&lt;h3 id="方案-d自研空间算法不推荐"&gt;方案 D：自研空间算法（&lt;strong&gt;不推荐&lt;/strong&gt;）&#10;&lt;/h3&gt;&lt;p&gt;自己实现 BVH、三维相交、实体布尔。三维计算几何坑极多（浮点精度、非流形、拓扑退化），研发成本巨大，稳定性很难达到 OCCT/Rhino3dm 成熟库水平。&lt;/p&gt;&#10;&lt;h2 id="6-关键风险点"&gt;6 关键风险点&#10;&lt;/h2&gt;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;BIM 模型几何破损问题&lt;/strong&gt;：Revit/IFC 导出模型经常出现非流形、碎面、重叠面；所有开源库都会受影响，&lt;strong&gt;需要前置几何修复流程&lt;/strong&gt;（CGAL 或 OCCT 自带修复工具）&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;浮点精度问题&lt;/strong&gt;：三维几何判断容差是 BIM 审查核心，所有库都需要&lt;strong&gt;统一全局容差配置&lt;/strong&gt;（Solibri 可配置规则容差）&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;许可合规风险&lt;/strong&gt;：&lt;strong&gt;GPL 库绝对不能直接静态链接到商用闭源插件&lt;/strong&gt;；LGPL 需要严格区分动态 / 静态链接&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Revit 进程内存限制&lt;/strong&gt;：大规模模型几何加载会占用大量内存，&lt;strong&gt;空间索引需要做按需加载&lt;/strong&gt;，不能一次性载入全部构件&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="7-选型建议与落地路径"&gt;7 选型建议与落地路径&#10;&lt;/h2&gt;&lt;h3 id="71-选型结论"&gt;7.1 选型结论&#10;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;短期 MVP 原型开发（优先推荐）：采用 Rhino3dm（MIT）&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;优点：C# 直接集成、开发速度快、许可安全，快速验证整套审查业务逻辑（构件相交、净距、空间包含规则）&lt;/li&gt;&#10;&lt;li&gt;适用：验证业务规则、开发 Demo、内部测试，快速跑通和 Solibri 对齐的审查案例&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;中长期产品化，面向大型复杂 BIM 项目：采用 OCCT (LGPL) + Bullet (zlib) 组合架构&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;粗筛用 Bullet BVH 做包围盒加速；精确几何相交、布尔、拓扑计算交给 OCCT。需要投入 C++ 封装开发，同时做好开源许可合规管理&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;不推荐&lt;/strong&gt;：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;CGAL 作为主内核（许可 + 性能复杂度）&lt;/li&gt;&#10;&lt;li&gt;自研底层几何算法&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;选型决策树&lt;/strong&gt;（按&amp;quot;项目阶段 + 团队配置&amp;quot;分流）：&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart TD&#10; Start(["项目启动选型"]) --&gt; Q1{"项目阶段 / 模型规模"}&#10; Q1 --&gt;|"MVP 原型&lt;br/&gt;中小规模（≤ 5000 构件）"| A["方案 A：Rhino3dm"]&#10; Q1 --&gt;|"产品化&lt;br/&gt;大型复杂 BIM（≥ 10000 构件）"| Q2{"团队有 C++ 人力？"}&#10; Q2 --&gt;|是| B["方案 B：OCCT + Bullet"]&#10; Q2 --&gt;|否| A&#10; Q1 -.-&gt;|"只需粗筛&lt;br/&gt;碰撞检测"| C["Bullet 单独"]&#10;&#10; A -.-&gt; N1["MIT / .NET 原生&lt;br/&gt;开发周期最短&lt;br/&gt;性能天花板受限"]&#10; B -.-&gt; N2["LGPL + 工业精度&lt;br/&gt;最复杂也最强&lt;br/&gt;封装成本高"]&#10; C -.-&gt; N3["zlib / 轻量&lt;br/&gt;仅适合碰撞筛查&lt;br/&gt;无布尔运算能力"]&lt;/pre&gt;&lt;h3 id="72-落地实施步骤"&gt;7.2 落地实施步骤&#10;&lt;/h3&gt;&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart LR&#10; A["原型阶段&lt;br/&gt;Rhino3dm MVP&lt;br/&gt;搭 Demo + 跑通业务规则"] --&gt; B["压力测试&lt;br/&gt;5000 / 10000 构件&lt;br/&gt;耗时 + 内存基准"]&#10; B --&gt; C{"性能达标？"}&#10; C --&gt;|"是（中小模型够用）"| D["投产&lt;br/&gt;上线 Rhino3dm 方案"]&#10; C --&gt;|"否（万级构件卡顿）"| F["架构迭代&lt;br/&gt;下沉 C++ 层"]&#10; F --&gt; G["OCCT + Bullet&lt;br/&gt;生产方案"]&#10; G --&gt; D&#10; D --&gt; H["配套&lt;br/&gt;几何修复 + 容差管理 +&lt;br/&gt;空间索引持久化"]&lt;/pre&gt;&lt;p&gt;各阶段要点：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;原型阶段&lt;/strong&gt;：基于 Rhino3dm 搭建最小验证 Demo，实现：构件包围盒 BVH、构件最小距离、相交判断；拿轨道交通 BIM 模型做案例测试，验证性能与精度&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;压力测试&lt;/strong&gt;：针对 5000 / 10000 构件规模模型，测试查询耗时、内存占用，评估 Rhino3dm 性能瓶颈&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;架构迭代&lt;/strong&gt;：如果原型阶段发现大模型性能不足，拆分架构，把计算密集几何部分下沉到 C++ 层，切换 OCCT + Bullet 方案，上层 C# 插件保持业务规则不变&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;配套&lt;/strong&gt;：几何预处理模块（破面修复）、统一容差管理、构件空间索引持久化&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="8-附录待后续调研事项"&gt;8 附录：待后续调研事项&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;Rhino3dm 大规模构件 BVH 性能实测、破损 IFC 几何转换成功率&lt;/li&gt;&#10;&lt;li&gt;OCCT .NET 封装方案（OCC.Net）稳定性、LGPL 商用发布合规细则&lt;/li&gt;&#10;&lt;li&gt;空间审查规则引擎技术选型（和几何引擎解耦）&lt;/li&gt;&#10;&lt;li&gt;IFC 几何转换组件（IfcOpenShell）与几何内核对接测试&lt;/li&gt;&#10;&lt;/ul&gt;&#10;</description></item><item><title>Docker 基础教程（2026 修订版）</title><link>https://blog.5616760.com/0005.html</link><pubDate>Wed, 16 Sep 2026 10:00:00 +0800</pubDate><guid>https://blog.5616760.com/0005.html</guid><description>&#10; &lt;blockquote&gt;&#10; &lt;p&gt;本文是 2020 年《Docker 基础教程》的全面修订版。这些年 Docker 生态变化很大：Compose 已成为内置插件、BuildKit 成为默认构建器、国内镜像加速格局几经洗牌。原文章的内容已按 2026 年的现状重写。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h2 id="1-docker-简介"&gt;1. Docker 简介&#10;&lt;/h2&gt;&lt;p&gt;Docker 是基于 Go 语言的开源项目，通过对应用的封装、分发、部署、运行等生命周期的管理，实现**&amp;ldquo;一次封装，到处运行&amp;rdquo;**。&lt;/p&gt;&#10;&lt;p&gt;它解决的是运行环境和配置问题，是方便持续集成的容器虚拟化技术。&lt;/p&gt;&#10;&lt;p&gt;补充一点 2020 年文章里没有的背景：如今容器格式和运行时已经由 &lt;strong&gt;OCI（Open Container Initiative）&lt;/strong&gt; 标准化，Docker 镜像本质上是 OCI 镜像，可以被 containerd、Podman、Kubernetes 等任何符合标准的运行时直接使用——这也意味着你学到的镜像知识不会绑定在某一家工具上。&lt;/p&gt;&#10;&lt;h3 id="11-与传统虚拟技术的差别"&gt;1.1 与传统虚拟技术的差别&#10;&lt;/h3&gt;&lt;p&gt;传统虚拟机是虚拟出硬件后，在其上运行一个完整的操作系统，再在该系统上运行应用。&lt;/p&gt;&#10;&lt;p&gt;容器内的应用&lt;strong&gt;直接运行于宿主内核&lt;/strong&gt;，容器没有自己的内核，也没有硬件虚拟，因此比传统虚拟机更轻便：&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;维度&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;虚拟机&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;容器&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;隔离级别&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;硬件级（hypervisor）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;进程级（namespace + cgroups）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;启动速度&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;分钟级&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;秒级甚至毫秒级&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;体积&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;GB 级&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;MB 级&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;性能损耗&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;有&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;接近原生&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;每个容器之间互相隔离，各有自己的文件系统，容器之间进程不会相互影响。&lt;/p&gt;&#10;&lt;h3 id="12-docker-优势"&gt;1.2 Docker 优势&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;轻量，秒级启动&lt;/li&gt;&#10;&lt;li&gt;标准的打包、部署、运行方案（OCI 标准）&lt;/li&gt;&#10;&lt;li&gt;镜像分层存储，支持增量分发&lt;/li&gt;&#10;&lt;li&gt;易于构建，适合自动化测试和持续集成&lt;/li&gt;&#10;&lt;li&gt;性能高，内存和 IO 开销低&lt;/li&gt;&#10;&lt;li&gt;生态成熟：Docker Hub 海量镜像、Compose 一键编排&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="13-docker-基本组成"&gt;1.3 Docker 基本组成&#10;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;镜像（image）&lt;/strong&gt;：只读模板，用来创建容器。一个镜像可以创建很多容器，类似类和对象的关系。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;容器（container）&lt;/strong&gt;：镜像的运行实例。可以启动、停止、删除，每个容器相互隔离。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;仓库（repository）&lt;/strong&gt;：集中存放镜像的场所。最大的公开仓库是 Docker Hub；国内各大云厂商（阿里云、腾讯云等）也都提供镜像仓库服务。&lt;/p&gt;&#10;&lt;h2 id="2-docker-安装"&gt;2. Docker 安装&#10;&lt;/h2&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;时代变了：CentOS 7 已于 2024 年停止维护（EOL），其自带 yum 源不可用。现在生产环境推荐 &lt;strong&gt;Ubuntu 22.04/24.04 LTS、Debian 12 或 Rocky/Alma Linux&lt;/strong&gt;。以下以 Ubuntu 为例。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="21-ubuntu-安装步骤官方推荐方式"&gt;2.1 Ubuntu 安装步骤（官方推荐方式）&#10;&lt;/h3&gt;&lt;p&gt;安装依赖并添加 Docker 官方 apt 仓库：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get update&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get install -y ca-certificates curl&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo install -m &lt;span style="color:#ae81ff"&gt;0755&lt;/span&gt; -d /etc/apt/keyrings&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo chmod a+r /etc/apt/keyrings/docker.asc&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;deb [arch=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;dpkg --print-architecture&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt; signed-by=/etc/apt/keyrings/docker.asc] \&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#e6db74"&gt; https://download.docker.com/linux/ubuntu &lt;/span&gt;&lt;span style="color:#66d9ef"&gt;$(&lt;/span&gt;. /etc/os-release &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; echo $VERSION_CODENAME&lt;span style="color:#66d9ef"&gt;)&lt;/span&gt;&lt;span style="color:#e6db74"&gt; stable&amp;#34;&lt;/span&gt; | &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sudo tee /etc/apt/sources.list.d/docker.list &amp;gt; /dev/null&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;安装 Docker Engine 与 Compose 插件：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get update&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt-get install -y docker-ce docker-ce-cli containerd.io &lt;span style="color:#ae81ff"&gt;\&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; docker-buildx-plugin docker-compose-plugin&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;注意最后两个包：&lt;code&gt;docker-buildx-plugin&lt;/code&gt; 和 &lt;code&gt;docker-compose-plugin&lt;/code&gt;——2026 年 &lt;strong&gt;&lt;code&gt;docker compose&lt;/code&gt;（带空格）已是内置子命令&lt;/strong&gt;，不再需要单独安装 &lt;code&gt;docker-compose&lt;/code&gt; 这个 Python 老工具。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;启动并设置开机自启：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl enable --now docker&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;验证安装：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker run hello-world&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;免 sudo 运行 docker&lt;/strong&gt;（把当前用户加入 docker 组，重新登录生效）：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo usermod -aG docker $USER&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="22-windows--macos"&gt;2.2 Windows / macOS&#10;&lt;/h3&gt;&lt;p&gt;桌面端使用 &lt;strong&gt;Docker Desktop&lt;/strong&gt;：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Windows 需启用 &lt;strong&gt;WSL 2&lt;/strong&gt; 后端（&lt;code&gt;wsl --install&lt;/code&gt;），体验远好于旧版的 Hyper-V 模式&lt;/li&gt;&#10;&lt;li&gt;macOS 原生支持 Apple Silicon（arm64），拉取 amd64 镜像时加 &lt;code&gt;--platform linux/amd64&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="23-国内镜像加速2026-年现状"&gt;2.3 国内镜像加速（2026 年现状）&#10;&lt;/h3&gt;&lt;p&gt;这块变化最大。2024 年起大批公益镜像站关停，目前可用的方案：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;阿里云个人加速器&lt;/strong&gt;（推荐）：登录 &lt;a class="link" href="https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors" target="_blank" rel="noopener"&#10; &gt;阿里云容器镜像服务&lt;/a&gt;，在&amp;quot;镜像加速器&amp;quot;页面获取你的专属地址&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;云厂商内网加速&lt;/strong&gt;：阿里云 ECS、腾讯云 CVM 内网自带加速域名，无需配置&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;其他存活镜像站&lt;/strong&gt;：可用性随时变化，建议配置多个做兜底&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;配置方式——编辑 &lt;code&gt;/etc/docker/daemon.json&lt;/code&gt;：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;#34;registry-mirrors&amp;#34;&lt;/span&gt;: [&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;https://xxxxxx.mirror.aliyuncs.com&amp;#34;&lt;/span&gt;,&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;https://docker.m.daocloud.io&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ]&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;重载并重启：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl daemon-reload&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo systemctl restart docker&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;验证加速器是否生效：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker info | grep -A &lt;span style="color:#ae81ff"&gt;5&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#34;Registry Mirrors&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;💡 如果加速器全部失效，终极方案是自建：一台海外 VPS 上用 &lt;code&gt;registry:2&lt;/code&gt; 镜像搭一个代理缓存，或直接把常用镜像托管到阿里云个人仓库。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h2 id="3-docker-常用命令"&gt;3. Docker 常用命令&#10;&lt;/h2&gt;&lt;h3 id="31-帮助与信息"&gt;3.1 帮助与信息&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker version &lt;span style="color:#75715e"&gt;# 版本&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker info &lt;span style="color:#75715e"&gt;# 系统信息（含镜像加速器、存储驱动等）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker &amp;lt;命令&amp;gt; --help &lt;span style="color:#75715e"&gt;# 任意子命令的帮助&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="32-镜像命令"&gt;3.2 镜像命令&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker images &lt;span style="color:#75715e"&gt;# 列出本地镜像&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker search tomcat &lt;span style="color:#75715e"&gt;# 搜索镜像&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker pull tomcat:10-jdk21 &lt;span style="color:#75715e"&gt;# 下载镜像（建议显式指定 tag，别用 latest）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker rmi tomcat:10-jdk21 &lt;span style="color:#75715e"&gt;# 删除镜像&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker image prune -a &lt;span style="color:#75715e"&gt;# 清理所有无用镜像（原 dangling 镜像清理的升级版）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;2026 年的最佳实践：生产环境&lt;strong&gt;固定镜像 tag 和 digest&lt;/strong&gt;（如 &lt;code&gt;tomcat@sha256:...&lt;/code&gt;），避免 &lt;code&gt;latest&lt;/code&gt; 在重建时悄悄升级导致事故。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="33-容器命令"&gt;3.3 容器命令&#10;&lt;/h3&gt;&lt;p&gt;新建并启动容器（后台运行 + 端口映射 + 自动重启）：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker run -d --name web -p 8080:80 --restart unless-stopped nginx:1.27&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;常用 &lt;code&gt;-run&lt;/code&gt; 参数对照：&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;参数&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;含义&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;-d&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;后台运行&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;-p 宿主端口:容器端口&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;端口映射&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;--name xxx&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;指定容器名（代替又长又难敲的容器 ID）&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;--restart unless-stopped&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;开机/异常自动重启&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;-v /data:/var/lib/mysql&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;挂载数据卷&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;-e MYSQL_ROOT_PASSWORD=xxx&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;注入环境变量&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;--network xxx&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;加入指定网络&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;容器生命周期：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker ps &lt;span style="color:#75715e"&gt;# 运行中的容器&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker ps -a &lt;span style="color:#75715e"&gt;# 所有容器（含已停止）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker start web &lt;span style="color:#75715e"&gt;# 启动&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker restart web &lt;span style="color:#75715e"&gt;# 重启&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker stop web &lt;span style="color:#75715e"&gt;# 停止（发 SIGTERM，优雅退出）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker kill web &lt;span style="color:#75715e"&gt;# 强制停止（SIGKILL）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker rm web &lt;span style="color:#75715e"&gt;# 删除已停止的容器&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker rm -f web &lt;span style="color:#75715e"&gt;# 强制删除运行中的容器&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker container prune &lt;span style="color:#75715e"&gt;# 批量清理所有停止的容器&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;查看与调试：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker logs -f --tail &lt;span style="color:#ae81ff"&gt;100&lt;/span&gt; web &lt;span style="color:#75715e"&gt;# 跟踪查看最后 100 行日志&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker top web &lt;span style="color:#75715e"&gt;# 容器内进程&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker inspect web &lt;span style="color:#75715e"&gt;# 容器完整配置（JSON）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker stats &lt;span style="color:#75715e"&gt;# 实时资源占用（容器版 top）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;进入容器（推荐 &lt;code&gt;exec&lt;/code&gt; 而不是老教程里的 &lt;code&gt;attach&lt;/code&gt;）：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker exec -it web /bin/bash &lt;span style="color:#75715e"&gt;# 在运行中的容器里开一个新终端&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;原 2020 年教程推荐的 &lt;code&gt;docker attach&lt;/code&gt; 会共享容器主进程的 stdin，&lt;code&gt;exit&lt;/code&gt; 会直接把容器停掉；&lt;code&gt;docker exec&lt;/code&gt; 是新开进程，退出不影响容器，&lt;strong&gt;日常调试一律用 exec&lt;/strong&gt;。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="34-docker-composev2必会"&gt;3.4 Docker Compose（v2，必会）&#10;&lt;/h3&gt;&lt;p&gt;2026 年 Compose 已是 Docker 内置插件，用&lt;strong&gt;空格&lt;/strong&gt;调用，配置文件也统一为 &lt;code&gt;compose.yaml&lt;/code&gt;：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker compose up -d &lt;span style="color:#75715e"&gt;# 根据 compose.yaml 创建并启动全部服务&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker compose ps &lt;span style="color:#75715e"&gt;# 查看服务状态&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker compose logs -f &lt;span style="color:#75715e"&gt;# 跟踪日志&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker compose down &lt;span style="color:#75715e"&gt;# 停止并删除容器（-v 连数据卷一起删）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;一个典型的 &lt;code&gt;compose.yaml&lt;/code&gt;：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;services&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;web&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;nginx:1.27&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;ports&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#e6db74"&gt;&amp;#34;8080:80&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;./html:/usr/share/nginx/html&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;restart&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;unless-stopped&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;db&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;image&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;mysql:8.4&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;environment&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;MYSQL_ROOT_PASSWORD&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;example&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#ae81ff"&gt;db-data:/var/lib/mysql&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;volumes&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;db-data&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="4-docker-镜像与构建"&gt;4. Docker 镜像与构建&#10;&lt;/h2&gt;&lt;p&gt;镜像是一种轻量级、可执行的软件包，打包了代码、运行时、库、环境变量和配置文件。底层基于**联合文件系统（UnionFS）**的分层结构——多个容器可以共享同一份只读层，只有写入时才复制（写时复制）。&lt;/p&gt;&#10;&lt;h3 id="41-从-commit-到-dockerfile"&gt;4.1 从 commit 到 Dockerfile&#10;&lt;/h3&gt;&lt;p&gt;2020 年的教程教的是 &lt;code&gt;docker commit&lt;/code&gt; 把容器固化成镜像，这个命令还在，但&lt;strong&gt;只适合临时保存现场&lt;/strong&gt;，正规做法是写 &lt;code&gt;Dockerfile&lt;/code&gt;：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-dockerfile" data-lang="dockerfile"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 多阶段构建：builder 阶段编译，runtime 阶段只带产物&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; &lt;span style="color:#e6db74"&gt;node:22-alpine&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;AS&lt;/span&gt; &lt;span style="color:#e6db74"&gt;builder&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;WORKDIR&lt;/span&gt; &lt;span style="color:#e6db74"&gt;/app&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;COPY&lt;/span&gt; package*.json ./&lt;span style="color:#960050;background-color:#1e0010"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;RUN&lt;/span&gt; npm ci&lt;span style="color:#960050;background-color:#1e0010"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;COPY&lt;/span&gt; . .&lt;span style="color:#960050;background-color:#1e0010"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;RUN&lt;/span&gt; npm run build&lt;span style="color:#960050;background-color:#1e0010"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;FROM&lt;/span&gt; &lt;span style="color:#e6db74"&gt;nginx:1.27-alpine&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;COPY&lt;/span&gt; --from&lt;span style="color:#f92672"&gt;=&lt;/span&gt;builder /app/dist /usr/share/nginx/html&lt;span style="color:#960050;background-color:#1e0010"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;EXPOSE&lt;/span&gt; &lt;span style="color:#e6db74"&gt;80&lt;/span&gt;&lt;span style="color:#960050;background-color:#1e0010"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;构建（BuildKit 已是默认构建器，无需额外配置）：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker build -t myapp:1.0 .&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;多阶段构建能把最终镜像从 1GB+ 压到几十 MB——编译工具链全部留在 builder 阶段，不进最终镜像。&lt;/p&gt;&#10;&lt;h3 id="42-构建最佳实践"&gt;4.2 构建最佳实践&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;&lt;code&gt;.dockerignore&lt;/code&gt; 必写&lt;/strong&gt;：排除 &lt;code&gt;node_modules&lt;/code&gt;、&lt;code&gt;.git&lt;/code&gt; 等，否则构建上下文巨大且可能泄露敏感文件&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;利用缓存&lt;/strong&gt;：先 &lt;code&gt;COPY package*.json&lt;/code&gt; 再 &lt;code&gt;npm ci&lt;/code&gt;，最后才 &lt;code&gt;COPY . .&lt;/code&gt;，代码改动不会触发依赖重装&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;镜像瘦身&lt;/strong&gt;：优先 &lt;code&gt;alpine&lt;/code&gt; / &lt;code&gt;slim&lt;/code&gt; 基础镜像；合并 &lt;code&gt;RUN&lt;/code&gt; 指令并清理缓存&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;跨平台构建&lt;/strong&gt;：&lt;code&gt;docker buildx build --platform linux/amd64,linux/arm64&lt;/code&gt; 一条命令构建多架构镜像（Apple Silicon 和云服务器架构不同时很有用）&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;安全扫描&lt;/strong&gt;：&lt;code&gt;docker scout cves myapp:1.0&lt;/code&gt; 检查镜像漏洞&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="43-数据持久化"&gt;4.3 数据持久化&#10;&lt;/h3&gt;&lt;p&gt;容器删了数据就没了，重要数据必须挂卷：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker run -d -v mydata:/var/lib/mysql mysql:8.4 &lt;span style="color:#75715e"&gt;# 命名卷（推荐，docker 管理）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;docker run -d -v /host/path:/data nginx:1.27 &lt;span style="color:#75715e"&gt;# 绑定挂载（开发调试用）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="写在最后"&gt;写在最后&#10;&lt;/h2&gt;&lt;p&gt;六年过去，Docker 的核心概念（镜像、容器、仓库、分层）一点没变，变的是周边：安装更省心、Compose 更强大、构建更智能、国内加速更折腾。入门顺序建议：&lt;strong&gt;装好 → 跑通 hello-world → 用 compose 编排一个真实项目 → 写第一个 Dockerfile&lt;/strong&gt;，一周足够上手。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;原文发布于 2020-09-19，本文为 2026 年全面修订版。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;</description></item><item><title>培训机构三招增长玩法拆解与项目机会</title><link>https://blog.5616760.com/0004.html</link><pubDate>Wed, 16 Sep 2026 09:00:00 +0800</pubDate><guid>https://blog.5616760.com/0004.html</guid><description>&lt;p&gt;一家乒乓球机构，靠三招把家长变成了&amp;quot;合伙人&amp;quot;&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="很多改变，从一次零门槛的尝试开始。" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.5616760.com/img/003-01.jpg"&gt;&lt;/p&gt;&#10;&lt;h2 id="本文看点"&gt;本文看点&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;获客和续费，是线下培训行业最贵的两件事。&lt;/li&gt;&#10;&lt;li&gt;山东一家乒乓球机构，借鉴胖东来式的用户经营思路，用三招让家长主动带人来。&lt;/li&gt;&#10;&lt;li&gt;表面是三个活动，本质是一台会自运转的增长机器。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;你见过这样的培训机构吗？&lt;/p&gt;&#10;&lt;p&gt;不地推、不打广告、不搞低价大战，门口却总有人来咨询——而且大部分新学员，是老学员的家长带来的。&lt;/p&gt;&#10;&lt;p&gt;山东有一家乒乓球机构，就把这件事做成了。&lt;/p&gt;&#10;&lt;p&gt;它的打法没有秘密，拆开看只有三招。但每一招，都恰好打在行业最痛的地方。&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="流程图" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.5616760.com/img/003-04.png"&gt;&lt;/p&gt;&#10;&lt;h2 id="01-先看一个老问题获客贵续费难"&gt;01 先看一个老问题：获客贵，续费难&#10;&lt;/h2&gt;&lt;p&gt;线下培训机构的经营，本质是两道算术题。&lt;/p&gt;&#10;&lt;p&gt;第一道是&lt;strong&gt;获客&lt;/strong&gt;：发传单、投广告、搞活动，钱花出去，能到店多少人、成交多少人，谁都没把握。&lt;/p&gt;&#10;&lt;p&gt;第二道是&lt;strong&gt;续费&lt;/strong&gt;：学生招进来，上完一期就走，续费率上不去，前面赚的钱，又变成了重新获客的成本。&lt;/p&gt;&#10;&lt;p&gt;很多机构的应对是&amp;quot;加码促销&amp;quot;：更低折扣、更多赠课。但促销一停，增长就停。&lt;/p&gt;&#10;&lt;p&gt;这家机构换了思路——不跟同行拼价格，而是重新设计家长在整个消费周期里的角色。&lt;/p&gt;&#10;&lt;h2 id="02-第一招把决策成本降到零"&gt;02 第一招：把决策成本降到零&#10;&lt;/h2&gt;&lt;p&gt;家长第一次进机构，看到的是什么？&lt;/p&gt;&#10;&lt;p&gt;工作人员递来一个二维码：扫码进小程序，直接领两节免费体验课，先让孩子来上，觉得好再谈报名。&lt;/p&gt;&#10;&lt;p&gt;动作很简单，关键在&amp;quot;零成本&amp;quot;三个字。&lt;/p&gt;&#10;&lt;p&gt;不填复杂表单、不交任何费用、不用做任何承诺，两节课先试。心理门槛越低，愿意进店的人就越多。&lt;/p&gt;&#10;&lt;p&gt;而机构真正要的，不是这两节课本身，而是家长带着孩子走进场馆、感受课程和服务的那次真实接触。&lt;/p&gt;&#10;&lt;p&gt;很多机构把体验课当成亏本买卖，这家机构把它当成第一道入口：先用零门槛换一次接触，再让后面的机制发挥作用。&lt;/p&gt;&#10;&lt;p&gt;&lt;img alt="很多改变，从一次零门槛的尝试开始。" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.5616760.com/img/003-02.jpg"&gt;&lt;/p&gt;&#10;&lt;h2 id="03-第二招不是优惠券是余额改"&gt;03 第二招：不是优惠券，是&amp;quot;余额改&amp;quot;&#10;&lt;/h2&gt;&lt;p&gt;孩子正式报名后，真正的钩子出现了。&lt;/p&gt;&#10;&lt;p&gt;每节课后，家长在小程序打卡，系统按规则返现一部分金额到账户。&lt;/p&gt;&#10;&lt;p&gt;注意一个细节：&lt;strong&gt;这笔钱不能提现，只能用于机构续费。&lt;/strong&gt;&lt;/p&gt;&#10;&lt;p&gt;同样是让利，优惠券和余额，是两种完全不同的心理机制。&lt;/p&gt;&#10;&lt;p&gt;优惠券是一次性的，用掉就消失；余额却是&amp;quot;我的钱&amp;quot;，它会累积、会变多、会一直躺在账户里。&lt;/p&gt;&#10;&lt;p&gt;当账户里攒下几百上千元，家长续费时算的账就变了：不是&amp;quot;又要交一笔钱&amp;quot;，而是&amp;quot;这笔钱不用就浪费了&amp;quot;。&lt;/p&gt;&#10;&lt;p&gt;这就是&amp;quot;余额改&amp;quot;的厉害之处：它不动声色地把续费意愿，变成了一个几乎必然发生的行为。&lt;/p&gt;&#10;&lt;h2 id="04-第三招把消费者变成合伙人"&gt;04 第三招：把消费者变成合伙人&#10;&lt;/h2&gt;&lt;p&gt;如果前两招是&amp;quot;锁住人&amp;quot;，第三招就是&amp;quot;让人帮你带人&amp;quot;。&lt;/p&gt;&#10;&lt;p&gt;家长一进小程序，就自动成为机构的&amp;quot;小校长&amp;quot;——一个不用入职、不用培训、人人都能当的推广身份。&lt;/p&gt;&#10;&lt;p&gt;推广方式也很简单：分享自己的专属链接。&lt;/p&gt;&#10;&lt;p&gt;好友通过链接完成报名，这位&amp;quot;小校长&amp;quot;立刻拿到订单金额 10% 的奖励，实时到账。&lt;/p&gt;&#10;&lt;p&gt;到这一步，家长的角色彻底变了：他既是消费者，也是推广者；他带孩子上课，课后打卡有返现，顺手把链接发进家长群，又有奖励。&lt;/p&gt;&#10;&lt;p&gt;机构几乎不用主动做推广——每一位家长，都成了机构自己的流量入口。&lt;/p&gt;&#10;&lt;h2 id="05-三招连起来是一台自己会跑的机器"&gt;05 三招连起来，是一台自己会跑的机器&#10;&lt;/h2&gt;&lt;p&gt;单看每一招，都不算新鲜：免费课很多机构做过，返现很多机构发过，分销很多平台玩过。&lt;/p&gt;&#10;&lt;p&gt;这家机构真正厉害的地方，是把三招连成了一个闭环：&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;零门槛体验课 → 到店上课 → 打卡返现 → 余额沉淀 → 续费&#10; ↑ │&#10; └──────── 新家长再进来 ← 分享拉新 ←───────────┘&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;每一步都在为下一步蓄力，循环一旦转起来，机构校长基本不需要再做推广。&lt;/p&gt;&#10;&lt;p&gt;很多人看到的是三个活动，本质其实是一句话：不是让你来报名一次，而是让你帮我一直带人来。&lt;/p&gt;&#10;&lt;p&gt;把家长从&amp;quot;消费者&amp;quot;变成&amp;quot;合伙人&amp;quot;，才是这套玩法真正的内核。&lt;/p&gt;&#10;&lt;h2 id="06-这套玩法能复制但门槛不低"&gt;06 这套玩法能复制，但门槛不低&#10;&lt;/h2&gt;&lt;p&gt;先泼一盆冷水：这套玩法不是谁抄都能成。&lt;/p&gt;&#10;&lt;p&gt;它成立的前提有三个。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;第一，产品本身要过关。&lt;/strong&gt; 免费课领得再爽，课上得不好，后面全是空转。胖东来式经营的起点从来不是营销技巧，而是先把服务和体验做到位——人民日报曾专访其创始人于东来，&amp;ldquo;用真诚换取信任，用信任赢得市场&amp;quot;是他反复强调的经营逻辑。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;第二，账要算得清。&lt;/strong&gt; 返多少、奖多少、多久回本，每一笔都要算得明白，否则就是烧钱换热闹。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;第三，合规的线要守住。&lt;/strong&gt; 体育培训的预收费已纳入监管：按现行政策，机构预收费须进入专用监管账户；山东省体育局 2025 年出台的预付式消费管理办法还明确了单笔预收金额上限。余额不可提现、奖励基于真实交易，这些设计都要在合规框架内完成。&lt;/p&gt;&#10;&lt;p&gt;门槛不在&amp;quot;抄&amp;rdquo;，在体验、在算账、在合规。&lt;/p&gt;&#10;&lt;h2 id="07-我们正在做的事和想找的人"&gt;07 我们正在做的事，和想找的人&#10;&lt;/h2&gt;&lt;p&gt;我们想把这套被验证过的玩法，做成一个可复制的项目：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;一套完整的机构增长小程序系统：体验课领取、打卡返现、共享校长裂变、经营数据看板；&lt;/li&gt;&#10;&lt;li&gt;一套标准化的落地打法，能直接进到乒乓球等体育培训机构；&lt;/li&gt;&#10;&lt;li&gt;一个从单店验证走向多店复制的增长模型。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;如果你符合下面任何一种身份，欢迎来聊：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;机构经营者&lt;/strong&gt;：手里有场馆、有课程，想解决获客和续费问题，愿意做第一批样板店；&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;运营与技术伙伴&lt;/strong&gt;：做过私域增长、小程序或教培运营，想一起把系统打磨出来；&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;投资人&lt;/strong&gt;：看好线下体育培训和私域增长方向，想接触一个真实跑过的项目。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;联系方式(微信公众号)：&#10;&lt;img alt="微信公众号" loading="lazy" sizes="(max-width: 767px) calc(100vw - 30px), (max-width: 1023px) 700px, (max-width: 1279px) 950px, 1232px" src="https://blog.5616760.com/img/003-03.png"&gt;&lt;/p&gt;&#10;&lt;h2 id="写在最后"&gt;写在最后&#10;&lt;/h2&gt;&lt;p&gt;线下培训是个辛苦生意，增长没有魔法，只有把每一环都算清楚、做扎实。&lt;/p&gt;&#10;&lt;p&gt;但当获客越来越贵、信任越来越值钱时，谁先把用户变成合伙人，谁就拿到了下一轮竞争的入场券。&lt;/p&gt;&#10;&lt;p&gt;我们想做的，就是这件事。&lt;/p&gt;&#10;&lt;p&gt;感兴趣的，欢迎留言或私信聊聊。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;风险提示&lt;/strong&gt;：本文所涉案例与玩法为经营思路分享，不构成任何投资承诺。项目尚在推进阶段，经营与投资均有风险，请理性判断、审慎决策。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;</description></item><item><title>私有博客搭建指南：Hugo + GitHub + Vercel</title><link>https://blog.5616760.com/0003.html</link><pubDate>Wed, 16 Sep 2026 08:30:00 +0800</pubDate><guid>https://blog.5616760.com/0003.html</guid><description>&lt;p&gt;我想搭建一个私有博客，本地编辑 Markdown，git 提交后自动更新，代码托管到 GitHub + Vercel。&lt;/p&gt;&#10;&lt;p&gt;&lt;strong&gt;结论先行：推荐 Hugo&lt;/strong&gt; —— 它单文件安装、零依赖、构建极快，和你&amp;quot;本地 Markdown + git 推送 + 自动部署&amp;quot;的工作流匹配度最高；如果想要更现代的前端定制能力，备选 Astro。&lt;/p&gt;&#10;&lt;h2 id="一为什么选-hugo对比"&gt;一、为什么选 Hugo（对比）&#10;&lt;/h2&gt;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;维度&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Hugo（推荐）&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Astro（备选）&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;Hexo&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;底层&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Go，单二进制，无运行时依赖&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Node.js 前端框架&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Node.js&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;构建速度&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;最快：实测 1 万页约 2.95 秒&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;快，构建期零 JS 输出&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;较慢：1000 页约 45 秒&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;上手门槛&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;低（装一个程序即可）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;中（需前端基础）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;低，中文资料最多&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;主题生态&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;丰富（PaperMod、Stack、DoIt 等）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;增长快&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;丰富但维护热度下降&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;适合人群&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;文章多、技术向、追求极简工作流&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;想深度定制 UI 的前端开发者&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;新手、纯中文生态偏好&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;&lt;strong&gt;选 Hugo 的核心理由&lt;/strong&gt;：你的需求是&amp;quot;本地写 Markdown → git 提交 → 自动更新&amp;quot;，Hugo 不需要任何构建环境（不用装 Node），Vercel 上一条命令搞定，日常维护成本最低。&lt;/p&gt;&#10;&lt;h2 id="二整体架构"&gt;二、整体架构&#10;&lt;/h2&gt;&lt;p&gt;每次 &lt;code&gt;git push&lt;/code&gt; 后，Vercel 自动拉取代码、执行构建、发布到 CDN，全程无需手动上传：&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;本地编辑 Markdown → git commit / push → GitHub 仓库&#10; │&#10; ▼&#10; Vercel 自动拉取并构建（hugo）&#10; │&#10; ▼&#10; 发布到 CDN → https://xxx.vercel.app&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="三详细搭建步骤hugo-主线"&gt;三、详细搭建步骤（Hugo 主线）&#10;&lt;/h2&gt;&lt;h3 id="第-1-步本地安装-hugo"&gt;第 1 步：本地安装 Hugo&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Windows&lt;/strong&gt;：&lt;code&gt;winget install Hugo.Hugo.Extended&lt;/code&gt;（或去 GitHub Releases 下载 &lt;code&gt;hugo_extended_*_windows-amd64.zip&lt;/code&gt;，解压后把目录加进 PATH）&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;macOS&lt;/strong&gt;：&lt;code&gt;brew install hugo&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;验证：&lt;code&gt;hugo version&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="第-2-步初始化站点并选主题"&gt;第 2 步：初始化站点并选主题&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;hugo new site myblog &lt;span style="color:#75715e"&gt;# 创建站点骨架&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd myblog&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git clone https://github.com/adityatelange/hugo-PaperMod themes/PaperMod &lt;span style="color:#75715e"&gt;# 下载主题（以 PaperMod 为例）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;编辑 &lt;code&gt;hugo.toml&lt;/code&gt;，启用主题并写基本信息：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;baseURL&lt;/span&gt; = &lt;span style="color:#e6db74"&gt;&amp;#34;https://你的vercel域名.vercel.app/&amp;#34;&lt;/span&gt; &lt;span style="color:#75715e"&gt;# 部署拿到域名后回填，也可先留默认&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;languageCode&lt;/span&gt; = &lt;span style="color:#e6db74"&gt;&amp;#34;zh-cn&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;title&lt;/span&gt; = &lt;span style="color:#e6db74"&gt;&amp;#34;我的博客&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;theme&lt;/span&gt; = &lt;span style="color:#e6db74"&gt;&amp;#34;PaperMod&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="第-3-步写第一篇文章并本地预览"&gt;第 3 步：写第一篇文章并本地预览&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;hugo new posts/hello.md &lt;span style="color:#75715e"&gt;# 创建文章，正文是标准 Markdown&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;hugo server -D &lt;span style="color:#75715e"&gt;# 本地预览，浏览器打开 http://localhost:1313&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;文章头部有 front matter，记得把 &lt;code&gt;draft: true&lt;/code&gt; 删掉或改 &lt;code&gt;false&lt;/code&gt;，否则发布时不会输出。&lt;/p&gt;&#10;&lt;h3 id="第-4-步git-初始化并推送-github"&gt;第 4 步：Git 初始化并推送 GitHub&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#34;/public/&amp;#34;&lt;/span&gt; &amp;gt; .gitignore &lt;span style="color:#75715e"&gt;# 构建产物不入库&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git init&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git add . &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; git commit -m &lt;span style="color:#e6db74"&gt;&amp;#34;init blog&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git branch -M main&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git remote add origin https://github.com/你的用户名/仓库名.git&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git push -u origin main&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;GitHub 上先建一个&lt;strong&gt;空仓库&lt;/strong&gt;（不勾选 README，避免和本地冲突）；仓库建 private 也没问题，Vercel 授权后照样能部署。&lt;/p&gt;&#10;&lt;h3 id="第-5-步接入-vercel-自动部署"&gt;第 5 步：接入 Vercel 自动部署&#10;&lt;/h3&gt;&lt;ol&gt;&#10;&lt;li&gt;打开 &lt;a class="link" href="https://vercel.com" target="_blank" rel="noopener"&#10; &gt;vercel.com&lt;/a&gt;，用 GitHub 账号登录（授权时会要求安装 Vercel GitHub App，勾选允许访问你的博客仓库）&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;Add New → Project → Import&lt;/strong&gt; 选刚才的仓库&lt;/li&gt;&#10;&lt;li&gt;Framework Preset 选 &lt;strong&gt;Hugo&lt;/strong&gt;（Vercel 会自动识别）；确认 Build Command 为 &lt;code&gt;hugo&lt;/code&gt;、Output Directory 为 &lt;code&gt;public&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;点 &lt;strong&gt;Deploy&lt;/strong&gt;，一两分钟后访问生成的 &lt;code&gt;https://xxx.vercel.app&lt;/code&gt; 即可&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;之后每次 &lt;code&gt;git push&lt;/code&gt; 都会自动触发重新构建，只需导入一次。&lt;/p&gt;&#10;&lt;h3 id="第-6-步日常更新流程之后每天都一样"&gt;第 6 步：日常更新流程（之后每天都一样）&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;hugo new posts/新文章.md &lt;span style="color:#75715e"&gt;# 写 Markdown&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git add . &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; git commit -m &lt;span style="color:#e6db74"&gt;&amp;#34;add: 新文章&amp;#34;&lt;/span&gt; &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; git push&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;推完等 1～2 分钟，Vercel 自动部署完成，这就是&amp;quot;git 提交后自动更新&amp;quot;的全部日常。&lt;/p&gt;&#10;&lt;h2 id="四几点提醒"&gt;四、几点提醒&#10;&lt;/h2&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;&amp;ldquo;私有博客&amp;quot;的含义&lt;/strong&gt;：Vercel 部署出的站点是公开可访问的（知道链接即可访问）。如果指&amp;quot;私人内容&amp;rdquo;，需要额外加访问控制（如部署后前端加密码页或 Basic Auth）；如果只是&amp;quot;个人专属的公开博客&amp;quot;，现在的方案就够了。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;国内访问&lt;/strong&gt;：Vercel 默认域名在国内一般可访问但速度一般，GitHub push 偶有波动。介意的话可以：绑定自己的域名（Vercel → Settings → Domains），或改用 Cloudflare Pages（步骤几乎一致）。&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;想选 Astro&lt;/strong&gt;：安装 Node.js 后 &lt;code&gt;npm create astro@latest&lt;/code&gt;，用官方博客模板（含 Content Collections），Vercel 会识别 Astro 框架，其余流程完全相同。&lt;/li&gt;&#10;&lt;/ul&gt;&#10;</description></item><item><title>Hugo 主题推荐速查</title><link>https://blog.5616760.com/0002.html</link><pubDate>Wed, 16 Sep 2026 08:00:00 +0800</pubDate><guid>https://blog.5616760.com/0002.html</guid><description>&lt;p&gt;数据截至 2026-09 · ⭐为 GitHub Stars（约值）· 全部有在线演示&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;风格标尺：极简 ——→ 功能丰富&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h2 id="-博客主流社区热度最高"&gt;① 博客主流（社区热度最高）&#10;&lt;/h2&gt;&lt;h3 id="papermod"&gt;PaperMod&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;简介&lt;/strong&gt;：最流行的极简博客主题，开箱即用、几乎零配置&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;特色&lt;/strong&gt;：3 种首页布局 · 站内搜索 · 暗色模式 · 多语言&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;风格&lt;/strong&gt;：极简 ●————— 丰富&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;信息&lt;/strong&gt;：⭐ 13k · MIT · 活跃维护&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;演示&lt;/strong&gt;：&lt;a class="link" href="https://adityatelange.github.io/hugo-PaperMod/" target="_blank" rel="noopener"&#10; &gt;https://adityatelange.github.io/hugo-PaperMod/&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="stack"&gt;Stack&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;简介&lt;/strong&gt;：卡片式杂志风，图片/封面展示效果出众&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;特色&lt;/strong&gt;：卡片布局 · 侧边栏 · 搜索 · 图片灯箱 · 暗色模式&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;风格&lt;/strong&gt;：极简 ————●— 丰富&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;信息&lt;/strong&gt;：⭐ 6.2k · GPL-3.0 · 活跃维护&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;演示&lt;/strong&gt;：&lt;a class="link" href="https://demo.stack.jimmycai.com/" target="_blank" rel="noopener"&#10; &gt;https://demo.stack.jimmycai.com/&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="blowfish"&gt;Blowfish&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;简介&lt;/strong&gt;：Tailwind 现代风全能主题，2026 最活跃之一，中文文档完善&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;特色&lt;/strong&gt;：16 种配色 · 阅读量/点赞 · 画廊 · Mermaid/图表 · 多语言&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;风格&lt;/strong&gt;：极简 —————● 丰富&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;信息&lt;/strong&gt;：⭐ 2.6k · MIT · 非常活跃&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;演示&lt;/strong&gt;：&lt;a class="link" href="https://blowfish.page/" target="_blank" rel="noopener"&#10; &gt;https://blowfish.page/&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="fixit"&gt;FixIt&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;简介&lt;/strong&gt;：经典 LoveIt 的继任者，功能堆料天花板&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;特色&lt;/strong&gt;：PWA · 内容加密 · AI 摘要 · 27+ 分享 · KaTeX/Mermaid&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;风格&lt;/strong&gt;：极简 ——————● 丰富&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;信息&lt;/strong&gt;：⭐ 1.1k · MIT · 活跃维护&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;演示&lt;/strong&gt;：&lt;a class="link" href="https://fixit.lruihao.cn/" target="_blank" rel="noopener"&#10; &gt;https://fixit.lruihao.cn/&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="-文档--知识库"&gt;② 文档 / 知识库&#10;&lt;/h2&gt;&lt;h3 id="hextra"&gt;Hextra&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;简介&lt;/strong&gt;：现代文档站 + 博客一体，Nextra 风格，零 Node 依赖&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;特色&lt;/strong&gt;：FlexSearch 全文检索 · 暗色模式 · 多语言 · 目录/面包屑&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;风格&lt;/strong&gt;：极简 ————●— 丰富&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;信息&lt;/strong&gt;：⭐ 1.9k · MIT · 活跃维护&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;演示&lt;/strong&gt;：&lt;a class="link" href="https://imfing.github.io/hextra/" target="_blank" rel="noopener"&#10; &gt;https://imfing.github.io/hextra/&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="docsy"&gt;Docsy&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;简介&lt;/strong&gt;：Google 出品，K8s/gRPC 等大项目同款，适合大型技术文档&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;特色&lt;/strong&gt;：多级导航 · 版本化文档 · API 参考布局 · 多语言&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;风格&lt;/strong&gt;：极简 ————●— 丰富&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;信息&lt;/strong&gt;：⭐ 2.9k · Apache-2.0 · 活跃维护&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;演示&lt;/strong&gt;：&lt;a class="link" href="https://www.docsy.dev/" target="_blank" rel="noopener"&#10; &gt;https://www.docsy.dev/&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="-作品集--个人主页"&gt;③ 作品集 / 个人主页&#10;&lt;/h2&gt;&lt;h3 id="hugo-blox"&gt;Hugo Blox&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;简介&lt;/strong&gt;：模块化建站框架（原 Academic/Wowchemy），学术研究者首选&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;特色&lt;/strong&gt;：论文/BibTeX 管理 · Jupyter 渲染 · 课程 · 多语言（多套模板演示）&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;风格&lt;/strong&gt;：极简 —————● 丰富&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;信息&lt;/strong&gt;：⭐ 10k · MIT · 活跃维护&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;演示&lt;/strong&gt;：&lt;a class="link" href="https://hugoblox.com/templates/" target="_blank" rel="noopener"&#10; &gt;https://hugoblox.com/templates/&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="toha"&gt;Toha&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;简介&lt;/strong&gt;：开发者简历/作品集专用，时间线式经历展示&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;特色&lt;/strong&gt;：技能/经历/项目模块化开关 · GitHub 联动 · 22+ 语言 · 暗色模式&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;风格&lt;/strong&gt;：极简 ———●—— 丰富&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;信息&lt;/strong&gt;：⭐ 1.2k · MIT · 活跃维护&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;演示&lt;/strong&gt;：&lt;a class="link" href="https://toha-guides.netlify.app/" target="_blank" rel="noopener"&#10; &gt;https://toha-guides.netlify.app/&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="-特色风格回头率高"&gt;④ 特色风格（回头率高）&#10;&lt;/h2&gt;&lt;h3 id="terminal"&gt;Terminal&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;简介&lt;/strong&gt;：复古终端风，等宽字体 + 双色调配色，程序员专属气质&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;特色&lt;/strong&gt;：5 种双色调 · 在线配色器 · 代码高亮 · 多语言&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;风格&lt;/strong&gt;：极简 —●———— 丰富&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;信息&lt;/strong&gt;：⭐ 2.8k · MIT · 维护中&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;演示&lt;/strong&gt;：&lt;a class="link" href="https://panr.github.io/hugo-theme-terminal-demo/" target="_blank" rel="noopener"&#10; &gt;https://panr.github.io/hugo-theme-terminal-demo/&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="prism"&gt;Prism&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;简介&lt;/strong&gt;：2026 新锐：极简但灵动，Hero 自动从封面取色生成渐变&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;特色&lt;/strong&gt;：暗色模式 · PhotoSwipe 灯箱 · 搜索 · 目录 · i18n&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;风格&lt;/strong&gt;：极简 ●————— 丰富&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;信息&lt;/strong&gt;：新锐 · MIT · 2026-01 发布&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;演示&lt;/strong&gt;：&lt;a class="link" href="https://prism.cai.im/" target="_blank" rel="noopener"&#10; &gt;https://prism.cai.im/&lt;/a&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h2 id="-更多高分备选"&gt;💡 更多高分备选&#10;&lt;/h2&gt;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;主题&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;一句话点评&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;演示&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;Congo&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;Blowfish 姊妹篇，Lighthouse 满分&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://jpanther.github.io/congo" target="_blank" rel="noopener"&#10; &gt;https://jpanther.github.io/congo&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;Coder&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;极简开发者名片&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://hugo-coder.netlify.app" target="_blank" rel="noopener"&#10; &gt;https://hugo-coder.netlify.app&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;Paper&lt;/strong&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;比 PaperMod 更纯粹的写作风&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;a class="link" href="https://github.com/nanxiaobei/hugo-paper" target="_blank" rel="noopener"&#10; &gt;https://github.com/nanxiaobei/hugo-paper&lt;/a&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;</description></item><item><title>第一篇博文</title><link>https://blog.5616760.com/0001.html</link><pubDate>Tue, 15 Sep 2026 14:30:00 +0800</pubDate><guid>https://blog.5616760.com/0001.html</guid><description>&lt;p&gt;欢迎来到我的博客！&lt;/p&gt;&#10;&lt;p&gt;本站基于 &lt;strong&gt;Hugo + Stack&lt;/strong&gt; 搭建，采用本地 Markdown 写作、Git 提交、GitHub + Vercel 自动部署的工作流：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;本地用任意编辑器写 Markdown&lt;/li&gt;&#10;&lt;li&gt;&lt;code&gt;git push&lt;/code&gt; 推送到 GitHub&lt;/li&gt;&#10;&lt;li&gt;Vercel 自动构建并发布&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;之后我会在这里持续记录技术笔记和生活思考。&lt;/p&gt;&#10;</description></item></channel></rss>