从零开始:用 GitHub 搭建并自动发布个人博客
这篇文章会带你从零开始,用 GitHub 免费搭建一个属于自己的博客,并且做到:
你只负责写 Markdown 文档,GitHub 自动帮你编译、自动帮你发布成网页。
不需要服务器、不需要买主机、不需要备案,全过程免费。跟着做完大约 30 分钟。
本站(你现在看到的这个网站)就是用下面这套方案搭起来的,可以对照参考:https://github.com/cadywang/cadywang.github.io
一、先搞懂原理(30 秒)
静态博客的本质是:把 Markdown 文件「编译」成 HTML 网页,再托管起来。
| 角色 | 用什么 | 干什么 |
|---|---|---|
| 生成器 | Hexo | 把 Markdown 编译成静态网页 |
| 主题 | Butterfly | 决定页面长什么样 |
| 编译工人 | GitHub Actions | 你提交代码后,自动跑编译 |
| 托管 | GitHub Pages | 免费托管控好的网页 |
整体流程:
1 | 你提交 Markdown |
所以你以后唯一要做的事,就是往 source/_posts/ 目录里丢 Markdown 文件。
二、准备工作
- 一个 GitHub 账号(没有就先去 https://github.com/signup 注册)
- 想本地预览再装:Node.js 18+ 和 Git(不装也完全能做完,纯网页操作即可)
三、第一步:创建仓库
Repository name 填
<你的用户名>.github.io例如用户名是
cadywang,就填cadywang.github.io。
⚠️ 名字必须严格是「你的用户名.github.io」,这样网址才是https://你的用户名.github.io,否则地址会变成https://你的用户名.github.io/仓库名/,还得额外配一个root参数。可见性选择 Public
免费账号只能给「公开仓库」开启 Pages,所以这里必须选 Public(代码是公开的,介意的话可以只放博客,不放敏感内容)。
不要勾选
Add a README file、.gitignore、license,保持一个空仓库。点 Create repository。
四、第二步:创建 5 个文件(纯网页操作)
创建好后你会看到一个空仓库页面。接下来依次创建下面 5 个文件:
小技巧:在文件名输入框里直接输入带斜杠的完整路径(如
.github/workflows/deploy.yml),GitHub 会自动帮你创建目录。
新建文件:仓库页 → Add file → Create new file;写完拉到底 → Commit changes。
4.1 package.json
告诉 GitHub 编译时需要装哪些依赖。
1 | { |
4.2 _config.yml
站点配置。注意把 url 改成你自己的地址!
1 | # ===== 站点信息 ===== |
4.3 .gitignore
避免把依赖和编译产物提交上去。
1 | .DS_Store |
4.4 .github/workflows/deploy.yml ⭐ 最关键
这是「自动编译 + 自动发布」的流水线,文件名和路径都不能错。
1 | name: Deploy Blog |
注意:这里用的是
npm install(不依赖 lock 文件)。
如果你以后提交了package-lock.json,可以改成npm ci并把上面的setup-node加上cache: npm,速度更快、版本更固定。
4.5 source/_posts/hello-world.md
你的第一篇文章,顺便验证流水线是否正常。
1 | --- |
创建完成后,你的仓库结构应该是这样:
1 | . |
五、第三步:开启 GitHub Pages
- 进入仓库的 Settings(顶部菜单)
- 左侧找到 Pages
- 在 Build and deployment → Source 的下拉框里选择 GitHub Actions
这一步很关键:不选它,流水线最后一步会报错
Get Pages site failed。
六、第四步:等待自动构建并访问
- 回到仓库,点顶部 Actions 标签
- 你会看到一条名为 Deploy Blog 的任务,状态先是 🟡 进行中,大约 1~2 分钟后变成 ✅ 绿色
- 点进去可以看到每一步的日志;点开
deploy那一步会显示最终网址 - 浏览器打开
https://你的用户名.github.io—— 你的博客上线了!
如果失败了怎么办
| 报错 / 现象 | 原因与解决办法 |
|---|---|
Get Pages site failed |
第五步没做,去 Settings → Pages 把 Source 选成 GitHub Actions,然后在 Actions 页面点 Re-run all jobs |
npm install 报错 |
检查 package.json 内容是否完整(JSON 不能有多余逗号) |
| 流水线根本没跑 | 确认存储库默认分支是 main(Settings → General → Default branch);如果你的是 master,把 deploy.yml 里的 main 改成 master |
| 页面打开是 404 | 等 1~2 分钟再刷新;或确认 Actions 是 ✅ 不是 ❌ |
| 页面样式全丢 | 检查 _config.yml 的 url 是否写对(必须是 https://用户名.github.io,结尾不要加斜杠) |
七、第五步:以后怎么发文章(日常操作)
这是你以后 99% 时间用到的部分,非常简单:
打开
source/_posts/目录 → Add file → Create new file文件名写
my-post.md(建议用英文或拼音,它会成为文章网址的一部分)内容照抄这个模板:
1
2
3
4
5
6
7
8---
title: 文章标题
date: 2026-10-14 10:00:00
tags: [标签A, 标签B]
categories: [分类名]
---
正文,正常写 Markdown 就行。拉到底部点 Commit changes
等 1~2 分钟,刷新网站就能看到新文章
front-matter(两行 --- 之间的部分)说明
| 字段 | 必填 | 说明 |
|---|---|---|
title |
✅ | 文章标题 |
date |
✅ | 发布时间,决定排序,越新越靠前 |
tags |
❌ | 标签,可写多个:tags: [GitHub, 教程] |
categories |
❌ | 分类,建议只写一个 |
sticky |
❌ | 写 sticky: 1 会把文章置顶 |
top_img |
❌ | 文章顶部大图,写 false 表示不要 |
- 修改文章:点开文件 → 右上角铅笔图标 → 改完提交
- 删除文章:点开文件 → 右上角垃圾桶图标 → 提交
八、进阶一:本地预览(可选)
如果希望在提交前先看看效果,可以装 Node.js 18+ 和 Git,然后:
1 | git clone https://github.com/你的用户名/你的用户名.github.io.git |
浏览器打开 http://localhost:4000 即可,按 Ctrl + C 停止。
其他常用命令:
1 | npm run new -- "我的新文章" # 按模板新建文章(自动带上 front-matter) |
⚠️ 版本提示:Hexo 8 要求 Node.js ≥ 20.19。所以本教程固定使用 Hexo 7.x,Node 18 也能正常编译;如果你的 Node 是 20+,也可以把
package.json里的hexo升到^8.0.0。
九、进阶二:定制主题
主题自带的默认样式就能用,想改外观时,把主题的默认配置复制一份放到仓库根目录,命名为 _config.butterfly.yml:
- 本地方式:
cp node_modules/hexo-theme-butterfly/_config.yml _config.butterfly.yml - 网页方式:从 主题仓库 复制内容,新建文件
_config.butterfly.yml粘贴
然后按需修改(下面是最常用的一段,可以只写这部分,其余用默认值):
1 | # 导航菜单 |
用本地搜索还需要在 _config.yml 末尾加:
1 | search: |
并在 package.json 的 dependencies 里加上 "hexo-generator-searchdb": "^1.5.0",。
加一个「关于」页面
新建 source/about/index.md:
1 | --- |
开启评论(giscus)
完整步骤(包含两个 ID 的获取方式和 giscus App 的安装)见《给 Hexo 博客接入 giscus 评论系统》。
- 到 https://giscus.app/zh-CN 按提示配置(它会引导你给仓库开启 Discussions,并生成
repo_id、category_id) - 在
_config.butterfly.yml里加:
1 | comments: |
十、进阶三:绑定自己的域名
- 在域名服务商处购买域名(阿里云、腾讯云、Namecheap 等都可以)
- 到域名商后台添加一条 CNAME 记录:
- 主机记录:
blog(代表blog.你的域名.com) - 记录值:
你的用户名.github.io
- 主机记录:
- 回到 GitHub 仓库 → Settings → Pages → Custom domain,填入
blog.你的域名.com,点 Save - 等 DNS 生效(几分钟到几小时),再回到这个页面勾选 Enforce HTTPS,GitHub 会自动签发免费证书
设置自定义域名后,访问原来的
你的用户名.github.io也会自动跳转到新域名。
十一、常见问题
Q1:GitHub Pages 在中国大陆访问很慢 / 时好时坏?
这是常见现象。可以:① 绑定自己的域名(通常更稳);② 使用 Cloudflare 做代理加速;③ 或者把同样的代码部署到 Cloudflare Pages / Vercel,它们也支持直接连接 GitHub 仓库自动构建。
Q2:如何让构建更快、版本更稳定?
在本地跑一次 npm install,会生成 package-lock.json,把它提交到仓库,然后把工作流里的 npm install 改成 npm ci,并在 setup-node 下加 cache: npm。
Q3:文章网址里的中文变成了一串 %E4%BD%A0...?
把 Markdown 文件名改成英文或拼音即可,标题可以照旧用中文。
Q4:想换主题?npm install hexo-theme-xxx,把 _config.yml 的 theme 改成对应主题名;主题配置放在 _config.主题名.yml。
Q5:仓库可以设成私有吗?
免费账号的 GitHub Pages 只支持公开仓库;想让源码私有,需要升级到 GitHub Pro。
Q6:提交后网站一直没变?
去 Actions 标签看流水线状态:黄色=正在跑,红色=失败(点进去看日志),绿色=成功。成功但仍看不到变化时,浏览器按 Ctrl + F5 强制刷新。
十二、总结
回顾一下,整套方案只有几个关键点:
- 仓库名必须是
<用户名>.github.io,且为 Public; - 5 个文件:
package.json、_config.yml、.gitignore、.github/workflows/deploy.yml、至少一篇文章; - Settings → Pages → Source 选 GitHub Actions;
- 以后只需要往
source/_posts/里放 Markdown,其余交给 GitHub。
现在,去写你的第一篇正式文章吧 🚀