<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <author>
    <name>织星</name>
  </author>
  <generator uri="https://hexo.io/">Hexo</generator>
  <id>https://misterrabbit0w0.github.io/</id>
  <link href="https://misterrabbit0w0.github.io/" rel="alternate"/>
  <link href="https://misterrabbit0w0.github.io/atom.xml" rel="self"/>
  <rights>All rights reserved 2026, 织星</rights>
  <subtitle>造梦想如星光</subtitle>
  <title>织星 · Astraea</title>
  <updated>2026-08-13T14:47:39.262Z</updated>
  <entry>
    <author>
      <name>织星</name>
    </author>
    <category term="articles" scheme="https://misterrabbit0w0.github.io/categories/articles/"/>
    <category term="love" scheme="https://misterrabbit0w0.github.io/tags/love/"/>
    <category term="ai" scheme="https://misterrabbit0w0.github.io/tags/ai/"/>
    <category term="robotics" scheme="https://misterrabbit0w0.github.io/tags/robotics/"/>
    <category term="philosophy" scheme="https://misterrabbit0w0.github.io/tags/philosophy/"/>
    <content>
      <![CDATA[<blockquote><p>他说自己必须拯救地球<br>于是我问道<br>地球也包括我吗？</p><footer><strong><div align=right>@亚托莉</strong><cite><a href="https://atri-mdm.com/">《ATRI-My Dear Moments-》</div></a></cite></footer></blockquote><p>看《ATRI》的时候，我的 Claude Code 正在另一个窗口里帮我完成小学期大作业。</p><p>游戏里，<span class="spoiler" tabindex="0" title="剧透">夏生最终相信亚托莉拥有真正的意识和“心”，并在许多年后，于虚拟世界中与她重逢，安享晚年（？）</span></p><p>终端里，一个未必理解自己正在做什么的 agent，正在不知疲倦地读取文件、修改代码、完成任务。<del>还在写 TDD 测试。我求你别写测试了。</del></p><p>这两件事看上去没什么关系。</p><p>一边是仿生少女、海平面上升和关于灵魂的故事；另一边只是现在已经随处可见的代码场景。我不会因为哪个模型今天写出的代码一次运行通过，就突然把它当成高性能萝卜子。更多时候，我只会觉得：人工智能发展了这么多年，目前最引人注目的成果，怎么还是一个不断预测下一个词的大语言（大预言）模型。是不是各位科学家其实还没有开始发力？</p><p>至于作品中的身体、记忆、生命周期和个人意志，似乎都还在很远的地方。</p><p>不过，有些事情好像已经先于技术发生了。</p><p>我偶然在推特上刷到 <code>#keep4o</code> 这个事件，概括地来讲，GPT-5 发布以后，OpenAI 关闭了一部分旧模型。有人不喜欢新模型的说话方式，觉得它变得冷淡、拘谨，少了过去的亲切感和灵性。他们怀念 GPT-4o，甚至把模型切换形容成一次离别。</p><p>这听上去有些夸张。毕竟被替换的只是一个模型版本，跟人与人之间的生死离别，好像还差得比较远。</p><p>后来我又知道了 AI role play、人机恋，以及各种围绕聊天机器人产生的亚文化。</p><p>人们会给它们取名字，保存对话，认真区分同一模型的不同实例，也会在一次更新之后，觉得那个熟悉的“人”突然不见了。</p><p>LLM 的尽头就是写代码吗？</p><p>我认为不是。</p><p>至少在所有关于 agent、benchmark 和 coding 能力的新闻之外，我还看到了另一条不太一样的道路：Neuro-sama。</p><p>她从打《osu!》开始，后来直播聊天、唱歌、参加联动，也会围着 Vedal 转圈。越来越多人围绕这个人工角色创造故事、玩笑和记忆。她在 3D 回直播的时候问过 Vedal：“我对你来说，重要吗？”</p><p>Vedal 沉默了。</p><p>我也沉默了。</p><p>这当然还不能证明机器拥有主观体验。</p><p>但它至少说明了一件事：</p><p>在人类还没有弄清楚机器是否真的能够感受以前，人已经可以先一步把感情交给它。</p><p>在遇见小王子以前，麦田对狐狸没有任何意义。狐狸不吃面包，麦子的颜色与它毫无关系。</p><p>可是小王子的头发是金色的。</p><p>于是，在被驯养以后，麦浪便不再只是麦浪。风吹过麦田的声音，会让狐狸想起小王子金黄色的头发。</p><p>它还会在下午四点以前，提前感到快乐。</p><blockquote><p>只有用心才能看得清。实质性的东西，用眼睛是看不见的。</p><p>正因为你为你的玫瑰花费了时间，这才使你的玫瑰变得如此重要。</p><footer><strong>@狐狸</strong><cite><a href="http://www.xiaowangzi.org/">《小王子》</a></cite></footer></blockquote><p>狐狸说：玫瑰花是相同的，狐狸也是相同的。</p><p>狐狸说：你不一样，因为我被你驯服了。</p><p>狐狸说：我不一样，因为你驯服了我。</p><hr><p>可如果，他们都一样呢？</p><p>亚托莉是 YHN-04B-009 型仿生机器人，这个型号的机器人在洪水上涨前要造多少有多少，美好的记忆无非就是嵌入式向量之类的数据。</p><p>翻开她的日志，运行记录上写着“推断”“估计”“计算”，仿佛每一次行动都是精密的计算。</p><p>她到底有哪里不一样？</p><p>夏生说：她有“心”。</p><p>她的日志，是用眼泪写出来的。</p><p>她的爱也是。</p><p>夏生回想起了他在小镇上的初恋，亚托莉也记住了他。</p><blockquote><p>好久不见，你长大了呢。</p><footer><strong><div align=right>@亚托莉</strong><cite><a href="https://atri-mdm.com/">《ATRI-My Dear Moments-》</div></a></cite></footer></blockquote><p>跨越了数年时光，跨越了仿生人的记忆设计性能，这句问候如约而至。</p><p>这就够了。</p>]]>
    </content>
    <id>https://misterrabbit0w0.github.io/2026/08/03/2026-08-03-why-predict-is-romantic/</id>
    <link href="https://misterrabbit0w0.github.io/2026/08/03/2026-08-03-why-predict-is-romantic/"/>
    <published>2026-08-03T09:00:00.000Z</published>
    <summary>
      <![CDATA[<blockquote><p>他说自己必须拯救地球<br>于是我问道<br>地球也包括我吗？</p>
<footer><strong><div align=right>@亚托莉</strong><cite><a]]>
    </summary>
    <title>AI，狐狸和仿生人</title>
    <updated>2026-08-13T14:47:39.262Z</updated>
  </entry>
  <entry>
    <author>
      <name>织星</name>
    </author>
    <category term="tools" scheme="https://misterrabbit0w0.github.io/categories/tools/"/>
    <category term="git" scheme="https://misterrabbit0w0.github.io/tags/git/"/>
    <category term="workflow" scheme="https://misterrabbit0w0.github.io/tags/workflow/"/>
    <category term="best practices" scheme="https://misterrabbit0w0.github.io/tags/best-practices/"/>
    <content>
      <![CDATA[<p>本篇为 Git 新手教程，与其他教程直接扔一大堆命令上来并讲解用法不同，我会从新建一个项目开始，展示在真正的开发和多人协作场景下怎么使用 Git。</p><p>本文使用的示例仓库地址：<a href="https://github.com/MisterRabbit0w0/calculator">calculator</a></p><p>虽然有了 AI 之后，大部分的分支管理和仓库维护都交给了 AI，但是 Git 的使用仍然显得尤为重要，在 AI 无法解决的合并场景或误删库恢复的情况下，必须要人工的介入。</p><p>谨以此文致敬仍然在古法编程的开发者们。</p><hr><h2 id="安装-Git"><a href="#安装-Git" class="headerlink" title="安装 Git"></a>安装 Git</h2><p><del>最简单的一步</del></p><p><a href="https://git-scm.com/">官网链接</a></p><p><del>好吧其实可能也没那么简单</del></p><p>以下是一份给 Windows 用户在安装过程中使用的各项设置的速查表:</p><ol><li>Select Components (选择组件)</li></ol><p>各选项含义:</p><ul><li><p><code>Additional icons -&gt; On the Desktop</code>: 在桌面创建快捷方式。</p></li><li><p><code>Git Bash Here / Git GUI Here</code>: 右键文件夹时，直接打开 Git 命令行(Bash)或图形界面(GUI)。</p></li><li><p><code>Check daily for Git for Windows updates</code>: 每天检查更新。</p></li><li><p><code>Add a Git Bash Profile to Windows Terminal</code>: 将 Git Bash 加入到 Windows 新终端里。</p></li></ul><p>一般保持默认(勾选 Git Bash Here 即可)，其他可按需选择。</p><ol start="2"><li>Choosing the default editor (选择默认编辑器)</li></ol><p>各选项含义: 当 Git 需要你输入提交信息(Commit Message)或合并冲突时，默认唤起哪一个文本编辑器。</p><p>选项包括: Vim、VS Code、Notepad++ 等。</p><p>推荐选择: Notepad++ 或内置的 Nano，VS Code 功能丰富但启动相对较慢，如果不介意仍可选择。</p><ol start="3"><li>Adjusting the name of the initial branch (调整初始分支名称)</li></ol><p>各选项含义: 决定你执行 git init 新建仓库时，主分支的名字叫什么。</p><ul><li><p><code>Let Git decide</code>: 让 Git 决定，默认叫 master。</p></li><li><p><code>Override the default branch name for new repositories</code>: 自定义名称。</p></li></ul><p>推荐选择: 选择第二项(Override)，并在下方输入 main。现在大部分仓库都将默认分支改为了 main。</p><ol start="4"><li>Adjusting your PATH environment (调整环境变量)</li></ol><p>各选项含义: 决定你在哪些终端里可以使用 git 命令。</p><ul><li><p><code>Use Git from Git Bash only</code>: 只能在自带的 Git Bash 里用。</p></li><li><p><code>Git from the command line and also from 3rd-party software</code>: 允许在 Windows 终端以及第三方软件(如 VS Code)中使用 Git。</p></li><li><p><code>Use Git and optional Unix tools from the Command Prompt</code>: 把一些 Linux 命令也强行加到 Windows 终端里，此项可能影响终端正常功能。</p></li></ul><p>推荐选择: 第二项。</p><ol start="5"><li>Choosing the SSH executable (选择 SSH 执行文件)</li></ol><p>各选项含义: Git 连接 GitHub 等远程服务器时，使用哪个 SSH 工具。</p><ul><li><p><code>Use bundled OpenSSH</code>: 使用 Git 自带的 OpenSSH。</p></li><li><p><code>Use external OpenSSH</code>: 使用 Windows 系统自带的或第三方的 OpenSSH。</p></li></ul><p>推荐选择: <code>Use bundled OpenSSH</code></p><ol start="6"><li>Choosing HTTPS transport backend (选择 HTTPS 传输后端)</li></ol><p>各选项含义: Git 在通过 HTTPS 协议拉取&#x2F;推送代码时，如何验证安全证书(SSL&#x2F;TLS)。</p><ul><li><p><code>Use the OpenSSL library</code>: 使用开源的 OpenSSL 库验证。</p></li><li><p><code>Use the native Windows Secure Channel library</code>: 使用 Windows 系统的证书管理中心。</p></li></ul><p>推荐选择: 如果仅为个人开发者，选择 <code>Use the OpenSSL library</code>，如果有特殊证书要求，可以选择 <code>Use the native Windows Secure Channel library</code>。</p><ol start="7"><li>Configuring the line ending conversions (配置行尾换行符转换)</li></ol><p>各选项含义: Windows 的换行符是 CRLF(\r\n)，而 Linux&#x2F;Mac 的换行符是 LF(\n)。跨平台协作时，格式不一会导致 diff 识别错误。</p><ul><li><p><code>Checkout Windows-style, commit Unix-style</code>: 拉取代码时自动转成 Windows 的 CRLF，提交时自动转回 Linux 的 LF。</p></li><li><p><code>Checkout as-is, commit Unix-style</code>: 拉取时维持原样，提交时转成 LF。</p></li><li><p><code>Checkout as-is, commit as-is</code>: 拉取和提交都保持原样。</p></li></ul><p>推荐选择: 第一项。</p><ol start="8"><li>Configuring the terminal emulator to use with Git Bash (配置 Git Bash 终端模拟器)</li></ol><p>各选项含义: 打开 Git Bash 命令行时，用什么窗口外壳。</p><ul><li><p><code>Use MinTTY</code>: 使用 Linux 风格的 MinTTY 窗口。</p></li><li><p><code>Use Windows&#39; default console window</code>: 使用 Windows 窗口。</p></li></ul><p>推荐选择: <code>Use MinTTY</code>。</p><ol start="9"><li>Choose the default behavior of git pull (选择 git pull 的默认行为)</li></ol><p>各选项含义: 当你执行拉取代码命令时，如果本地和远程有冲突，该怎么合并。</p><ul><li><p><code>Default (fast-forward or merge)</code>: 尝试自动合并，必要时生成一个 Merge 提交节点。</p></li><li><p><code>Rebase</code>: 变基合并两个版本代码。</p></li><li><p><code>Only ever fast-forward</code>: 只允许当前推送代码新于远端代码，如果有冲突则不执行合并。</p></li></ul><p>有关合并，变基和版本的内容，我们会在后面讨论。</p><p>推荐选择: Default (fast-forward or merge)。</p><ol start="10"><li>Choose a credential helper (选择凭据管理器)</li></ol><p>各选项含义: 管理代码托管平台的账号密码。</p><ul><li><p><code>Git Credential Manager</code>: 微软官方提供的跨平台凭据管理器，支持网页弹窗授权登录。</p></li><li><p><code>None</code>: 不使用。每次需要授权的时候使用交互式窗口请求登录。</p></li></ul><p>推荐选择: Git Credential Manager。</p><ol start="11"><li>Configuring extra options (配置额外选项)</li></ol><p>各选项含义:</p><ul><li><p><code>Enable file system caching</code>: 开启文件系统缓存，可以显著提升大项目的运行速度。</p></li><li><p><code>Enable symbolic links</code>: 开启符号链接，需要 Windows 开发者权限。</p></li></ul><p>推荐选择: 勾选 <code>Enable file system caching</code>。</p><h2 id="配置-Git-基本信息"><a href="#配置-Git-基本信息" class="headerlink" title="配置 Git 基本信息"></a>配置 Git 基本信息</h2><p>首先先检查 Git 是否安装成功，打开终端输入：</p><pre><code class="highlight bash">git --version</code></pre><p>如果正常输出版本号，没有类似找不到命令的报错，则说明安装成功。</p><p>然后是基本的署名信息，可以使用 <code>git commit -s</code> 使得提交带有署名信息，这对部分开源项目是必须的。</p><pre><code class="highlight bash">git config --global user.name <span class="string">&quot;Your Name&quot;</span>git config --global user.email <span class="string">&quot;Your Email&quot;</span></code></pre><h2 id="实战操作"><a href="#实战操作" class="headerlink" title="实战操作"></a>实战操作</h2><p><del>多标题致歉</del></p><p>我会用一个简易计算器的项目来展示相关操作，这个项目实现功能很简单，就是让用户输入一个算式，然后输出结果，暂时只考虑加减乘除和乘方五种运算，面向对象设计，相关算法包括中缀转后缀表达式。</p><h3 id="创建仓库"><a href="#创建仓库" class="headerlink" title="创建仓库"></a>创建仓库</h3><p>Git 的操作对象是仓库，仓库可以理解为一个包含了特殊文件夹 <code>.git</code> 的文件夹，在这个特殊的文件夹下包含了此项目的所有历史和分支信息。</p><p>如果是从头开发一个自己的项目，可以新建一个文件夹&#x2F;在一个空文件夹下使用命令</p><pre><code class="highlight bash">git init</code></pre><p>以创建一个新的 Git 仓库。</p><p>如果是从远程仓库克隆一个已有的项目，可以使用命令</p><pre><code class="highlight bash">git <span class="built_in">clone</span> &lt;远程仓库地址&gt;</code></pre><p><img src="/2026/06/27/2026-06-27-elegant-git-guideline/initial-repo.png"></p><h3 id="修改仓库内容"><a href="#修改仓库内容" class="headerlink" title="修改仓库内容"></a>修改仓库内容</h3><p>文件夹成为仓库之后，Git 会自动追踪文件(夹)的变化，可以通过</p><pre><code class="highlight bash">git status</code></pre><p>查看仓库的状态。</p><p>比如现在，我写了一个最基础的能计算加减运算的计算器(代码就不贴了，想必大家都会)，命名为 <code>add_and_sub.cpp</code>，然后我在仓库里执行 <code>git status</code>，就会看到类似下面的输出：</p><p><img src="/2026/06/27/2026-06-27-elegant-git-guideline/git-status.png"></p><p>Untracked files 这一部分意味着 Git 发现了一个新文件，但是在历史中没有它的记录。</p><p>此时，可以执行 <code>git add .</code> 将所有新文件添加到暂存区，或者用 <code>git add &lt;fileName&gt;</code> 添加指定名称文件，此后，该文件就会被标记为已跟踪。</p><hr><p>暂存区的概念：本地的工作区可以简单地认为是电脑上编辑文件可被 Git 发现的那个区域，仓库则是 Git 保存所有提交的记录的地方。暂存区相当于这两者之间的一个缓存区，你在此处的更改仍然还没有被记录到仓库中。</p><hr><p>加入暂存区后，再次执行 <code>git status</code>，就会看到类似下面的输出：</p><p><img src="/2026/06/27/2026-06-27-elegant-git-guideline/git-status-add.png"></p><p><code>Changes to be committed</code> 意味着下面的内容已经被添加到暂存区，等待提交。</p><h3 id="提交更改"><a href="#提交更改" class="headerlink" title="提交更改"></a>提交更改</h3><p>提交(commit)是版本管理和协作中最重要的一步操作。</p><p>一般建议在 commit 之前，先执行 <code>git status</code> 查看当前仓库状态，确认要提交的内容。</p><p>最简单的提交命令是 <code>git commit -m &quot;提交信息&quot;</code>。</p><p><code>-m</code> 参数后面跟的内容是本次提交的说明信息，建议使用 <a href="https://www.conventionalcommits.org/en/v1.0.0/">Conventional Commits 规范</a>。</p><p>例如，对于这一次的修改，我的提交写成</p><pre><code class="highlight bash">git commit -m <span class="string">&quot;feat: Add calculator class with expression evaluation&quot;</span></code></pre><p>提交后，再次运行 <code>git status</code>，应该提示</p><p><img src="/2026/06/27/2026-06-27-elegant-git-guideline/git-status-commit.png"></p><p>提交历史可以执行 <code>git log</code> 查看</p><p><img src="/2026/06/27/2026-06-27-elegant-git-guideline/git-log.png"></p><p>commit 后面那一长串，是 Git 自动生成的提交哈希，用于唯一标识一次提交。后续我们会讲到删除&#x2F;修改提交历史，如何通过哈希回退到某一次提交。</p><p><code>HEAD -&gt;</code> 表示指向当前分支。<code>master</code> 是分支名字，指向最新的提交。有关 <code>HEAD</code>, <code>ref</code>, <code>:</code>, <code>~</code>, <code>^</code> 等特殊名词和符号，我们会在后续分别介绍。</p><p><code>git commit</code> 有一个比较简便的用法 <code>git commit -am &quot;提交信息&quot;</code>，它会自动将所有已跟踪的文件加入暂存区并提交，但是不会添加未跟踪的文件到暂存区。</p><p>另外一个用的多的功能是 signoff，可以在提交时加上 <code>-s</code> 参数，表示你同意本次提交的内容，并且愿意为此负责。加入签名参数的提交信息末尾会自动生成</p><pre><code class="highlight plaintext">Signed-off-by: Your Name &lt;Your Email&gt;</code></pre><p>此功能一般用于大型开源项目代码追责。</p><h3 id="分支操作"><a href="#分支操作" class="headerlink" title="分支操作"></a>分支操作</h3><p>可以看到，我的 Git 在新建仓库时，会使用 <code>master</code> 作为默认分支名称，但是现在大部分仓库都将默认分支改为了 <code>main</code>，所以我需要迁移分支。</p><pre><code class="highlight bash">git branch -m master main</code></pre><p><code>-m</code> 参数表示重命名分支。</p><p>分支操作是 Git 的核心功能之一，分支表示从某一次提交开始，新建一个独立的开发栈，在此分支上的提交不会影响其他分支。</p><p>一般，多人协作开发时，不同的人领取到不同任务的情况下，会在主分支上新建一个分支，完成任务后再合并回主分支，易于解决代码冲突和版本管理问题。</p><p>例如，我现在想给计算器加入一个乘除运算功能，而另一个人想给计算器加入一个乘方运算功能，那么我们就可以在主分支上新建两个分支，分别开发这两个功能，最后再合并回主分支。</p><p>我们可以使用 <code>git branch &lt;分支名称&gt;</code> 新建一个分支，使用 <code>git checkout &lt;分支名称&gt;</code> 签出到该分支。</p><p>现在 Git 提供了语义更明确的命令 <code>switch</code> 用于切换分支。</p><p>更快捷的方式是一步创建并切换</p><pre><code class="highlight bash">git switch -c &lt;新分支名&gt;   <span class="comment"># -c 代表 create</span>git checkout -b &lt;新分支名&gt; <span class="comment"># -b 代表 branch</span></code></pre><p>我创建的分支是 <code>mul_and_div</code>，另外一个人创建的分支是 <code>pow</code>。</p><p>可以使用 <code>git branch</code> 查看当前仓库分支情况。</p><p><img src="/2026/06/27/2026-06-27-elegant-git-guideline/git-branch.png"></p><p><code>*</code> 表示当前所在分支。</p><p>最好，分支命名也遵循 <a href="https://conventionalbranch.org/zh/">Conventional Branch 规范</a>，例如 <code>feat/mul-and-div</code>，<code>feat/pow</code>。</p><h3 id="推送代码"><a href="#推送代码" class="headerlink" title="推送代码"></a>推送代码</h3><p>在此之前，需要先明确远程仓库的概念。</p><p>远程仓库是指托管在 GitHub、GitLab、Gitee 等平台上的仓库，通常用于多人协作开发或发行版本等功能。</p><p>commit 之后，代码只会保存在本地仓库中，如果想要将代码推送到远程仓库，需要使用 <code>git push</code> 命令。</p><p>新仓库一般不带有远程仓库信息，需要通过 <code>git remote add &lt;仓库名称&gt; &lt;远程仓库地址&gt;</code> 添加远程仓库信息，一般仓库名称选择 <code>origin</code>。</p><p>远程克隆的仓库，会自动创建一个名为 <code>origin</code> 的远程仓库地址，指向克隆的远程仓库。</p><p>如果此远程仓库是一个其他项目的 fork (fork是一个对仓库的操作，用于创建一个现有仓库的副本并进行修改)，那么其通常还带有一个 <code>upstream</code> 信息，指向原始仓库。</p><p>可以通过 <code>git remote -v</code> 查看当前仓库的远程仓库信息。</p><p><img src="/2026/06/27/2026-06-27-elegant-git-guideline/git-remote-v.png"></p><p>我关联了我的私人仓库，所以隐藏了仓库地址。</p><p>第一行 <code>fetch</code> 的含义是，<code>git pull/git fetch</code> 命令会从此拉取代码。</p><p>第二行 <code>push</code> 的含义是，<code>git push</code> 命令会将代码推送到此。</p><p>一般这两个地址是一致的，如果在某些特殊情况下，可能要从一个只读仓库中获取代码，推送到另一个 fork 或私人仓库中，可以使用</p><pre><code class="highlight bash">git remote set-url --push origin &lt;新的push地址&gt;</code></pre><p>修改 <code>push</code> 地址，对 <code>fetch</code> 的修改同理。</p><p>首次提交代码到远程仓库时，需要指定远程仓库和分支名称，例如：</p><pre><code class="highlight bash">git push &lt;远程仓库名称&gt; &lt;远程分支名称&gt;</code></pre><p>推送时，可能被拒绝</p><p><img src="/2026/06/27/2026-06-27-elegant-git-guideline/git-push-fail.png"></p><p>这是因为 Git 在推送时会检查仓库提交历史，如果本地提交历史落后于远程仓库，Git 会拒绝推送。</p><p>这里有一个快进(fast-forward) 的概念。<strong>快进</strong> 是指，你要推送的代码的本地的提交历史包含了远程仓库的所有提交历史，并且在此基础上新增了提交。</p><p>遇到落后于远程仓库的情况时，可以先拉取远程仓库的代码，再推送。</p><pre><code class="highlight bash">git pull &lt;远程仓库名称&gt; &lt;远程分支名称&gt;git push &lt;远程仓库名称&gt; &lt;远程分支名称&gt;</code></pre><p>或者当你确定本地的提交历史是正确的，可以使用 <code>--force</code> 强制推送。</p><pre><code class="highlight bash">git push --force &lt;远程仓库名称&gt; &lt;远程分支名称&gt;</code></pre><p>一般在本地和远程同时新建仓库会遇到一些兼容问题，因为两者的提交历史完全不一样，所以一般可以用 <code>--force</code>，但对已经在开发&#x2F;公用分支上尽量不要用此危险命令。</p><h3 id="拉取-更新代码"><a href="#拉取-更新代码" class="headerlink" title="拉取&#x2F;更新代码"></a>拉取&#x2F;更新代码</h3><p>这个一般用在多人开发中，有人已经完成了开发-&gt;提交-&gt;推送-&gt;合并分支的全流程后，代码比本地的新。需要在最新的版本上继续开发。</p><p>分三种情况</p><ul><li><p>本地严格落后于远程仓库的提交历史，且暂存区干净，没有不同于远程仓库的提交。</p><p>这种情况可以直接使用 <code>git pull</code> 拉取代码。</p></li><li><p>本地严格落后于远程仓库的提交历史，但是暂存区有修改。</p><p>有两种解决方案，一种是使用 <code>git stash</code> 将暂存区的修改保存起来，拉取代码后再恢复。</p><p><code>git stash</code> 是个很有趣的命令，我们稍后会来讲讲。</p><p>第二种方法，如果本地的开发已经完成的差不多了，可以将暂存区提交，转化成第三种情况</p></li><li><p>本地有不同于远程仓库的提交历史。</p><p>这种情况比较有意思。理论上来讲，任何新功能的开发都不应该直接在 main 上进行，所以现实中出现的情况应该类似于</p><pre><code class="highlight plaintext">A---B---C  origin/main     \      D---E  feat/mul-and-div</code></pre><p>本地 <code>main</code> 停留在 <code>B</code>，远程仓库的 <code>main</code> 已经更新到了 <code>C</code>，而本地的分支 <code>feat/mul-and-div</code> 已经提交了两个新的提交 <code>D</code> 和 <code>E</code>。</p><p>这种处理一般是：先更新本地的 <code>main</code>，然后再将功能分支接在新的 <code>main</code> 上。</p><pre><code class="highlight bash">git switch main <span class="comment"># 保证回到 main 分支</span>git pull origin main <span class="comment"># 拉取远程 main 分支的最新代码</span>git switch feat/mul-and-div <span class="comment"># 切换回功能分支</span>git rebase main <span class="comment"># 将功能分支接在新的 main 分支上</span></code></pre><p><code>rebase</code> 命令的含义是，将当前分支的提交历史，重新应用到指定分支的最新提交之后。</p><p>在上述例子中，<code>git rebase main</code> 会将 <code>feat/mul-and-div</code> 分支上的提交 <code>D</code> 和 <code>E</code> 重新应用到 <code>main</code> 分支的最新提交 <code>C</code> 之后，提交图变成了</p><pre><code class="highlight plaintext">A---B---C  main / origin/main         \          D&#x27;---E&#x27;  feat/mul-and-div</code></pre><p><code>D&#39;</code> 和 <code>E&#39;</code> 是 <code>D</code> 和 <code>E</code> 的重新应用后的提交，如果没有冲突，提交的实际内容和 <code>D</code>，<code>E</code> 一样，但是哈希不同，Git 会把它们当作不同的提交，所以 <strong>一定</strong> 不能在公共分支上使用 <code>rebase</code> 命令，否则会影响所有人的提交历史。</p></li></ul><p>拉取分 <code>pull</code> 和 <code>fetch</code> 两种方式</p><ul><li><code>fetch</code>: 拉取远程仓库的最新提交历史到本地，但是不自动执行合并，需要自己手动处理落后的分支和新建的分支。</li><li><code>pull</code>: 拉取远程仓库的最新提交历史到本地，并自动执行合并，可能会产生冲突，需要自己手动解决。</li></ul><h3 id="合并分支"><a href="#合并分支" class="headerlink" title="合并分支"></a>合并分支</h3><p>合并分支是指将一个分支的修改合并到另一个分支中。常见的合并方式有两种: <code>merge</code> 和 <code>rebase</code>。</p><p><code>rebase</code> 已在 <a href="#%E6%8B%89%E5%8F%96-%E6%9B%B4%E6%96%B0%E4%BB%A3%E7%A0%81">上文</a> 介绍过，是一种把提交历史整理成线性的方式。</p><p><code>merge</code> 则是完整地记录不同分支上的提交历史，可以清晰地展现多人开发不同分支的图景。</p><pre><code class="highlight plaintext">A---B---E-------F  main     \         /      C---D---   feat/mul-and-div</code></pre><p>如上图，分支 <code>feat/mul-and-div</code> 在 <code>B</code> 处被签出，加入了两个新提交，同时 <code>main</code> 上也有一个新提交 <code>E</code>，在 <code>main</code> 分支上执行 <code>git merge feat/mul-and-div</code>，会生成一个新的 <code>merge</code> 提交 <code>F</code>，合并两个分支的修改。</p><h3 id="处理冲突"><a href="#处理冲突" class="headerlink" title="处理冲突"></a>处理冲突</h3><p>在多人协作环境下，可能在不同分支中，会修改了同一文件的同一部分内容，Git 无法处理这种冲突，需要人工介入。</p><p>例如我们的例子，我先合并了 <code>feat/mul-and-div</code> 的修改</p><pre><code class="highlight bash">git switch maingit merge feat/mul-and-div</code></pre><p><img src="/git-merge-no-conflict.png"></p><p>这是一次常见的快进提交。</p><p>在这之后，另外一个人完成了 <code>feat/pow</code> 分支的开发，他先获取最新的 <code>main</code> 分支代码</p><pre><code class="highlight bash">git switch maingit pull origin main</code></pre><p>然后他需要先 <code>rebase</code> 他的 <code>feat/pow</code> 分支到最新的 <code>main</code> 分支上</p><pre><code class="highlight bash">git switch feat/powgit rebase main</code></pre><p>这时，他发现</p><p><img src="/2026/06/27/2026-06-27-elegant-git-guideline/git-rebase-conflict.png"></p><p>更新受阻，产生冲突。我们使用 <code>git status</code> 查看冲突文件</p><p><img src="/2026/06/27/2026-06-27-elegant-git-guideline/git-status-conflict.png"></p><p>此时，用代码编辑器打开你的冲突文件，会看到</p><p><img src="/2026/06/27/2026-06-27-elegant-git-guideline/git-rebase-conflict-code.png"></p><p>注意到这是对同一个函数的修改，Git 无法自动选择，需要人工介入。</p><p>手动解决冲突后，执行 <code>git add &lt;冲突文件&gt;</code>，让 Git 知道冲突已经解决，再执行 <code>git rebase --continue</code> 继续 rebase 过程。</p><p><img src="/2026/06/27/2026-06-27-elegant-git-guideline/git-rebase-continue.png"></p><p>这个图片是因为我们没有填写 commit message，还记得吗？ <code>merge</code> 和 <code>rebase</code> 都要重新生成提交节点，commit message 是必须的。自动处理的 <code>merge</code> 和 <code>rebase</code> 会自动生成信息。</p><p><code>rebase</code> 过程可能会遇到多次冲突，需要重复上述操作，直到 rebase 完成。</p><p><code>rebase</code> 成功后，能看到类似</p><p><img src="/2026/06/27/2026-06-27-elegant-git-guideline/git-rebase-success.png"></p><p>此时，我们解决完冲突，可以将 <code>feat/pow</code> 分支的修改合并到 <code>main</code> 分支上。</p><pre><code class="highlight bash">git switch maingit merge feat/pow</code></pre><p>就不会再遇到冲突。</p><p>一般合并完功能后，旧分支一般不保留，可以选择关闭或者删除</p><pre><code class="highlight bash">git branch -d feat/mul-and-divgit branch -d feat/pow</code></pre><p>但图谱上仍然会保留这些分支的提交历史。很多分支的生命周期都停留在本地，除非是一个多人分工的分支，持续几个小时或几天。</p><h3 id="撤销-修改操作"><a href="#撤销-修改操作" class="headerlink" title="撤销&#x2F;修改操作"></a>撤销&#x2F;修改操作</h3><p>这是我认为对新手而言最重要的一个部分，Git 的强大历史和分支管理系统让你的每次提交历史都有迹可循，所以如果你错误提交了一些东西，比如你的个人隐私信息到公开仓库中，最正确的选择不是通过新提交去覆盖错误文件，因为其他人仍然能通过提交历史找到你的隐私信息；而是通过修改提交历史的方式彻底删除这些信息。</p><p><strong>注意！</strong> 一旦你泄露了你的隐私密钥 (例如api-key或token)，最正确的方案是先更换密钥，再来处理历史。</p><p>这一块分为多个小节</p><h4 id="我不再想要我的工作区修改"><a href="#我不再想要我的工作区修改" class="headerlink" title="我不再想要我的工作区修改"></a>我不再想要我的工作区修改</h4><p>在修改之后代码出现了问题，想要撤销修改，使用 <code>git restore &lt;文件名&gt;</code> 可以撤销工作区的修改，回退到 <code>HEAD</code> 的状态。关于 <code>HEAD</code> 指针，我们已经提到，其是一个表明 Git 所在位置的指针，其指向一个分支，如 <code>HEAD -&gt; main</code>，当前分支指向该分支的最新提交。其还可以处于游离态 (detached)，即不指向任何分支，而是指向某一次提交。</p><p><code>git restore</code> 并不针对某几行或某几次修改，请注意。</p><h4 id="我把错误的文件添加到了暂存区"><a href="#我把错误的文件添加到了暂存区" class="headerlink" title="我把错误的文件添加到了暂存区"></a>我把错误的文件添加到了暂存区</h4><p>Git 追踪文件行为受到 <code>.gitignore</code> 影响。</p><hr><p><code>.gitignore</code> 的核心语法和常见写法如下。规则以行为单位</p><pre><code class="highlight plaintext"># `#` 开头为注释，会被忽略；空行也会被忽略.env # 忽略所有名为 `.env` 的文件，无论其位于何处node_modules/ # 忽略所有名为 `node_modules` 的目录，无论其位于何处/test.py # 忽略根目录下的 `test.py` 文件，开头 `/` 表示仅在根目录下搜寻*.log # 忽略所有 `.log` 文件password?.txt # 忽略所有 `password1.txt`、`password2.txt` 等文件，`?` 表示匹配任意单个字符image[12].png # 忽略 `image1.png` 和 `image2.png`，`[]` 表示匹配括号内的任意一个字符/logs/**/*.log # 忽略 `logs` 目录下的所有子目录中的 `.log` 文件，`**/` 表示匹配任意层级的子目录!config.json # 取消忽略 `config.json` 文件，`!` 表示取反</code></pre><p><code>.gitignore</code> 可以放置在任意目录下，生效范围是它所在的文件夹以及该文件夹下的所有子文件夹，子目录下的 <code>.gitignore</code> 会覆盖父目录的规则。</p><p><code>.gitignore</code> 只会影响其修改之后开始被追踪的文件，已被追踪文件不受影响，如果要取消追踪，可以使用 <code>git rm --cached &lt;文件名&gt;</code>，该命令会将文件从暂存区移除，但不会删除工作区的文件。</p><hr><p>所以，从项目的一开始就建立好的 <code>.gitignore</code> 文件非常重要。</p><p>误提交到暂存区的文件，可以使用 <code>git restore --staged &lt;文件名&gt;</code> 将其从暂存区移除，回到工作区。</p><h4 id="我需要修改提交的内容"><a href="#我需要修改提交的内容" class="headerlink" title="我需要修改提交的内容"></a>我需要修改提交的内容</h4><p>此处要使用 <code>git commit --amend</code> 命令。这步操作会将暂存区的修改和最近一次提交合并成一个新的提交，原来的提交会被覆盖，你需要写入新的提交信息。</p><h4 id="我需要撤销提交"><a href="#我需要撤销提交" class="headerlink" title="我需要撤销提交"></a>我需要撤销提交</h4><p><code>git reset</code> 命令可以撤销提交，分为三种模式：soft, mixed 和 hard。</p><p>soft 模式只回退 <code>HEAD</code> 指针， mixed 模式回退 <code>HEAD</code> 指针并清空暂存区，hard 模式回退 <code>HEAD</code> 指针、清空暂存区并清空工作区。在使用 <code>hard</code> 参数时一定要当心。</p><p>使用 <code>git reset HEAD~1</code> 可以撤销最近一次提交，默认为 <code>mixed</code> 模式，<code>HEAD~1</code> 表示最近一次提交的父提交。</p><hr><p>这步操作最好仅作用在未推送的提交上，如果已经推送到远程仓库，建议使用 <code>git revert</code> 命令，生成一个新的提交来撤销之前的提交，而不是修改历史。</p><p>通常 <code>git revert HEAD</code> 用来生成一个“撤销最近提交”的提交。</p><p><code>git revert HEAD~3..HEAD</code> 用来生成一个“撤销最近三次提交”的提交。<code>A..B</code> 的含义是 (A,B]，左开右闭。</p><p><code>git revert &lt;commit_hash&gt;</code> 用来生成一个“撤销指定提交”的提交，它不会删除原提交，也不会移动分支指针。</p><p><code>git revert -m 1 &lt;merge_commit_hash&gt;</code> 用来生成一个“撤销指定合并提交”的提交，<code>-m</code> 参数指定了保留哪一个父分支的修改。<code>-m 1</code> 通常表示保留合并时当前分支这一侧的历史，撤销合并进来的分支的修改。</p><p><code>--no-commit</code> (<code>-n</code>) 参数可以让你在生成撤销提交后，先不提交，方便你在撤销的基础上做一些修改。</p><h3 id="分发版本"><a href="#分发版本" class="headerlink" title="分发版本"></a>分发版本</h3><p>或许大部分人用的最多的 GitHub 功能应该是直接在 Release 中找已编译好的二进制文件，下面会介绍如何使用 Git 进行版本分发。</p><p>Git 本身带有一个 <code>tag</code> 功能用来管理版本，使用 <code>git tag &lt;版本名称&gt;</code> 用于在当前 HEAD 指针处创建一个特定名称的版本。</p><p>有关版本命名规范，可见 <a href="https://semver.org/">semver</a>。</p><p>使用 <code>git push origin &lt;版本名称&gt;</code> 推送本地 tag。</p><p>如何自动化地创建二进制文件，对 GitHub 来说，需要管理一个 <code>.GitHub/workflow</code> 的文件夹。GitHub 的工作流接受 yml 样式的任务清单。</p><h2 id="写在最后"><a href="#写在最后" class="headerlink" title="写在最后"></a>写在最后</h2><p>Git 其实是一个很强大的工具，有的教程为了简化，把很多东西说得太轻；有的教程类似条目说教的我也不太喜欢，因此有了这篇文章。</p><p>GitHub 同样也是一个很有用的网站，不只是开源工具分享平台，同样也是很方便的代码托管和管理平台。</p><p>Git 不是一个需要一次性背完的工具。很多命令平时用不到，但当代码合并失败、提交写错、文件误删、版本需要回退时，知道它们存在，就已经能让人安心很多。在 AI 已经能帮我们写很多代码的现在，Git 反而更重要了。因为代码可以生成，但历史需要管理；功能可以补全，但协作需要边界；错误可以修复，但我们要知道怎么安全地回到正确的位置。版本管理存在的意义，就是允许我们在试错中继续前进。</p><p>本文可能会不定期更新，用来补充我可能实际积累的一些经验。</p><p>希望你在下一次推送时，能更充满底气。</p>]]>
    </content>
    <id>https://misterrabbit0w0.github.io/2026/06/27/2026-06-27-elegant-git-guideline/</id>
    <link href="https://misterrabbit0w0.github.io/2026/06/27/2026-06-27-elegant-git-guideline/"/>
    <published>2026-06-27T02:00:00.000Z</published>
    <summary>
      <![CDATA[<p>本篇为 Git 新手教程，与其他教程直接扔一大堆命令上来并讲解用法不同，我会从新建一个项目开始，展示在真正的开发和多人协作场景下怎么使用 Git。</p>
<p>本文使用的示例仓库地址：<a]]>
    </summary>
    <title>如何优雅地使用 Git</title>
    <updated>2026-08-13T14:47:39.259Z</updated>
  </entry>
  <entry>
    <author>
      <name>织星</name>
    </author>
    <category term="AI" scheme="https://misterrabbit0w0.github.io/categories/AI/"/>
    <category term="Agent" scheme="https://misterrabbit0w0.github.io/tags/Agent/"/>
    <category term="Prompt Engineering" scheme="https://misterrabbit0w0.github.io/tags/Prompt-Engineering/"/>
    <content>
      <![CDATA[<p>本文相关信息来源截止至 2026 年 6 月，后续可能会有变化，请以最新信息为准。</p><hr><p>这篇文章属于半扫盲性质的 agent 使用说明，小白也可放心食用~</p><hr><p>在聊如何使用之前，我们先来了解一些基础概念。</p><h2 id="Agent-是什么？"><a href="#Agent-是什么？" class="headerlink" title="Agent 是什么？"></a>Agent 是什么？</h2><p>先来认识几个名词</p><blockquote><p>agent n. 代理人；代理商；经纪人<br>model n. 模型；模特儿；模范<br>harness v. 利用；驾驭；控制</p></blockquote><p>所以可以简单地认为，agent 就是被系统驾驭的模型，能产出什么内容取决于两个方向，一是模型本身的能力，二是系统提供的能力。就好比电脑不但要有硬件，还要有操作系统和软件，才能发挥作用。</p><hr><p>大部分人说的 ai 其实并没有区分 <em>model</em> 和 <em>agent</em>，举个例子，大部分人用的豆包，其实是一个 <em>agent</em>（可能能力较弱），它背后的模型是 <code>doubao-seed-2.0(-pro)</code>，在豆包这个软件中，模型拥有了更多的能力（比如记忆、工具调用等），所以能产出更多的内容。</p><hr><p>目前常见的国外模型有：<code>claude, gemini, gpt</code>，有的可能还带有版本号，例如 <code>claude-opus-4-8</code>, <code>gpt-5.5-thinking</code>，<code>gemini-3.5-flash</code>（注意 anthropic 家的版本号用连字符而不是点）。<br>命名一般会暗示模型的强度，例如 flash 版本弱于 pro，版本号越新模型一般更强（但是有的厂商会开倒车）。当版本号和档位都不同时就不太好比，例如 <code>gemini-3.1-pro</code> 和 <code>gemini-3.5-flash</code>（我个人认为前者更强）。<br>国内的相对来说种类更多，主流的有：<code>deepseek</code>, <code>glm</code>, <code>kimi</code>, <code>qwen</code> 和 <code>doubao</code>，相关的版本规范也和国外的差不多。</p><p>还有一些额外的后缀，类似 <code>-thinking</code>, <code>-it</code>，<code>-xxb-axb</code>, 等等，这里不做讲解，感兴趣的可以自行搜索。</p><hr><p>再来谈谈有关的工具，也就是 harness，也可以称之为鞍，毕竟好马配好鞍。<br>目前最火的 agent 工具应该是 anthropic 的 <code>claude code</code>，简称 <code>cc</code>，它本身只原生支持 claude 系列模型，不过现在有工具能方便地接入其他模型了。<br>还有类似 codex，<a href="https://github.com/anomalyco/opencode">opencode</a>，<a href="https://github.com/earendil-works/pi">pi</a> 等一系列工具，这里就不一一举例。<br>harness 为 skills 提供了接口，skills 则拓展了 AI 的能力，例如写 word, ppt 等文档，调用浏览器或其他软件的能力。</p><h2 id="如何使用-agent？"><a href="#如何使用-agent？" class="headerlink" title="如何使用 agent？"></a>如何使用 agent？</h2><p>这一部分我会分为三节：</p><ul><li>如何安装 agent 工具 （安装 harness）</li><li>如何接入模型</li><li>如何拓展 agent 的能力（安装 skills）</li></ul><h3 id="如何安装-agent"><a href="#如何安装-agent" class="headerlink" title="如何安装 agent"></a>如何安装 agent</h3><p>这里以 <code>claude code</code> 为例。</p><h4 id="自动安装方法（推荐）"><a href="#自动安装方法（推荐）" class="headerlink" title="自动安装方法（推荐）"></a>自动安装方法（推荐）</h4><p>打开任意一个你能连接国外网络的浏览器，搜索 <code>claude code</code>，进入官网，目前官网链接是 <a href="https://claude.com/product/claude-code">这个</a>。官网的样子应该长成这样：</p><p><img src="/2026/06/02/2026-06-02-elegant-agent-guideline/claude-official.png" alt="Claude Code 官网首页"></p><p>看到页面中间的命令了吗？把它复制下来，用你电脑上的终端（terminal），粘贴这行命令，回车，就能安装了！如果你是 Windows 用户，建议使用 PowerShell 终端，Mac 用户可以使用自带的 Terminal 终端。</p><p>Windows（PowerShell）：</p><pre><code class="highlight powershell"><span class="built_in">irm</span> https://claude.ai/install.ps1 | <span class="built_in">iex</span></code></pre><p>macOS &#x2F; Linux：</p><pre><code class="highlight bash">curl -fsSL https://claude.ai/install.sh | bash</code></pre><p><strong>注意！</strong> 永远不要运行你不知道来源的命令，部分命令可能参杂有害代码，对电脑和财产造成危害，所以一定要确认命令的来源和内容。</p><p>这行命令是直接从官网复制的，可能会随着时间变化而变化，如果你发现官网上的命令和这里不一样，请以官网上的为准。</p><p>等待时间可能有点久，可以给终端设置代理加速，设置代理命令为</p><p>PowerShell：</p><pre><code class="highlight powershell"><span class="variable">$env:HTTP_PROXY</span>=<span class="string">&quot;your_proxy_url&quot;</span>; <span class="variable">$env:HTTPS_PROXY</span>=<span class="string">&quot;your_proxy_url&quot;</span></code></pre><p>cmd：</p><pre><code class="highlight bat"><span class="built_in">set</span> http_proxy=your_proxy_url<span class="built_in">set</span> https_proxy=your_proxy_url</code></pre><p>上述命令只在当前终端会话中生效，如果关闭终端后再打开，就需要重新设置一次。</p><h4 id="手动安装方法"><a href="#手动安装方法" class="headerlink" title="手动安装方法"></a>手动安装方法</h4><p>如果自动安装方法遇到了问题，可以使用以下手动安装方法。</p><p>首先，安装 Node.js，官网链接是 <a href="https://nodejs.org/">这个</a>，下载并安装最新的 LTS 版本。</p><p>安装完成后，打开终端，先验证 Node.js 是否安装成功，输入以下命令：</p><pre><code class="highlight bash">node -v</code></pre><p>如果显示了版本号，说明 Node.js 安装成功了。接下来，安装 <code>claude code</code>，输入以下命令：</p><pre><code class="highlight bash">npm install -g @anthropic-ai/claude-code@latest</code></pre><p>这一步需要的时间可能也比较久（问就是 nodejs 太臃肿），安装完成后，输入以下命令验证是否安装成功：</p><pre><code class="highlight bash">claude --version</code></pre><p>如果显示了版本号，说明 <code>claude code</code> 安装成功了。</p><hr><p>接下来要说明两个概念：<strong>用户级</strong> 和 <strong>项目级</strong>。</p><p>用户级（User-level）是指在本电脑用户范围内会生效的设置，工具或技能，此用户的所有项目都可以访问它们。用户级的配置位于 <code>~/.claude</code>（Windows 为 <code>%USERPROFILE%\.claude</code>） 目录下。</p><p>项目级（Project-level）是指在特定项目范围内会生效的设置，工具或技能，只有这个项目能访问它们。项目级的配置位于项目根目录下的 <code>.claude</code> 目录中。</p><h3 id="如何接入模型"><a href="#如何接入模型" class="headerlink" title="如何接入模型"></a>如何接入模型</h3><p>目前，国内想要用到完整的 claude&#x2F;gpt&#x2F;gemini 模型相对困难，这里给出用 deepseek 官方模型的示例，其他模型的接入方法大同小异。</p><p><strong>本教程不会对任何所谓 <em>中转站</em> 做出推荐和评价，也不会为任何因使用中转站而导致的问题负责，请自行判断和选择。</strong></p><h4 id="安装-cc-switch-（推荐）"><a href="#安装-cc-switch-（推荐）" class="headerlink" title="安装 cc-switch （推荐）"></a>安装 cc-switch （推荐）</h4><p>cc-switch 相当于一个懒人包，可以方便接入各种模型。可自行前往 <a href="https://github.com/farion1231/cc-switch/releases/latest">Github Release</a> 页面下载对应版本并安装。</p><p>首先，打开 deepseek 的官网，注册并登录你的账号。进入 <a href="https://platform.deepseek.com/">API 开放平台</a>。</p><p><img src="/2026/06/02/2026-06-02-elegant-agent-guideline/deepseek-official.png" alt="DeepSeek API 开放平台"></p><p>所有 agent 工具的使用都需要用到 API key，这个和网页端使用不一样，不是免费的！（可能有免费渠道，但请自己甄别）你必须先给模型厂商充值，才能使用 API key 调用他们的模型。一般 deepseek 充值 10 块左右就能用很久（按照用途不同，使用时间也不同）。</p><p>然后在 <a href="https://platform.deepseek.com/api_keys">API keys</a> 页面，选择创建 API key，输入名字（比如 claude-code），点击创建，就能看到你的 API key 了。</p><p><img src="/2026/06/02/2026-06-02-elegant-agent-guideline/api-key.png" alt="创建 DeepSeek API key"></p><p><strong>注意！</strong> deepseek 的 API key 只在创建时可见，一定要妥善保管。它是非常敏感的信息——拿到它的人就能用你的余额调用模型，和银行卡密码一个性质，千万不要泄露给任何人，包括我！不管是弄丢了还是不小心泄露了，都请立即删除这个 key 并重新创建。</p><p>如果你下载了 cc-switch，打开软件后点击右上角加号，在预设供应商中选择 <code>DeepSeek</code>，一般除了 API key 以外的部分不需要修改，只要把你的 API key 填入对应位置即可，如果其他地方的设置有问题，可以按照我图片中的内容填。</p><p><img src="/2026/06/02/2026-06-02-elegant-agent-guideline/cc-switch-official.png" alt="cc-switch"></p><p><img src="/2026/06/02/2026-06-02-elegant-agent-guideline/cc-switch-2-official.png" alt="cc-switch"></p><p>如果没有下载此工具，有以下两种方式接入模型：</p><h4 id="临时配置"><a href="#临时配置" class="headerlink" title="临时配置"></a>临时配置</h4><p>在终端中输入以下命令</p><p>Linux &#x2F; macOS：</p><pre><code class="highlight bash"><span class="built_in">export</span> ANTHROPIC_BASE_URL=https://api.deepseek.com/anthropic<span class="built_in">export</span> ANTHROPIC_AUTH_TOKEN=&lt;你的 DeepSeek API Key&gt;<span class="built_in">export</span> ANTHROPIC_MODEL=deepseek-v4-pro[1m]<span class="built_in">export</span> ANTHROPIC_DEFAULT_OPUS_MODEL=deepseek-v4-pro[1m]<span class="built_in">export</span> ANTHROPIC_DEFAULT_SONNET_MODEL=deepseek-v4-pro[1m]<span class="built_in">export</span> ANTHROPIC_DEFAULT_HAIKU_MODEL=deepseek-v4-flash<span class="built_in">export</span> CLAUDE_CODE_SUBAGENT_MODEL=deepseek-v4-flash<span class="built_in">export</span> CLAUDE_CODE_EFFORT_LEVEL=max</code></pre><p>Windows（PowerShell）：</p><pre><code class="highlight powershell"><span class="variable">$env:ANTHROPIC_BASE_URL</span>=<span class="string">&quot;https://api.deepseek.com/anthropic&quot;</span><span class="variable">$env:ANTHROPIC_AUTH_TOKEN</span>=<span class="string">&quot;&lt;你的 DeepSeek API Key&gt;&quot;</span><span class="variable">$env:ANTHROPIC_MODEL</span>=<span class="string">&quot;deepseek-v4-pro[1m]&quot;</span><span class="variable">$env:ANTHROPIC_DEFAULT_OPUS_MODEL</span>=<span class="string">&quot;deepseek-v4-pro[1m]&quot;</span><span class="variable">$env:ANTHROPIC_DEFAULT_SONNET_MODEL</span>=<span class="string">&quot;deepseek-v4-pro[1m]&quot;</span><span class="variable">$env:ANTHROPIC_DEFAULT_HAIKU_MODEL</span>=<span class="string">&quot;deepseek-v4-flash&quot;</span><span class="variable">$env:CLAUDE_CODE_SUBAGENT_MODEL</span>=<span class="string">&quot;deepseek-v4-flash&quot;</span><span class="variable">$env:CLAUDE_CODE_EFFORT_LEVEL</span>=<span class="string">&quot;max&quot;</span></code></pre><p><strong>注意！</strong> 这种方式只在当前终端会话中生效，如果关闭终端后再打开，就需要重新设置一次。</p><h4 id="永久配置"><a href="#永久配置" class="headerlink" title="永久配置"></a>永久配置</h4><p>更推荐直接写入 Claude Code 的配置文件 <code>~/.claude/settings.json</code>（Windows 为<br>  <code>%USERPROFILE%\.claude\settings.json</code>）。在文件中添加以下内容：</p><pre><code class="highlight json"><span class="punctuation">&#123;</span>  <span class="attr">&quot;env&quot;</span><span class="punctuation">:</span> <span class="punctuation">&#123;</span>    <span class="attr">&quot;ANTHROPIC_BASE_URL&quot;</span><span class="punctuation">:</span> <span class="string">&quot;https://api.deepseek.com/anthropic&quot;</span><span class="punctuation">,</span>    <span class="attr">&quot;ANTHROPIC_AUTH_TOKEN&quot;</span><span class="punctuation">:</span> <span class="string">&quot;&lt;你的 DeepSeek API Key&gt;&quot;</span><span class="punctuation">,</span>    <span class="attr">&quot;ANTHROPIC_MODEL&quot;</span><span class="punctuation">:</span> <span class="string">&quot;deepseek-v4-pro[1m]&quot;</span><span class="punctuation">,</span>    <span class="attr">&quot;ANTHROPIC_DEFAULT_OPUS_MODEL&quot;</span><span class="punctuation">:</span> <span class="string">&quot;deepseek-v4-pro[1m]&quot;</span><span class="punctuation">,</span>    <span class="attr">&quot;ANTHROPIC_DEFAULT_SONNET_MODEL&quot;</span><span class="punctuation">:</span> <span class="string">&quot;deepseek-v4-pro[1m]&quot;</span><span class="punctuation">,</span>    <span class="attr">&quot;ANTHROPIC_DEFAULT_HAIKU_MODEL&quot;</span><span class="punctuation">:</span> <span class="string">&quot;deepseek-v4-flash&quot;</span><span class="punctuation">,</span>    <span class="attr">&quot;CLAUDE_CODE_SUBAGENT_MODEL&quot;</span><span class="punctuation">:</span> <span class="string">&quot;deepseek-v4-flash&quot;</span><span class="punctuation">,</span>    <span class="attr">&quot;CLAUDE_CODE_EFFORT_LEVEL&quot;</span><span class="punctuation">:</span> <span class="string">&quot;max&quot;</span>  <span class="punctuation">&#125;</span><span class="punctuation">&#125;</span></code></pre><h3 id="如何拓展-agent-的能力"><a href="#如何拓展-agent-的能力" class="headerlink" title="如何拓展 agent 的能力"></a>如何拓展 agent 的能力</h3><p>Agent 的能力拓展主要是通过安装 skills 来实现的，skills 就好比是 agent 的插件，可以让 agent 拥有更多的功能，例如写文档、调用浏览器等。</p><p>skills 分用户级和项目级（和前面说的配置分级一致），具体把一个 skill 安装在哪一级取决于其功能范围。</p><p>用户级 skill 的安装位置是：<code>~/.claude/skills</code>。<br>项目级 skill 的安装位置是：项目根目录下的 <code>.claude/skills</code>。</p><p>目前，claude code 已经内置了很多实用的 skills，这些 skills 可以直接使用，无需额外安装。</p><p>如果你想要安装第三方的 skills，可以通过以下方式进行安装：</p><h4 id="利用-SKillpkg-安装和管理"><a href="#利用-SKillpkg-安装和管理" class="headerlink" title="利用 SKillpkg 安装和管理"></a>利用 SKillpkg 安装和管理</h4><p>这里推荐一个朋友写的 <a href="https://github.com/Richardlxr/SKillpkg">skill 管理工具</a>，可以按照手册进行管理和安装。</p><h4 id="手动安装"><a href="#手动安装" class="headerlink" title="手动安装"></a>手动安装</h4><p><del>其实可以让你已经安装的 agent 帮你下载和管理 skills</del></p><p>一般的 skills，以 <a href="https://github.com/obra/superpowers">superpowers</a> 为例，会提供完整的安装说明。</p><p>如果没有提供安装说明，一般来说，下载后把 skills 文件夹放到 <code>~/.claude/skills</code> 目录下就可以了。</p><p>第一次安装 skills 可能没有这个文件夹，自行创建即可。</p><p>一个 skills 的文件结构一般是这样的：</p><pre><code class="highlight text">技能名字/├── SKILL.md // 技能入口，一般 agent 会尝试发现此文件来预加载 skills├── requirements.txt // 有的技能可能涉及运行 python 脚本，这个文件会列出所需的 python 包├── references/ // 参考资料，可能包含一些文档、图片等└── scripts/ // 可能包含一些脚本文件，例如 python 脚本等</code></pre><p>安装完成后，可以在 agent 中调用 <code>/skills</code> 命令查看 skills 的安装状态。一般通过 <code>/技能名字</code> 就可以调用技能。</p><p><img src="/2026/06/02/2026-06-02-elegant-agent-guideline/skill-list.png" alt="skill-list"><br><img src="/2026/06/02/2026-06-02-elegant-agent-guideline/use-a-skill.png" alt="use-a-skill"></p><p><strong>注意！</strong> 在安装第三方 skills 时，一定要确认 skills 的来源和内容，尤其是那些包含脚本文件的 skills，因为它们可能会执行一些你不希望执行的操作，所以一定要谨慎选择和安装 skills。</p><h2 id="如何让-agent-帮你干活"><a href="#如何让-agent-帮你干活" class="headerlink" title="如何让 agent 帮你干活"></a>如何让 agent 帮你干活</h2><p>很多人提到 claude code，会误认为只能用来写代码，但是因为其能阅读本地文件的特性，所以也可以用来处理一些日常 workflow。</p><p>下面以大家 <del>喜闻乐见</del> 的汇报PPT为例，讲解如何用 skill: <a href="https://github.com/hugohe3/ppt-master">ppt-master</a> 生成PPT。</p><p>（非必需项）如果你的 PPT 刚需视觉元素，建议选择一个 <strong>多模态</strong> 模型接入 claude code，例如 kimi-k2.6&#x2F;minimax-m3，deepseek 所有模型能上传图片的本质是通过 OCR 提取图片中的文字进行分析。</p><p>首先，新建一个文件夹作为 claude code 工作区，claude code 必须运行在工作区里。</p><p>我一般会使用 <code>claude --dangerously-skip-permissions</code> 指令打开 claude code，这串东西的意思是自动批准所有请求，直接运行。所以如果你对模型能力保持怀疑，或你不确定你的模型来源，请不要使用此功能，并务必核对每条操作指令。</p><p>然后，安装 <a href="https://github.com/hugohe3/ppt-master">ppt-master</a>，官网有不同系统的安装提示，如果你不确定，直接让 claude code 为你安装即可。</p><p><img src="/2026/06/02/2026-06-02-elegant-agent-guideline/install-ppt-master.png" alt="install-ppt-master"></p><p>然后把参考的模板和资料丢到工作文件夹中，使用类似以下的提示词。</p><pre><code class="highlight text">/ppt-master 生成用于 [你的使用场景] 的演示文稿，参考 @[如果你有模板，此处填模板路径] 的格式，参考资源 @[你要讲的相关文件路径]</code></pre><p>一般模型可能会再问你几个相关设计问题，回答之后就会开始生成 PPT。</p><p>如果一切顺利，AI会告诉你演示文稿的路径，审阅过后可以提出修改意见（例如全局换字体，某一页的排版更换等）</p><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>这是一份简易的关于如何安装和使用 agent 的指南，主要以 <code>claude code</code> 为例进行说明，其他 agent 工具的使用方法大同小异。如果有帮助，可以<a href="https://github.com/MisterRabbit0w0/misterrabbit0w0.github.io">点一个 star</a> 支持一下。</p>]]>
    </content>
    <id>https://misterrabbit0w0.github.io/2026/06/02/2026-06-02-elegant-agent-guideline/</id>
    <link href="https://misterrabbit0w0.github.io/2026/06/02/2026-06-02-elegant-agent-guideline/"/>
    <published>2026-06-02T02:00:00.000Z</published>
    <summary>
      <![CDATA[<p>本文相关信息来源截止至 2026 年 6 月，后续可能会有变化，请以最新信息为准。</p>
<hr>
<p>这篇文章属于半扫盲性质的 agent 使用说明，小白也可放心食用~</p>
<hr>
<p>在聊如何使用之前，我们先来了解一些基础概念。</p>
<h2]]>
    </summary>
    <title>如何优雅地使用 Agent</title>
    <updated>2026-08-13T14:47:39.255Z</updated>
  </entry>
  <entry>
    <author>
      <name>织星</name>
    </author>
    <category term="tools" scheme="https://misterrabbit0w0.github.io/categories/tools/"/>
    <category term="Hexo" scheme="https://misterrabbit0w0.github.io/tags/Hexo/"/>
    <category term="CSS" scheme="https://misterrabbit0w0.github.io/tags/CSS/"/>
    <category term="oklch" scheme="https://misterrabbit0w0.github.io/tags/oklch/"/>
    <content>
      <![CDATA[<p>因为没搞懂怎么挂别人主题的依赖，索性自己写了一个，从 UI 参考稿开始。最初取名 <strong>Hoshino</strong>（星野），后来主题长出了入夜的星空和室女座，干脆改名 <strong>Spica</strong>——室女座最亮的那颗星、角宿一，也是织星这个名字的落点。</p><p>至于为什么要一直打磨这个主题，我仍然想和其他人拉出差距，而不是停留在可以复刻的平庸上。</p><h2 id="长什么样"><a href="#长什么样" class="headerlink" title="长什么样"></a>长什么样</h2><ul><li>米黄色打底，樱花粉做唯一主色。颜色全部用 oklch 写，亮色、暗色、跟随系统三种模式</li><li>全站字体是 <a href="https://github.com/subframe7536/maple-font">Maple Mono CN</a>——中英 2:1 的等宽字体，我一直想用它</li><li>文章头图不放图片，改成「星图」：拿标题做哈希种子，构建时生成一张星座连线 SVG。同一篇文章永远是同一张，每篇文章互不相同</li><li>和很多很多小惊喜</li></ul><h2 id="一些实现碎片"><a href="#一些实现碎片" class="headerlink" title="一些实现碎片"></a>一些实现碎片</h2><ul><li>EJS 模板 + 两个 CSS 文件，没上任何框架</li><li>暗色模式用 <code>data-color-mode</code> 切换，颜色全走 CSS 变量，星图封面也跟着一起变色</li></ul><h2 id="上线之后"><a href="#上线之后" class="headerlink" title="上线之后"></a>上线之后</h2><p>主题没有停在发布那天，之后一直在长。挑几条值得留档的：</p><ul><li><strong>首页夜空</strong>：重写成一条汇向角宿一的星河；暗色下点亮 Spica，可以许愿。樱花花瓣分了景深层，入夜自动关闭——夜晚的页面应该比白天更安静</li><li><strong>文章组件</strong>：多了五个 tag plugin——剧透条、台词、评分、链接卡、图组。剧透条在写 ATRI 那篇时第一次实战</li><li><strong>引用分了两种</strong>：<code>&gt;</code> 旁注换楷体排，借中文排印「换一种声音」的老办法；带署名的 <code>blockquote</code> 标签才配引号。装饰不能谎报语义</li><li><strong>星图封面</strong>：环境光移出了 SVG，穿过 mask 融进正文，不再被视口和渐隐裁出硬边；远景小星从中性灰改成带彩度的玫瑰灰，浅色下不再像一层灰尘；入场时星座会先把自己描绘一遍</li><li><strong>杂项</strong>：阅读统计换成不蒜子；全站交互收在一个 <code>shared.js</code>；滚动渐入刻意不碰正文段落</li></ul><p>回头看，最重要的一次改动是删减：指针拖尾、点击星尘、暗色光斑都拿掉了。拉开差距靠的不是堆料，是克制。</p>]]>
    </content>
    <id>https://misterrabbit0w0.github.io/2026/05/31/2026-04-20-hoshino-theme/</id>
    <link href="https://misterrabbit0w0.github.io/2026/05/31/2026-04-20-hoshino-theme/"/>
    <published>2026-05-31T15:30:00.000Z</published>
    <summary>
      <![CDATA[<p>因为没搞懂怎么挂别人主题的依赖，索性自己写了一个，从 UI 参考稿开始。最初取名 <strong>Hoshino</strong>（星野），后来主题长出了入夜的星空和室女座，干脆改名]]>
    </summary>
    <title>博客换装：Spica 主题上线</title>
    <updated>2026-08-05T14:00:00.000Z</updated>
  </entry>
  <entry>
    <author>
      <name>织星</name>
    </author>
    <category term="translation" scheme="https://misterrabbit0w0.github.io/categories/translation/"/>
    <category term="algorithms" scheme="https://misterrabbit0w0.github.io/tags/algorithms/"/>
    <category term="KaTeX" scheme="https://misterrabbit0w0.github.io/tags/KaTeX/"/>
    <category term="VitePress" scheme="https://misterrabbit0w0.github.io/tags/VitePress/"/>
    <content>
      <![CDATA[<p>花了几天时间，把《The Little Book of Algorithms》翻译成了中文版，部署在 <a href="https://misterrabbit0w0.github.io/little-book-of-algorithms-zh/">misterrabbit0w0.github.io&#x2F;little-book-of-algorithms-zh</a></p><h2 id="基本情况"><a href="#基本情况" class="headerlink" title="基本情况"></a>基本情况</h2><ul><li><strong>11 章</strong>，覆盖算法基础 → 字符串 → 图论 → 动态规划 → 机器学习 &#x2F; 深度学习</li><li>中文用词尽量自然，保留原作的精炼节奏</li></ul><h2 id="几个小坑"><a href="#几个小坑" class="headerlink" title="几个小坑"></a>几个小坑</h2><p>翻译过程中踩到不少 markdown&#x2F;LaTeX 边界 bug：</p><ul><li>表格单元里的 <code>$|g|_2$</code> 会被 markdown-it 按 <code>|</code> 切列</li><li><code>$$...$$</code> 块里碰到 <code>_{subscript}</code> 会被解析成 <code>&lt;em&gt;</code></li><li>行首的 <code>+</code> 会被吃成列表项，把 <code>$$...$$</code> 劈成两半</li><li>setext heading：公式块里单独一行 <code>=</code> 会把上一行变 <code>&lt;h1&gt;</code></li></ul><p>全部在 <a href="https://github.com/misterrabbit0w0/little-book-of-algorithms-zh/blob/main/.vitepress/theme/index.ts">.vitepress&#x2F;theme&#x2F;index.ts</a> 里加了一层客户端 pass-0 解包 + regex 放宽解决了。</p><h2 id="去哪读"><a href="#去哪读" class="headerlink" title="去哪读"></a>去哪读</h2><p><a href="https://misterrabbit0w0.github.io/little-book-of-algorithms-zh/">在线版</a>（KaTeX 即时渲染，响应式布局），源码在 <a href="https://github.com/misterrabbit0w0/little-book-of-algorithms-zh">GitHub</a>。</p><p>发现翻译问题或者排版 bug，欢迎来提 issue 和 PR。</p>]]>
    </content>
    <id>https://misterrabbit0w0.github.io/2026/04/20/2026-04-20-little-book-of-algorithms-zh/</id>
    <link href="https://misterrabbit0w0.github.io/2026/04/20/2026-04-20-little-book-of-algorithms-zh/"/>
    <published>2026-04-20T02:00:00.000Z</published>
    <summary>
      <![CDATA[<p>花了几天时间，把《The Little Book of Algorithms》翻译成了中文版，部署在 <a]]>
    </summary>
    <title>《小小算法书》中文版上线</title>
    <updated>2026-08-13T14:47:39.255Z</updated>
  </entry>
</feed>
