<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>RunRunxka&apos;s Blog</title><description>技术分享与实践</description><link>https://runrunxka.xyz/</link><language>zh_CN</language><item><title>👋 欢迎来到我的主页</title><link>https://runrunxka.xyz/posts/welcome/</link><guid isPermaLink="true">https://runrunxka.xyz/posts/welcome/</guid><description>我是 Run，一名热爱折腾、保持好奇的学生开发者。这里记录着我的技术沉淀、项目实战与跨界探索。</description><pubDate>Sat, 23 May 2026 10:54:00 GMT</pubDate><content:encoded>&lt;h2&gt;我是 Run&lt;/h2&gt;
&lt;p&gt;很高兴在广阔的互联网中与你相遇。我是一名热爱折腾、保持好奇的学生开发者。&lt;/p&gt;
&lt;p&gt;我的日常主要游走于 &lt;strong&gt;Python&lt;/strong&gt; 与 &lt;strong&gt;Java Spring Boot&lt;/strong&gt; 之间，喜欢构建实用有趣的后端系统，也热衷于探索从底层硬件逻辑到 AI 算法（比如强化学习与路径规划）的广阔世界。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;📮 在这里你可以看到&lt;/h2&gt;
&lt;h3&gt;💻 技术沉淀&lt;/h3&gt;
&lt;p&gt;后端开发笔记、代码踩坑记录（为了跟 Bug 死磕，我还专门写过一个错题本系统！）以及数据库层面的探索。&lt;/p&gt;
&lt;h3&gt;🚀 项目实战&lt;/h3&gt;
&lt;p&gt;从 Python 数据可视化实操，到各种新奇算法的落地折腾日常。&lt;/p&gt;
&lt;h3&gt;📝 跨界探索&lt;/h3&gt;
&lt;p&gt;无论是计量经济学模型的学习心得，还是偶尔对英语词根词缀的硬核拆解，这里记录着我多面的学习轨迹。&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;永远在寻找更优雅的代码解决方案，也永远在学习的路上。欢迎随便逛逛，期待与你交流探讨！&lt;/p&gt;
</content:encoded></item><item><title>🧩 Git 入门教程：从零开始掌握版本控制</title><link>https://runrunxka.xyz/posts/git-beginner-guide/</link><guid isPermaLink="true">https://runrunxka.xyz/posts/git-beginner-guide/</guid><description>一篇适合新手的 Git 入门教程，涵盖 Git 安装、初始化仓库、提交代码、分支管理、远程仓库协作和常见问题处理。</description><pubDate>Fri, 29 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;::ai-summary
这篇文章是一份面向新手的 Git 入门教程，介绍了 Git 的基本概念、常用命令、分支管理、远程仓库协作、冲突解决以及撤销修改等日常开发中最常用的操作。
::&lt;/p&gt;
&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;如果你正在学习编程，或者已经开始写项目，那么 Git 基本上是绕不开的工具。&lt;/p&gt;
&lt;p&gt;它可以帮我们记录代码修改历史，也可以让多人协作开发变得更加安全和高效。&lt;/p&gt;
&lt;p&gt;简单来说，Git 能解决这些问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;代码写坏了，可以回到之前的版本&lt;/li&gt;
&lt;li&gt;想知道某一行代码是谁改的&lt;/li&gt;
&lt;li&gt;多个人可以同时开发同一个项目&lt;/li&gt;
&lt;li&gt;不同功能可以放在不同分支里开发&lt;/li&gt;
&lt;li&gt;可以把代码同步到 GitHub、GitLab 或 Gitee&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这篇文章会从零开始，带你掌握 Git 的日常使用方式。&lt;/p&gt;
&lt;p&gt;:::tip
如果你是第一次接触 Git，不需要一次性记住所有命令。先掌握 &lt;code&gt;git status&lt;/code&gt;、&lt;code&gt;git add&lt;/code&gt;、&lt;code&gt;git commit&lt;/code&gt;、&lt;code&gt;git push&lt;/code&gt;、&lt;code&gt;git pull&lt;/code&gt; 这几个命令就够用了。
:::&lt;/p&gt;
&lt;h2&gt;Git 是什么？&lt;/h2&gt;
&lt;p&gt;Git 是一个版本控制工具。&lt;/p&gt;
&lt;p&gt;所谓版本控制，就是帮你记录文件每一次变化。&lt;/p&gt;
&lt;p&gt;比如你今天写了一个登录功能，明天又修改了页面样式，后天发现登录功能被改坏了。如果没有 Git，你可能只能靠备份文件找回之前的代码。&lt;/p&gt;
&lt;p&gt;但如果你用了 Git，就可以很方便地查看历史记录，甚至回退到某个正常版本。&lt;/p&gt;
&lt;h2&gt;Git 和 GitHub 有什么区别？&lt;/h2&gt;
&lt;p&gt;很多新手会把 Git 和 GitHub 混在一起，其实它们不是一回事。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;名称&lt;/th&gt;
&lt;th&gt;作用&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Git&lt;/td&gt;
&lt;td&gt;本地版本控制工具&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitHub&lt;/td&gt;
&lt;td&gt;远程代码托管平台&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GitLab&lt;/td&gt;
&lt;td&gt;远程代码托管平台&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gitee&lt;/td&gt;
&lt;td&gt;国内常用代码托管平台&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;可以这样理解：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Git 是工具，GitHub 是存代码的网站。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;即使你不使用 GitHub，也可以在本地正常使用 Git。&lt;/p&gt;
&lt;h2&gt;安装 Git&lt;/h2&gt;
&lt;h3&gt;Windows&lt;/h3&gt;
&lt;p&gt;Windows 用户可以直接去 Git 官网下载安装包：&lt;/p&gt;
&lt;p&gt;:url[https://git-scm.com/]&lt;/p&gt;
&lt;p&gt;安装时一路默认即可。&lt;/p&gt;
&lt;p&gt;安装完成后，可以在桌面或文件夹中右键，如果看到 &lt;code&gt;Git Bash Here&lt;/code&gt;，说明安装成功。&lt;/p&gt;
&lt;p&gt;然后打开终端，输入：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git --version
git version 2.x.x
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果能看到版本号，就说明 Git 已经安装好了。&lt;/p&gt;
&lt;h3&gt;macOS&lt;/h3&gt;
&lt;p&gt;如果你安装了 Homebrew，可以使用：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ brew install git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也可以直接输入：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git --version
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果系统提示安装开发者工具，按照提示安装即可。&lt;/p&gt;
&lt;h3&gt;Linux&lt;/h3&gt;
&lt;p&gt;Ubuntu 或 Debian 系统：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ sudo apt install git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;CentOS 系统：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ sudo yum install git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安装完成后检查版本：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git --version
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;配置 Git 用户信息&lt;/h2&gt;
&lt;p&gt;第一次使用 Git，需要配置用户名和邮箱。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git config --global user.name &quot;你的名字&quot;
$ git config --global user.email &quot;你的邮箱&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git config --global user.name &quot;Run&quot;
$ git config --global user.email &quot;run@example.com&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看当前配置：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git config --list
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这些信息会出现在你的每一次提交记录里。&lt;/p&gt;
&lt;p&gt;:::note
这里的邮箱建议和 GitHub、GitLab 或 Gitee 账号邮箱保持一致，这样提交记录更容易正确关联到你的账号。
:::&lt;/p&gt;
&lt;h2&gt;创建一个 Git 仓库&lt;/h2&gt;
&lt;p&gt;Git 仓库就是被 Git 管理的项目目录。&lt;/p&gt;
&lt;p&gt;创建仓库有两种常见方式。&lt;/p&gt;
&lt;h2&gt;方式一：初始化本地项目&lt;/h2&gt;
&lt;p&gt;假设你已经有一个项目目录：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ cd my-project
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后初始化 Git：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git init
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;执行成功后，项目目录下会生成一个隐藏文件夹：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个 &lt;code&gt;.git&lt;/code&gt; 文件夹保存了 Git 的版本记录。&lt;/p&gt;
&lt;p&gt;:::caution
不要随便删除 &lt;code&gt;.git&lt;/code&gt; 文件夹，否则这个项目的 Git 历史记录会丢失。
:::&lt;/p&gt;
&lt;h2&gt;方式二：克隆远程仓库&lt;/h2&gt;
&lt;p&gt;如果项目已经在 GitHub、GitLab 或 Gitee 上，可以直接克隆：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git clone 仓库地址
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git clone https://github.com/example/demo.git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;克隆完成后，会生成一个项目文件夹：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ cd demo
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Git 的三个核心区域&lt;/h2&gt;
&lt;p&gt;学习 Git 时，需要理解三个区域：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;工作区 -&amp;gt; 暂存区 -&amp;gt; 本地仓库
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;区域&lt;/th&gt;
&lt;th&gt;含义&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;工作区&lt;/td&gt;
&lt;td&gt;你正在编辑的文件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;暂存区&lt;/td&gt;
&lt;td&gt;准备提交的文件&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;本地仓库&lt;/td&gt;
&lt;td&gt;已经正式保存的版本记录&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;日常使用 Git 的流程一般是：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;修改文件 -&amp;gt; git add -&amp;gt; git commit
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也就是说，文件修改后，需要先加入暂存区，然后再提交到本地仓库。&lt;/p&gt;
&lt;h2&gt;查看文件状态&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;git status&lt;/code&gt; 是最常用的命令之一。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git status
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;它可以告诉你：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;哪些文件被修改了&lt;/li&gt;
&lt;li&gt;哪些文件还没有被 Git 跟踪&lt;/li&gt;
&lt;li&gt;哪些文件已经加入暂存区&lt;/li&gt;
&lt;li&gt;当前所在分支是什么&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;建议你每次提交前都执行一次：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git status
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样可以避免把不该提交的文件提交上去。&lt;/p&gt;
&lt;h2&gt;添加文件到暂存区&lt;/h2&gt;
&lt;p&gt;添加单个文件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git add index.html
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;添加所有修改：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git add .
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;git add .&lt;/code&gt; 会把当前目录下所有修改加入暂存区。&lt;/p&gt;
&lt;p&gt;:::important
&lt;code&gt;git add&lt;/code&gt; 并不是提交代码，它只是把修改放进暂存区。真正保存版本记录需要执行 &lt;code&gt;git commit&lt;/code&gt;。
:::&lt;/p&gt;
&lt;h2&gt;提交代码&lt;/h2&gt;
&lt;p&gt;提交代码使用：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git commit -m &quot;提交说明&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git commit -m &quot;feat: add login page&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;提交说明建议写清楚本次提交做了什么。&lt;/p&gt;
&lt;p&gt;不推荐这样写：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git commit -m &quot;update&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;更推荐这样写：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git commit -m &quot;feat: add user login&quot;
$ git commit -m &quot;fix: resolve login button style&quot;
$ git commit -m &quot;docs: update README&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;常见提交前缀可以参考：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;前缀&lt;/th&gt;
&lt;th&gt;含义&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;feat&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;新功能&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;fix&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;修复问题&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;docs&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;文档修改&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;style&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;样式修改&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;refactor&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;代码重构&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;chore&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;构建、配置等杂项&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;查看提交历史&lt;/h2&gt;
&lt;p&gt;查看完整提交历史：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git log
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果觉得内容太多，可以使用简洁模式：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git log --oneline
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;输出大概是这样：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;a1b2c3d feat: add login page
e4f5g6h docs: update README
i7j8k9l init project
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;每一行前面的字符串就是提交 ID，可以用来回退版本或查看具体修改。&lt;/p&gt;
&lt;h2&gt;查看文件修改内容&lt;/h2&gt;
&lt;p&gt;查看当前修改：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git diff
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个命令可以看到你修改了哪些内容。&lt;/p&gt;
&lt;p&gt;如果想查看已经加入暂存区的修改，可以使用：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git diff --cached
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;分支是什么？&lt;/h2&gt;
&lt;p&gt;分支是 Git 非常重要的功能。&lt;/p&gt;
&lt;p&gt;你可以把分支理解成一条独立的开发线。&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;main             主分支
feature-login    登录功能分支
feature-pay      支付功能分支
fix-header       修复顶部导航分支
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;不同功能可以在不同分支上开发，互不影响。&lt;/p&gt;
&lt;h2&gt;查看分支&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;$ git branch
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当前所在分支前面会有一个 &lt;code&gt;*&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;* main
  feature-login
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;说明你当前在 &lt;code&gt;main&lt;/code&gt; 分支上。&lt;/p&gt;
&lt;h2&gt;创建分支&lt;/h2&gt;
&lt;p&gt;创建一个新分支：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git branch feature-login
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个命令只会创建分支，不会自动切换过去。&lt;/p&gt;
&lt;h2&gt;切换分支&lt;/h2&gt;
&lt;p&gt;切换到指定分支：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git switch feature-login
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;旧版本 Git 也可以使用：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git checkout feature-login
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;现在更推荐使用 &lt;code&gt;git switch&lt;/code&gt;，语义更清晰。&lt;/p&gt;
&lt;h2&gt;创建并切换分支&lt;/h2&gt;
&lt;p&gt;实际开发中，我们经常直接创建并切换到新分支：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git switch -c feature-login
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这相当于：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git branch feature-login
$ git switch feature-login
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;合并分支&lt;/h2&gt;
&lt;p&gt;假设你在 &lt;code&gt;feature-login&lt;/code&gt; 分支完成了登录功能，现在想合并到 &lt;code&gt;main&lt;/code&gt; 分支。&lt;/p&gt;
&lt;p&gt;先切回主分支：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git switch main
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后执行合并：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git merge feature-login
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果没有冲突，Git 会自动完成合并。&lt;/p&gt;
&lt;h2&gt;删除分支&lt;/h2&gt;
&lt;p&gt;功能分支合并完成后，可以删除：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git branch -d feature-login
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果分支还没有合并，但你确定要强制删除：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git branch -D feature-login
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::warning
强制删除分支可能会导致未合并的代码丢失，使用前一定要确认。
:::&lt;/p&gt;
&lt;h2&gt;连接远程仓库&lt;/h2&gt;
&lt;p&gt;如果你想把本地代码推送到 GitHub，需要先添加远程仓库。&lt;/p&gt;
&lt;p&gt;查看当前远程仓库：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git remote -v
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;添加远程仓库：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git remote add origin 仓库地址
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git remote add origin https://github.com/example/demo.git
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里的 &lt;code&gt;origin&lt;/code&gt; 是远程仓库的默认名称。&lt;/p&gt;
&lt;h2&gt;推送代码到远程仓库&lt;/h2&gt;
&lt;p&gt;第一次推送：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git push -u origin main
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;之后可以直接使用：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git push
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果你的主分支叫 &lt;code&gt;master&lt;/code&gt;，则使用：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git push -u origin master
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::note
现在很多平台默认主分支叫 &lt;code&gt;main&lt;/code&gt;，以前很多项目默认叫 &lt;code&gt;master&lt;/code&gt;。具体用哪个，以你的项目实际分支名为准。
:::&lt;/p&gt;
&lt;h2&gt;拉取远程代码&lt;/h2&gt;
&lt;p&gt;从远程仓库拉取最新代码：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git pull
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;它相当于：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git fetch
$ git merge
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;也就是说，&lt;code&gt;git pull&lt;/code&gt; 会先获取远程更新，然后自动合并到当前分支。&lt;/p&gt;
&lt;p&gt;如果你只想获取远程更新，但不想自动合并，可以使用：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git fetch
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;解决代码冲突&lt;/h2&gt;
&lt;p&gt;多人协作时，很容易遇到代码冲突。&lt;/p&gt;
&lt;p&gt;例如，两个人同时修改了同一个文件的同一行，Git 不知道应该保留谁的修改，就会产生冲突。&lt;/p&gt;
&lt;p&gt;冲突内容通常长这样：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; HEAD
这是你的代码
=======
这是别人的代码
&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; feature-branch
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;你需要手动编辑文件，决定保留哪一部分。&lt;/p&gt;
&lt;p&gt;修改完成后执行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git add .
$ git commit -m &quot;fix: resolve merge conflict&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::tip
解决冲突时不要慌，先看清楚两边代码分别是什么，再决定保留、删除或合并。
:::&lt;/p&gt;
&lt;h2&gt;撤销工作区修改&lt;/h2&gt;
&lt;p&gt;如果你修改了文件，但还没有执行 &lt;code&gt;git add&lt;/code&gt;，可以使用：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git restore 文件名
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git restore index.html
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;撤销所有未暂存修改：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git restore .
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::warning
这个操作会丢弃工作区修改，执行前要确认这些修改不需要了。
:::&lt;/p&gt;
&lt;h2&gt;撤销暂存区文件&lt;/h2&gt;
&lt;p&gt;如果你已经执行了 &lt;code&gt;git add&lt;/code&gt;，但还没有提交，可以把文件从暂存区撤回来：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git restore --staged 文件名
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git restore --staged index.html
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样文件修改还在，只是不再处于暂存状态。&lt;/p&gt;
&lt;h2&gt;回退版本&lt;/h2&gt;
&lt;p&gt;如果想回退到上一个版本，可以使用：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git reset --hard HEAD^
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果想回退到指定提交：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git reset --hard 提交ID
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git reset --hard a1b2c3d
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;:::warning
&lt;code&gt;git reset --hard&lt;/code&gt; 会丢弃当前未提交的修改，使用前一定要谨慎。
:::&lt;/p&gt;
&lt;p&gt;如果代码已经推送到远程仓库，更推荐使用：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git revert 提交ID
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;git revert&lt;/code&gt; 会创建一个新的提交，用来撤销之前的提交，更适合团队协作。&lt;/p&gt;
&lt;h2&gt;临时保存修改&lt;/h2&gt;
&lt;p&gt;有时候你正在写一个功能，突然需要切换分支修 bug，但当前代码还不想提交。&lt;/p&gt;
&lt;p&gt;这时可以使用：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git stash
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看临时保存列表：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git stash list
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;恢复最近一次保存：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git stash pop
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;只恢复但不删除 stash：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git stash apply
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;使用 .gitignore 忽略文件&lt;/h2&gt;
&lt;p&gt;有些文件不应该提交到仓库，比如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;依赖目录&lt;/li&gt;
&lt;li&gt;编译产物&lt;/li&gt;
&lt;li&gt;日志文件&lt;/li&gt;
&lt;li&gt;本地环境变量&lt;/li&gt;
&lt;li&gt;密钥文件&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;可以在项目根目录创建 &lt;code&gt;.gitignore&lt;/code&gt; 文件。&lt;/p&gt;
&lt;p&gt;Node.js 项目常见写法：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;node_modules/
dist/
.env
*.log
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Python 项目常见写法：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;__pycache__/
*.pyc
.env
venv/
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果某个文件已经被 Git 跟踪，后来再加入 &lt;code&gt;.gitignore&lt;/code&gt; 不会自动生效。&lt;/p&gt;
&lt;p&gt;需要先取消跟踪：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git rm --cached 文件名
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git rm --cached .env
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;日常开发推荐流程&lt;/h2&gt;
&lt;p&gt;一个比较常见的 Git 开发流程如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git pull
$ git switch -c feature-login
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后修改代码。&lt;/p&gt;
&lt;p&gt;修改完成后：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git status
$ git add .
$ git commit -m &quot;feat: add login feature&quot;
$ git push -u origin feature-login
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;之后可以在 GitHub、GitLab 或 Gitee 上创建 Pull Request / Merge Request，让别人进行代码审核。&lt;/p&gt;
&lt;p&gt;审核通过后，再合并到主分支。&lt;/p&gt;
&lt;h2&gt;常用命令速查表&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;命令&lt;/th&gt;
&lt;th&gt;作用&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;git init&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;初始化仓库&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;git clone 仓库地址&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;克隆远程仓库&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;git status&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;查看文件状态&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;git add .&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;添加所有修改到暂存区&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;git commit -m &quot;说明&quot;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;提交代码&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;git log --oneline&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;查看简洁提交历史&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;git branch&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;查看分支&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;git switch 分支名&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;切换分支&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;git switch -c 分支名&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;创建并切换分支&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;git merge 分支名&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;合并分支&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;git pull&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;拉取远程代码&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;git push&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;推送代码&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;git remote -v&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;查看远程仓库&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;git stash&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;临时保存修改&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;git stash pop&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;恢复临时保存的修改&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;git restore 文件名&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;撤销工作区修改&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;git revert 提交ID&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;安全撤销某次提交&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;我的 Git 使用建议&lt;/h2&gt;
&lt;h3&gt;提交前先看状态&lt;/h3&gt;
&lt;p&gt;每次提交前建议先执行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git status
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;确认哪些文件会被提交。&lt;/p&gt;
&lt;h3&gt;一次提交只做一件事&lt;/h3&gt;
&lt;p&gt;不要把很多无关修改放在同一个提交里。&lt;/p&gt;
&lt;p&gt;不推荐：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git commit -m &quot;改了一堆东西&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;推荐：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git commit -m &quot;feat: add login page&quot;
$ git commit -m &quot;fix: fix login error message&quot;
$ git commit -m &quot;docs: update usage guide&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;不要提交敏感信息&lt;/h3&gt;
&lt;p&gt;这些内容最好不要提交到仓库：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;密码&lt;/li&gt;
&lt;li&gt;Token&lt;/li&gt;
&lt;li&gt;API Key&lt;/li&gt;
&lt;li&gt;数据库连接地址&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.env&lt;/code&gt; 文件&lt;/li&gt;
&lt;li&gt;私钥文件&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果不小心提交了敏感信息，要及时删除并更换密钥。&lt;/p&gt;
&lt;h3&gt;团队协作时不要乱改历史&lt;/h3&gt;
&lt;p&gt;如果代码已经推送到远程仓库，不建议随便使用：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git reset --hard
$ git push --force
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这可能会影响其他人的提交历史。&lt;/p&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;Git 是开发者必须掌握的基础工具。&lt;/p&gt;
&lt;p&gt;刚开始学习时，不需要追求一次性记住所有命令。先掌握下面这几个就可以满足大多数日常需求：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ git status
$ git add .
$ git commit -m &quot;说明&quot;
$ git pull
$ git push
$ git branch
$ git switch
$ git merge
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;日常开发最常见的流程就是：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;修改代码 -&amp;gt; 添加暂存 -&amp;gt; 提交版本 -&amp;gt; 推送远程
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;等你熟悉基础操作之后，再去学习 &lt;code&gt;rebase&lt;/code&gt;、&lt;code&gt;tag&lt;/code&gt;、&lt;code&gt;cherry-pick&lt;/code&gt; 等进阶命令会更轻松。&lt;/p&gt;
&lt;p&gt;总之，Git 的核心目标就是：让代码修改有迹可循，让协作开发更加安全。✨&lt;/p&gt;
</content:encoded></item><item><title>🔔 如何使用「新文章通知」功能</title><link>https://runrunxka.xyz/posts/how-to-use-notification/</link><guid isPermaLink="true">https://runrunxka.xyz/posts/how-to-use-notification/</guid><description>介绍右下角小铃铛的使用方法——如何查看新文章、阅读更新差异、清除通知。</description><pubDate>Wed, 27 May 2026 18:30:00 GMT</pubDate><content:encoded>&lt;h2&gt;这是什么？&lt;/h2&gt;
&lt;p&gt;右下角的小铃铛 🔔 是本站的&lt;strong&gt;新文章通知&lt;/strong&gt;功能。它会自动检测博客是否有新文章发布或已有文章更新，并通过红点提醒你。&lt;/p&gt;
&lt;h2&gt;如何使用&lt;/h2&gt;
&lt;h3&gt;1. 发现新文章&lt;/h3&gt;
&lt;p&gt;当你访问博客时，铃铛会自动检查 RSS 订阅源。如果发现&lt;strong&gt;新发布&lt;/strong&gt;的文章或&lt;strong&gt;已更新&lt;/strong&gt;的文章：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;铃铛右上角出现&lt;strong&gt;红点&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;点击铃铛展开面板&lt;/li&gt;
&lt;li&gt;新文章带 &amp;lt;span style=&quot;background:#166534;color:#86efac;padding:1px 6px;border-radius:4px;font-size:12px&quot;&amp;gt;新文章&amp;lt;/span&amp;gt; 标签&lt;/li&gt;
&lt;li&gt;更新文章带 &amp;lt;span style=&quot;background:#1e3a5f;color:#93c5fd;padding:1px 6px;border-radius:4px;font-size:12px&quot;&amp;gt;更新&amp;lt;/span&amp;gt; 标签&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;2. 查看文章更新差异&lt;/h3&gt;
&lt;p&gt;如果某篇文章被&lt;strong&gt;修改过&lt;/strong&gt;（不是新发布），点击文章标题会跳转到带差异对比的页面，你可以看到文章修改前后的具体变化。&lt;/p&gt;
&lt;h3&gt;3. 清除通知&lt;/h3&gt;
&lt;p&gt;点击面板内的 🗑️ 图标即可清空通知。清空后铃铛会重置，直到下次有新文章发布才会再次提醒。&lt;/p&gt;
&lt;h3&gt;4. 没有更新时&lt;/h3&gt;
&lt;p&gt;如果近期没有新文章，点击铃铛会显示「暂无文章更新」以及上次检查的时间范围。&lt;/p&gt;
&lt;h2&gt;技术原理&lt;/h2&gt;
&lt;p&gt;铃铛通过读取博客的 RSS 订阅源（&lt;code&gt;/rss.xml&lt;/code&gt;）来获取文章列表，并将文章内容缓存到浏览器的 IndexedDB 中。每次访问页面时，对比缓存与最新 RSS 的差异来判断是否有新内容。&lt;/p&gt;
&lt;p&gt;这个功能完全在&lt;strong&gt;你本地浏览器&lt;/strong&gt;中运行，不会向服务器发送任何个人信息。&lt;/p&gt;
</content:encoded></item><item><title>从零部署 Fuwari 博客到阿里云服务器</title><link>https://runrunxka.xyz/posts/frist-blog/</link><guid isPermaLink="true">https://runrunxka.xyz/posts/frist-blog/</guid><description>完整记录 Fuwari Astro 博客从搭建、GitHub Actions 自动部署到阿里云 ECS、配置域名与自定义的全过程。</description><pubDate>Fri, 22 May 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;起因&lt;/h2&gt;
&lt;p&gt;一直想搭一个自己的博客，选了 Fuwari 这个 Astro 静态博客主题。服务器是阿里云 ECS（1.8G 内存），但是本地构建需要 7G+ 内存，服务器直接 &lt;code&gt;pnpm build&lt;/code&gt; 会 OOM。所以需要一套 GitHub Actions 自动构建 + 部署的流程。&lt;/p&gt;
&lt;h2&gt;环境一览&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;详情&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;博客框架&lt;/td&gt;
&lt;td&gt;&lt;a href=&quot;https://github.com/saicaca/fuwari&quot;&gt;Fuwari&lt;/a&gt; (Astro)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;代码托管&lt;/td&gt;
&lt;td&gt;GitHub (&lt;code&gt;RunRunxka/Fuwari&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;服务器&lt;/td&gt;
&lt;td&gt;阿里云 ECS，Alibaba Linux 8，IP &lt;code&gt;x.x.x.x&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;部署方式&lt;/td&gt;
&lt;td&gt;GitHub Actions 构建 → rsync 推送 → Python HTTP Server&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;访问地址&lt;/td&gt;
&lt;td&gt;&lt;code&gt;http://x.x.x.x:5544&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;第一步：服务器端准备&lt;/h2&gt;
&lt;h3&gt;安装 rsync&lt;/h3&gt;
&lt;p&gt;服务器默认没装 rsync，GitHub Actions 推送文件要用到：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;sudo yum install -y rsync
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;配置 SSH 密钥&lt;/h3&gt;
&lt;p&gt;让 GitHub Actions 能 SSH 到服务器：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ssh-keygen -t ed25519 -f ~/.ssh/github_actions -N &quot;&quot;
cat ~/.ssh/github_actions.pub &amp;gt;&amp;gt; ~/.ssh/authorized_keys
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;私钥 &lt;code&gt;~/.ssh/github_actions&lt;/code&gt; 的内容后面要填到 GitHub Secrets。&lt;/p&gt;
&lt;h2&gt;第二步：GitHub Actions 工作流&lt;/h2&gt;
&lt;p&gt;在仓库根目录创建 &lt;code&gt;.github/workflows/deploy.yml&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;name: Build &amp;amp; Deploy

on:
  push:
    branches: [main]
  workflow_dispatch:

jobs:
  build-and-deploy:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - uses: pnpm/action-setup@v4

      - uses: actions/setup-node@v4
        with:
          node-version: 22
          cache: pnpm

      - run: pnpm install --frozen-lockfile
      - run: pnpm build

      - name: Deploy to server
        uses: easingthemes/ssh-deploy@v6.0.3
        with:
          SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
          ARGS: &quot;-rlgoDzvc --delete&quot;
          SOURCE: &quot;dist/&quot;
          REMOTE_HOST: ${{ secrets.REMOTE_HOST }}
          REMOTE_USER: ${{ secrets.REMOTE_USER }}
          TARGET: &quot;/home/admin/blog&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;设置 GitHub Secrets&lt;/h3&gt;
&lt;p&gt;去仓库 &lt;code&gt;Settings → Secrets and variables → Actions&lt;/code&gt;，新建三个：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;SSH_PRIVATE_KEY&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;~/.ssh/github_actions&lt;/code&gt; 私钥内容&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;REMOTE_HOST&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;x.x.x.x&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;REMOTE_USER&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;admin&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;第三步：启动静态文件服务&lt;/h2&gt;
&lt;p&gt;构建好的文件在 &lt;code&gt;/home/admin/blog/&lt;/code&gt;，用 Python 起个 HTTP 服务：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd /home/admin/blog &amp;amp;&amp;amp; python3 -m http.server 5544 --bind 0.0.0.0 &amp;amp;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;踩坑：80 端口被 nginx 占用&lt;/h3&gt;
&lt;p&gt;阿里云 ECS 默认装了 nginx 占着 80 端口。本来想用 80 方便直接 IP 访问，结果访问显示 nginx 欢迎页。改成 5544 端口解决。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;注意：每次加新端口都要去阿里云安全组放行！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;第四步：自定义博客&lt;/h2&gt;
&lt;h3&gt;修改站点配置&lt;/h3&gt;
&lt;p&gt;编辑 &lt;code&gt;src/config.ts&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;export const siteConfig: SiteConfig = {
  title: &quot;你的博客名&quot;,
  subtitle: &quot;副标题&quot;,
  lang: &quot;zh_CN&quot;,
  // ...
};
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;修改头像和个人信息&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;export const profileConfig: ProfileConfig = {
  avatar: &quot;/touxiang.png&quot;,  // 放 public/ 下避免哈希
  name: &quot;你的名字&quot;,
  bio: &quot;个人简介&quot;,
  links: [
    { name: &quot;GitHub&quot;, icon: &quot;fa6-brands:github&quot;, url: &quot;https://github.com/xxx&quot; },
  ],
};
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;踩坑：头像加载不出&lt;/h3&gt;
&lt;p&gt;原来路径写 &lt;code&gt;assets/images/touxiang.png&lt;/code&gt;，构建时 Astro 会将其哈希重命名为 &lt;code&gt;_astro/touxiang.XXXX.png&lt;/code&gt;，但页面仍引用原路径导致 404。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;两种解法：&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;移到 &lt;code&gt;public/&lt;/code&gt; 目录，路径写 &lt;code&gt;/touxiang.png&lt;/code&gt;（不会被哈希）&lt;/li&gt;
&lt;li&gt;在 &lt;code&gt;config.ts&lt;/code&gt; 里用 &lt;code&gt;import&lt;/code&gt; 引入，然后添加 &lt;code&gt;env.d.ts&lt;/code&gt; 类型声明&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;创建文章&lt;/h3&gt;
&lt;p&gt;直接在 &lt;code&gt;src/content/posts/&lt;/code&gt; 下建文件夹：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;src/content/posts/
├── my-post/
│   ├── index.md
│   └── cover.jpg
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;index.md&lt;/code&gt; 示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---
title: 文章标题
published: 2026-05-22
description: 简介
image: ./cover.jpg
tags: [标签1, 标签2]
category: 分类
draft: false
---

正文内容...
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;第五步：域名（可选）&lt;/h2&gt;
&lt;p&gt;买了域名 &lt;code&gt;runrunxka.xyz&lt;/code&gt;，去阿里云云解析加两条 A 记录：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;主机记录&lt;/th&gt;
&lt;th&gt;记录类型&lt;/th&gt;
&lt;th&gt;记录值&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;@&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;&lt;code&gt;x.x.x.x&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;www&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;&lt;code&gt;x.x.x.x&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;但国内服务器用域名需要 ICP 备案，否则访问被拦截提示 &lt;code&gt;Non-compliance ICP Filing&lt;/code&gt;。暂时用 IP:端口方式访问。&lt;/p&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;现在每次写完文章或改配置，只需要：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git add . &amp;amp;&amp;amp; git commit -m &quot;更新&quot; &amp;amp;&amp;amp; git push
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;GitHub Actions 自动构建并推送到服务器，一分钟内生效。全程不用碰服务器。&lt;/p&gt;
&lt;p&gt;整个流程踩了几个坑：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;easingthemes/ssh-deploy&lt;/code&gt; 要用 &lt;code&gt;@v6.0.3&lt;/code&gt;，&lt;code&gt;@v5&lt;/code&gt; 不存在&lt;/li&gt;
&lt;li&gt;服务器必须先装 rsync&lt;/li&gt;
&lt;li&gt;头像路径别用 &lt;code&gt;src/assets/&lt;/code&gt;，用 &lt;code&gt;public/&lt;/code&gt; 或 import&lt;/li&gt;
&lt;li&gt;国内服务器域名要备案&lt;/li&gt;
&lt;li&gt;别用 80 端口，ECS 默认 nginx 占着&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;希望对同样折腾 Fuwari 的朋友有帮助 🚀
&amp;lt;h2&amp;gt;第一步：服务器端准备&amp;lt;/h2&amp;gt;
&amp;lt;h3&amp;gt;安装 rsync&amp;lt;/h3&amp;gt;
&amp;lt;p&amp;gt;服务器默认没装 rsync，GitHub Actions 推送文件要用到：&amp;lt;/p&amp;gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;sudo yum install -y rsync
&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;
&amp;lt;h3&amp;gt;配置 SSH 密钥&amp;lt;/h3&amp;gt;
&amp;lt;p&amp;gt;让 GitHub Actions 能 SSH 到服务器：&amp;lt;/p&amp;gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;ssh-keygen -t ed25519 -f ~/.ssh/github_actions -N &quot;&quot;
cat ~/.ssh/github_actions.pub &amp;gt;&amp;gt; ~/.ssh/authorized_keys
&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;
&amp;lt;p&amp;gt;私钥 &amp;lt;code&amp;gt;~/.ssh/github_actions&amp;lt;/code&amp;gt; 的内容后面要填到 GitHub Secrets。&amp;lt;/p&amp;gt;
&amp;lt;h2&amp;gt;第二步：GitHub Actions 工作流&amp;lt;/h2&amp;gt;
&amp;lt;p&amp;gt;在仓库根目录创建 &amp;lt;code&amp;gt;.github/workflows/deploy.yml&amp;lt;/code&amp;gt;：&amp;lt;/p&amp;gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;name: Build &amp;amp; Deploy&lt;/p&gt;
&lt;p&gt;on:
push:
branches: [main]
workflow_dispatch:&lt;/p&gt;
&lt;p&gt;jobs:
build-and-deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;  - uses: pnpm/action-setup@v4

  - uses: actions/setup-node@v4
    with:
      node-version: 22
      cache: pnpm

  - run: pnpm install --frozen-lockfile
  - run: pnpm build

  - name: Deploy to server
    uses: easingthemes/ssh-deploy@v6.0.3
    with:
      SSH_PRIVATE_KEY: ${{ secrets.SSH_PRIVATE_KEY }}
      ARGS: &amp;amp;#34;-rlgoDzvc --delete&amp;amp;#34;
      SOURCE: &amp;amp;#34;dist/&amp;amp;#34;
      REMOTE_HOST: ${{ secrets.REMOTE_HOST }}
      REMOTE_USER: ${{ secrets.REMOTE_USER }}
      TARGET: &amp;amp;#34;/home/admin/blog&amp;amp;#34;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;
&amp;lt;h3&amp;gt;设置 GitHub Secrets&amp;lt;/h3&amp;gt;
&amp;lt;p&amp;gt;去仓库 &amp;lt;code&amp;gt;Settings → Secrets and variables → Actions&amp;lt;/code&amp;gt;，新建三个：&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;| Name | Value |
|---|---|
| &amp;lt;code&amp;gt;SSH_PRIVATE_KEY&amp;lt;/code&amp;gt; | &amp;lt;code&amp;gt;~/.ssh/github_actions&amp;lt;/code&amp;gt; 私钥内容 |
| &amp;lt;code&amp;gt;REMOTE_HOST&amp;lt;/code&amp;gt; | &amp;lt;code&amp;gt;x.x.x.x&amp;lt;/code&amp;gt; |
| &amp;lt;code&amp;gt;REMOTE_USER&amp;lt;/code&amp;gt; | &amp;lt;code&amp;gt;admin&amp;lt;/code&amp;gt; |&amp;lt;/p&amp;gt;
&amp;lt;h2&amp;gt;第三步：启动静态文件服务&amp;lt;/h2&amp;gt;
&amp;lt;p&amp;gt;构建好的文件在 &amp;lt;code&amp;gt;/home/admin/blog/&amp;lt;/code&amp;gt;，用 Python 起个 HTTP 服务：&amp;lt;/p&amp;gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;cd /home/admin/blog &amp;amp;&amp;amp; python3 -m http.server 5544 --bind 0.0.0.0 &amp;amp;
&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;
&amp;lt;h3&amp;gt;踩坑：80 端口被 nginx 占用&amp;lt;/h3&amp;gt;
&amp;lt;p&amp;gt;阿里云 ECS 默认装了 nginx 占着 80 端口。本来想用 80 方便直接 IP 访问，结果访问显示 nginx 欢迎页。改成 5544 端口解决。&amp;lt;/p&amp;gt;
&amp;lt;blockquote&amp;gt;
&amp;lt;p&amp;gt;注意：每次加新端口都要去阿里云安全组放行！&amp;lt;/p&amp;gt;
&amp;lt;/blockquote&amp;gt;
&amp;lt;h2&amp;gt;第四步：自定义博客&amp;lt;/h2&amp;gt;
&amp;lt;h3&amp;gt;修改站点配置&amp;lt;/h3&amp;gt;
&amp;lt;p&amp;gt;编辑 &amp;lt;code&amp;gt;src/config.ts&amp;lt;/code&amp;gt;：&amp;lt;/p&amp;gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;export const siteConfig: SiteConfig = {
title: &quot;你的博客名&quot;,
subtitle: &quot;副标题&quot;,
lang: &quot;zh_CN&quot;,
// ...
};
&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;
&amp;lt;h3&amp;gt;修改头像和个人信息&amp;lt;/h3&amp;gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;export const profileConfig: ProfileConfig = {
avatar: &quot;/touxiang.png&quot;,  // 放 public/ 下避免哈希
name: &quot;你的名字&quot;,
bio: &quot;个人简介&quot;,
links: [
{ name: &quot;GitHub&quot;, icon: &quot;fa6-brands:github&quot;, url: &quot;https://github.com/xxx&quot; },
],
};
&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;
&amp;lt;h3&amp;gt;踩坑：头像加载不出&amp;lt;/h3&amp;gt;
&amp;lt;p&amp;gt;原来路径写 &amp;lt;code&amp;gt;assets/images/touxiang.png&amp;lt;/code&amp;gt;，构建时 Astro 会将其哈希重命名为 &amp;lt;code&amp;gt;_astro/touxiang.XXXX.png&amp;lt;/code&amp;gt;，但页面仍引用原路径导致 404。&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;&amp;lt;strong&amp;gt;两种解法：&amp;lt;/strong&amp;gt;&amp;lt;/p&amp;gt;
&amp;lt;ol&amp;gt;
&amp;lt;li&amp;gt;移到 &amp;lt;code&amp;gt;public/&amp;lt;/code&amp;gt; 目录，路径写 &amp;lt;code&amp;gt;/touxiang.png&amp;lt;/code&amp;gt;（不会被哈希）&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;在 &amp;lt;code&amp;gt;config.ts&amp;lt;/code&amp;gt; 里用 &amp;lt;code&amp;gt;import&amp;lt;/code&amp;gt; 引入，然后添加 &amp;lt;code&amp;gt;env.d.ts&amp;lt;/code&amp;gt; 类型声明&amp;lt;/li&amp;gt;
&amp;lt;/ol&amp;gt;
&amp;lt;h3&amp;gt;创建文章&amp;lt;/h3&amp;gt;
&amp;lt;p&amp;gt;直接在 &amp;lt;code&amp;gt;src/content/posts/&amp;lt;/code&amp;gt; 下建文件夹：&amp;lt;/p&amp;gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;src/content/posts/
├── my-post/
│   ├── index.md
│   └── cover.jpg
&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;
&amp;lt;p&amp;gt;&amp;lt;code&amp;gt;index.md&amp;lt;/code&amp;gt; 示例：&amp;lt;/p&amp;gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;---
title: 文章标题
published: 2026-05-22
description: 简介
image: ./cover.jpg
tags: [标签1, 标签2]
category: 分类
draft: false&lt;/h2&gt;
&lt;p&gt;正文内容...
&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;
&amp;lt;h2&amp;gt;第五步：域名（可选）&amp;lt;/h2&amp;gt;
&amp;lt;p&amp;gt;买了域名 &amp;lt;code&amp;gt;runrunxka.xyz&amp;lt;/code&amp;gt;，去阿里云云解析加两条 A 记录：&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;| 主机记录 | 记录类型 | 记录值 |
|---|---|---|
| &amp;lt;code&amp;gt;@&amp;lt;/code&amp;gt; | A | &amp;lt;code&amp;gt;x.x.x.x&amp;lt;/code&amp;gt; |
| &amp;lt;code&amp;gt;www&amp;lt;/code&amp;gt; | A | &amp;lt;code&amp;gt;x.x.x.x&amp;lt;/code&amp;gt; |&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;但国内服务器用域名需要 ICP 备案，否则访问被拦截提示 &amp;lt;code&amp;gt;Non-compliance ICP Filing&amp;lt;/code&amp;gt;。暂时用 IP:端口方式访问。&amp;lt;/p&amp;gt;
&amp;lt;h2&amp;gt;总结&amp;lt;/h2&amp;gt;
&amp;lt;p&amp;gt;现在每次写完文章或改配置，只需要：&amp;lt;/p&amp;gt;
&amp;lt;pre&amp;gt;&amp;lt;code&amp;gt;git add . &amp;amp;&amp;amp; git commit -m &quot;更新&quot; &amp;amp;&amp;amp; git push
&amp;lt;/code&amp;gt;&amp;lt;/pre&amp;gt;
&amp;lt;p&amp;gt;GitHub Actions 自动构建并推送到服务器，一分钟内生效。全程不用碰服务器。&amp;lt;/p&amp;gt;
&amp;lt;p&amp;gt;整个流程踩了几个坑：&amp;lt;/p&amp;gt;
&amp;lt;ol&amp;gt;
&amp;lt;li&amp;gt;&amp;lt;code&amp;gt;easingthemes/ssh-deploy&amp;lt;/code&amp;gt; 要用 &amp;lt;code&amp;gt;@v6.0.3&amp;lt;/code&amp;gt;，&amp;lt;code&amp;gt;@v5&amp;lt;/code&amp;gt; 不存在&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;服务器必须先装 rsync&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;头像路径别用 &amp;lt;code&amp;gt;src/assets/&amp;lt;/code&amp;gt;，用 &amp;lt;code&amp;gt;public/&amp;lt;/code&amp;gt; 或 import&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;国内服务器域名要备案&amp;lt;/li&amp;gt;
&amp;lt;li&amp;gt;别用 80 端口，ECS 默认 nginx 占着&amp;lt;/li&amp;gt;
&amp;lt;/ol&amp;gt;
&amp;lt;p&amp;gt;希望对同样折腾 Fuwari 的朋友有帮助 🚀&amp;lt;/p&amp;gt;&lt;/p&gt;
</content:encoded></item></channel></rss>