<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <author>
    <name>Serein0321</name>
  </author>
  <generator uri="https://hexo.io/">Hexo</generator>
  <id>https://serein0321.github.io/</id>
  <link href="https://serein0321.github.io/" rel="alternate"/>
  <link href="https://serein0321.github.io/atom.xml" rel="self"/>
  <rights>All rights reserved 2026, Serein0321</rights>
  <subtitle>技术博客</subtitle>
  <title>Serein0321's Blog</title>
  <updated>2026-10-13T09:31:01.481Z</updated>
  <entry>
    <author>
      <name>Serein0321</name>
    </author>
    <category term="教程" scheme="https://serein0321.github.io/categories/%E6%95%99%E7%A8%8B/"/>
    <category term="github" scheme="https://serein0321.github.io/tags/github/"/>
    <content>
      <![CDATA[<p>从创建仓库开始，学会提交代码、使用分支、合并 PR，再学习和别人合作开发。</p><span id="more"></span><h1 id="个人使用-GitHub-进行开发教程"><a href="#个人使用-GitHub-进行开发教程" class="headerlink" title="个人使用 GitHub 进行开发教程"></a>个人使用 GitHub 进行开发教程</h1><h2 id="先认识几个词"><a href="#先认识几个词" class="headerlink" title="先认识几个词"></a>先认识几个词</h2><div class="table-container"><table><thead><tr><th>名称</th><th>一句话解释</th></tr></thead><tbody><tr><td>Repository</td><td>保存项目文件和修改历史的仓库。</td></tr><tr><td>Clone</td><td>把远程仓库和历史克隆到电脑。</td></tr><tr><td>Branch</td><td>指向某次提交的可移动标签，用来分开开发。</td></tr><tr><td>Commit</td><td>将暂存区的修改保存为一次本地提交。</td></tr><tr><td>Push</td><td>把本地提交上传到远程仓库。</td></tr><tr><td>Fetch</td><td>获取远程更新，暂时不合并到当前分支。</td></tr><tr><td>Pull</td><td>获取远程更新，再整合进当前分支。</td></tr><tr><td>Pull Request（PR）</td><td>提出修改，请求把一个分支合并到另一个分支。</td></tr><tr><td>Merge</td><td>把一个分支的修改合并进当前分支。</td></tr><tr><td>Fork</td><td>在自己的 GitHub 账号下创建别人的仓库副本。</td></tr></tbody></table></div><p><code>git pull</code> 是拉取远程更新，Pull Request 是请求合并，两者不是同一个操作。</p><h2 id="一、创建仓库"><a href="#一、创建仓库" class="headerlink" title="一、创建仓库"></a>一、创建仓库</h2><p>打开 GitHub，点击右上角的 <code>+ → New repository</code>，填写仓库名称，例如 <code>learn-github</code>。</p><p>选择 Public 或 Private，勾选 README，再点击 <code>Create repository</code>。</p><p>勾选 README 后，仓库就有了第一条提交，方便后面克隆和创建分支。</p><img src="/2026/10/12/%E4%B8%AA%E4%BA%BA%E5%BC%80%E5%8F%91%EF%BC%9Agithub%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/82ee9946-e3dd-44de-931b-cc27f65f437c.png" class="" title="创建仓库演示图"><h2 id="二、Clone-到本地"><a href="#二、Clone-到本地" class="headerlink" title="二、Clone 到本地"></a>二、Clone 到本地</h2><p>在电脑的任意位置打开终端，输入</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git clone 仓库地址</span><br></pre></td></tr></table></figure><p>即可将项目克隆到本地</p><p>之后进入到项目文件夹对应的终端</p><h2 id="三、修改项目内容"><a href="#三、修改项目内容" class="headerlink" title="三、修改项目内容"></a>三、修改项目内容</h2><p>打开README.md后添加一波新的东西。然后执行以下命令可以查看分支、有哪些改动？改动提交到待提交区了没有？</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git status</span><br></pre></td></tr></table></figure><p>如果想查看具体发生了什么修改，可以执行以下命令进行查看</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git diff</span><br></pre></td></tr></table></figure><h2 id="四、把文件放到暂存区"><a href="#四、把文件放到暂存区" class="headerlink" title="四、把文件放到暂存区"></a>四、把文件放到暂存区</h2><p>暂存区就是“这次准备提交的修改”，执行：</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git add README.md</span><br></pre></td></tr></table></figure><p>再次检查状态和即将提交的内容：</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git status</span><br><span class="line">git <span class="built_in">diff</span> <span class="literal">--staged</span></span><br></pre></td></tr></table></figure><p><code>Changes to be committed</code> 表示修改已暂存，尚未创建 Commit。</p><p><code>git diff</code> 看尚未暂存的改动，<code>git diff --staged</code> 看已经暂存的改动。</p><img src="/2026/10/12/%E4%B8%AA%E4%BA%BA%E5%BC%80%E5%8F%91%EF%BC%9Agithub%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/3b3dfbb7-77e3-438c-a8ea-79928d76ec62.png" class="" title="图示"><p>如图所示git diff就是<code>本次工作区文件夹的更改</code> 和 <code>暂存区里的结果</code>比较</p><p>git diff —staged 就是<code>暂存区结果</code> 和 <code>最新一次提交的结果</code>进行比较</p><h2 id="五、提交、上传分支"><a href="#五、提交、上传分支" class="headerlink" title="五、提交、上传分支"></a>五、提交、上传分支</h2><p>想要把对当前分支的修改提交到github上去，首先得存档</p><p>存档就是把待提交区的修改成品附上commit说明后存入档，算作一次提交</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git commit -m &quot;更新了README，新增了关于xxxxx的内容&quot;</span><br></pre></td></tr></table></figure><p>提交后，可以通过以下命令查看提交记录，-5就是之查看5条记录</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git log --oneline -5</span><br></pre></td></tr></table></figure><p>然后就是通过以下命令将本次提交上传到github官网上去</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">git push -u origin main</span><br><span class="line"></span><br><span class="line">其中：</span><br><span class="line">- push：上传本地提交。</span><br><span class="line">- origin：克隆下来的 GitHub 仓库简称。</span><br><span class="line">- main：要上传的分支。</span><br><span class="line">- -u：记住本地分支和远程分支的对应关系。</span><br></pre></td></tr></table></figure><h2 id="六、创建自己的分支"><a href="#六、创建自己的分支" class="headerlink" title="六、创建自己的分支"></a>六、创建自己的分支</h2><p>分支让新功能和稳定版本分开，开发完成后再合并回 <code>main</code>。</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">main                       稳定版本</span><br><span class="line">└─ feature/add-study-notes  新功能</span><br></pre></td></tr></table></figure><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git <span class="keyword">switch</span> <span class="literal">-c</span> feature/<span class="built_in">add-study</span><span class="literal">-notes</span></span><br><span class="line">git branch</span><br></pre></td></tr></table></figure><p><code>git switch -c</code> 同时创建并切换分支，<code>git branch</code> 前面的 <code>*</code> 表示当前分支。</p><img src="/2026/10/12/%E4%B8%AA%E4%BA%BA%E5%BC%80%E5%8F%91%EF%BC%9Agithub%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/30c6d654-f226-430f-a97e-733d08734d93.png" class="" title="创建新分支示意图"><p>新分支刚创建时和主分支指向同一条提交；创建新的 Commit 后，两条分支才会出现不同内容。</p><h2 id="七、在功能分支开发并上传"><a href="#七、在功能分支开发并上传" class="headerlink" title="七、在功能分支开发并上传"></a>七、在功能分支开发并上传</h2><p>创建新文件或修改，写几条学习记录并保存：</p><p>检查、暂存、提交，再上传功能分支：</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">git status</span><br><span class="line">git add .</span><br><span class="line">git commit <span class="literal">-m</span> <span class="string">&quot;新分支第一次提交的描述&quot;</span></span><br><span class="line">git push <span class="literal">-u</span> origin feature/<span class="built_in">add-study</span><span class="literal">-notes</span></span><br></pre></td></tr></table></figure><p>推送功能分支不等于合并主分支，此时 GitHub 的 <code>main</code> 仍然没有这次修改。</p><p>提交后可以切换分支观察文件变化：</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git <span class="keyword">switch</span> main</span><br><span class="line">git <span class="keyword">switch</span> feature/<span class="built_in">add-study</span><span class="literal">-notes</span></span><br></pre></td></tr></table></figure><p>本例中，新的修改在主分支消失、在功能分支出现，因为它只提交在功能分支中。</p><img src="/2026/10/12/%E4%B8%AA%E4%BA%BA%E5%BC%80%E5%8F%91%EF%BC%9Agithub%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/006a2e3a-b50d-49be-8a51-4b5708c3f346.png" class="" title="分支提交后的示意图"><p>如图所示如果在新分支和主分支都进行了提交，就会进行分叉。通过log命令查看提交历史</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">#查看当前分支的一条线提交历史</span><br><span class="line">git log --oneline --decorate -10</span><br><span class="line"></span><br><span class="line">#查看所有分支的一条线提交历史</span><br><span class="line">git log --oneline --decorate --all</span><br><span class="line"></span><br><span class="line">#查看图形化的分叉式的提交历史</span><br><span class="line">git log --oneline --graph --decorate --all</span><br></pre></td></tr></table></figure><p>下一步有两种选择：第八节在本地合并，第九节在 GitHub 上用 PR 合并；练习同一个功能时选一种即可。</p><h2 id="八、在本地合并分支"><a href="#八、在本地合并分支" class="headerlink" title="八、在本地合并分支"></a>八、在本地合并分支</h2><p>先切换到接收修改的 <code>main</code>，更新后再合并功能分支：</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git <span class="keyword">switch</span> main</span><br><span class="line">git merge feature/<span class="built_in">add-study</span><span class="literal">-notes</span></span><br></pre></td></tr></table></figure><p><code>git merge</code> 合并到当前分支，所以要先切换到 <code>main</code>，不能把方向弄反。</p><p>如果显示 <code>Fast-forward</code>，表示主分支只需向前移动，就能包含功能分支的提交。</p><p>如果两个分支都产生了新提交，Git 可能创建一个 Merge Commit，也可能要求先解决冲突。</p><p>完成合并后，检查文件、运行项目需要的测试，再上传主分支：</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">git status</span><br><span class="line">git log <span class="literal">--oneline</span> <span class="literal">--decorate</span> <span class="literal">--graph</span> <span class="literal">--all</span> <span class="literal">-10</span></span><br><span class="line">git push origin main</span><br></pre></td></tr></table></figure><p>本地 Merge 不会自动更新 GitHub，需要再执行 Push。合并规则参见 <a href="https://git-scm.com/docs/git-merge">Git 合并说明</a>。</p><h2 id="九、使用-Pull-Request-合并分支"><a href="#九、使用-Pull-Request-合并分支" class="headerlink" title="九、使用 Pull Request 合并分支"></a>九、使用 Pull Request 合并分支</h2><p>PR 是“请把我的功能分支合并进主分支”，它会保留修改说明、讨论和检查记录。</p><p>即使只有一个账号，也可以自己创建 PR、检查修改并合并；自己的 PR 不能给自己提交 Approve 审查。</p><p>本节假设第七节的功能分支已经推送，但还没有按第八节合并。</p><h3 id="创建-PR"><a href="#创建-PR" class="headerlink" title="创建 PR"></a>创建 PR</h3><p>打开 GitHub 仓库，点击 <code>Compare &amp; pull request</code>；没有提示时，进入 <code>Pull requests → New pull request</code>。</p><p>确认合并方向：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">base: main  ←  compare: feature/add-study-notes</span><br></pre></td></tr></table></figure><p><code>base</code> 接收修改，<code>compare</code> 提供修改，不要选反。</p><p>填写标题和说明，再点击 <code>Create pull request</code>；还没写完时，可以创建 Draft PR。</p><p>说明写清两件事即可：改了什么，以及检查了什么；没运行测试就不要写“测试通过”。</p><h3 id="检查-PR"><a href="#检查-PR" class="headerlink" title="检查 PR"></a>检查 PR</h3><div class="table-container"><table><thead><tr><th>页面</th><th>查看什么</th></tr></thead><tbody><tr><td>Conversation</td><td>修改说明、讨论和审查结果。</td></tr><tr><td>Commits</td><td>这次 PR 包含哪些提交。</td></tr><tr><td>Checks</td><td>自动检查是否成功。</td></tr><tr><td>Files changed</td><td>具体修改了哪些文件和内容。</td></tr></tbody></table></div><p>重点检查有没有误删文件、提交敏感信息，以及本次修改是否符合目标。</p><p>PR 创建后还可以继续修改同一个功能分支，Commit、Push 后，PR 会自动更新，不需要重新创建。</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">git <span class="keyword">switch</span> feature/<span class="built_in">add-study</span><span class="literal">-notes</span></span><br><span class="line">git add notes.md</span><br><span class="line">git commit <span class="literal">-m</span> <span class="string">&quot;docs: 补充学习笔记&quot;</span></span><br><span class="line">git push</span><br></pre></td></tr></table></figure><p>上面的命令在继续编辑并保存 <code>notes.md</code> 后执行。</p><h3 id="Merge-PR-是什么意思"><a href="#Merge-PR-是什么意思" class="headerlink" title="Merge PR 是什么意思"></a>Merge PR 是什么意思</h3><p>Merge PR 就是接受这个 PR，把修改合并到选定的目标分支。</p><p>确认修改正确、必要检查通过且没有未解决冲突，再点击 <code>Merge pull request → Confirm merge</code>。</p><p>按钮不能点击时，先看页面提示，可能需要解决冲突、等待检查或满足分支保护规则。</p><div class="table-container"><table><thead><tr><th>合并方式</th><th>区别</th></tr></thead><tbody><tr><td>Create a merge commit</td><td>保留分支上的提交，并新增一条合并提交。</td></tr><tr><td>Squash and merge</td><td>将本次 PR 的修改合成一条新提交。</td></tr><tr><td>Rebase and merge</td><td>将提交依次接到目标分支后面，提交编号会变化。</td></tr></tbody></table></div><p>刚开始可以选择仓库允许的普通 Merge，不必同时练习所有方式。</p><p><code>Close pull request</code> 只是关闭请求，没有把修改合并到主分支。</p><p>PR 操作参见 <a href="https://docs.github.com/en/pull-requests/how-tos/create-pull-requests/creating-a-pull-request">GitHub 创建 Pull Request</a>。</p><h2 id="十、合并后同步并清理分支"><a href="#十、合并后同步并清理分支" class="headerlink" title="十、合并后同步并清理分支"></a>十、合并后同步并清理分支</h2><p>GitHub 上完成合并后，本地 <code>main</code> 还没自动更新，需要拉取：</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git <span class="keyword">switch</span> main</span><br><span class="line">git pull <span class="literal">--ff-only</span> origin main</span><br></pre></td></tr></table></figure><p>确认文件和提交已经进入主分支，再删除已完成的本地功能分支：</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git branch <span class="literal">-d</span> feature/<span class="built_in">add-study</span><span class="literal">-notes</span></span><br></pre></td></tr></table></figure><p>远程分支可以在已合并的 PR 页面点击 <code>Delete branch</code>，也可以执行：</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git push origin <span class="literal">--delete</span> feature/<span class="built_in">add-study</span><span class="literal">-notes</span></span><br><span class="line">git fetch <span class="literal">--prune</span></span><br></pre></td></tr></table></figure><p>远程分支已经通过网页删除时，不用再执行远程删除命令，只需 <code>git fetch --prune</code> 清理本地旧记录。</p><p><code>git branch -d</code> 删除本地分支，不会删除 GitHub 分支；删除分支也不会删除已经合并进主分支的文件。</p><p>Squash 或 Rebase 合并后，<code>-d</code> 可能仍提示未合并；先核对 PR 和主分支内容，不要为了消除提示直接强制删除。</p><h2 id="十一、合并冲突怎么处理"><a href="#十一、合并冲突怎么处理" class="headerlink" title="十一、合并冲突怎么处理"></a>十一、合并冲突怎么处理</h2><p>冲突表示两边修改重叠，Git 无法判断该保留哪一种内容，需要你决定。</p><p>处理前先 Commit 或 Stash 保存自己的改动，保证工作区干净，再在尚未合并的功能分支中整合最新主分支：</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">git <span class="keyword">switch</span> feature/<span class="built_in">add-study</span><span class="literal">-notes</span></span><br><span class="line">git fetch origin</span><br><span class="line">git merge origin/main</span><br></pre></td></tr></table></figure><p>发生冲突时，<code>git status</code> 会列出文件，里面可能出现这些标记：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">&lt;&lt;&lt;&lt;&lt;&lt;&lt; HEAD</span><br><span class="line">当前功能分支的内容</span><br><span class="line">=======</span><br><span class="line">主分支的内容</span><br><span class="line">&gt;&gt;&gt;&gt;&gt;&gt;&gt; origin/main</span><br></pre></td></tr></table></figure><p>编辑冲突文件，保留需要的最终内容，并删除三种冲突标记。</p><p>例如冲突文件是 <code>notes.md</code>，解决后执行：</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">git add notes.md</span><br><span class="line">git <span class="built_in">diff</span> <span class="literal">--staged</span></span><br><span class="line">git commit <span class="literal">-m</span> <span class="string">&quot;merge: 整合主分支并解决笔记冲突&quot;</span></span><br><span class="line">git push</span><br></pre></td></tr></table></figure><p>不想继续本次合并，可以在合并尚未完成时执行：</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git merge <span class="literal">--abort</span></span><br></pre></td></tr></table></figure><p>两边改动都要保留时，应把它们整理成最终内容，不是随便删掉其中一边。</p><h2 id="十二、撤销修改和临时保存"><a href="#十二、撤销修改和临时保存" class="headerlink" title="十二、撤销修改和临时保存"></a>十二、撤销修改和临时保存</h2><p>下面是不同场景的处理方法，不要把全部命令连续执行。</p><h3 id="文件暂存错了"><a href="#文件暂存错了" class="headerlink" title="文件暂存错了"></a>文件暂存错了</h3><p>取消暂存，但保留电脑上的修改：</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git restore <span class="literal">--staged</span> README.md</span><br></pre></td></tr></table></figure><h3 id="放弃未暂存的修改"><a href="#放弃未暂存的修改" class="headerlink" title="放弃未暂存的修改"></a>放弃未暂存的修改</h3><p>确认不需要这些内容，或先备份，再执行：</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git restore README.md</span><br></pre></td></tr></table></figure><p>它会用暂存区版本覆盖工作区文件，未保存到其他位置的改动会丢失。</p><h3 id="开发到一半，需要切换分支"><a href="#开发到一半，需要切换分支" class="headerlink" title="开发到一半，需要切换分支"></a>开发到一半，需要切换分支</h3><p>临时保存已跟踪文件的改动和未跟踪文件：</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git stash push <span class="literal">-u</span> <span class="literal">-m</span> <span class="string">&quot;临时保存开发进度&quot;</span></span><br><span class="line">git stash list</span><br></pre></td></tr></table></figure><p>回到原来的开发分支后，恢复最近一份暂存：</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git stash apply</span><br></pre></td></tr></table></figure><p><code>apply</code> 不会删除这份 Stash；恢复可能发生冲突，检查无误后再处理，忽略文件不在 <code>-u</code> 的保存范围内。</p><h3 id="撤销已经提交的修改"><a href="#撤销已经提交的修改" class="headerlink" title="撤销已经提交的修改"></a>撤销已经提交的修改</h3><p>对于已经上传的普通提交，优先用 Revert 新增一条撤销提交，不重写别人已获取的历史。</p><p>确认工作区干净；本例撤销当前分支最近一条普通提交，不适用于 Merge Commit：</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">git revert <span class="literal">--no-edit</span> HEAD</span><br><span class="line">git push</span><br></pre></td></tr></table></figure><p>如果撤销的是更早的提交，先用 <code>git log --oneline</code> 找到编号，再把 <code>HEAD</code> 换成该编号。</p><h3 id="查找误操作前的提交"><a href="#查找误操作前的提交" class="headerlink" title="查找误操作前的提交"></a>查找误操作前的提交</h3><p>查看本地分支和 HEAD 的移动记录：</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git reflog <span class="literal">-10</span></span><br></pre></td></tr></table></figure><p>它可以帮助找到误操作前的提交，但不是永久备份，也不能找回从未保存的全部文件。</p><p>刚开始不要随意执行 <code>git reset --hard</code>、<code>git clean -fd</code> 或强制 Push，它们可能丢失改动或覆盖远程历史。</p><p>具体规则参见 <a href="https://git-scm.com/docs/git-stash">Git Stash</a> 和 <a href="https://git-scm.com/docs/git-revert">Git Revert</a>。</p><h2 id="十三、哪些文件不应该上传"><a href="#十三、哪些文件不应该上传" class="headerlink" title="十三、哪些文件不应该上传"></a>十三、哪些文件不应该上传</h2><p>在项目根目录创建 <code>.gitignore</code>，忽略临时文件和私密配置，例如：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">node_modules/</span><br><span class="line">build/</span><br><span class="line">*.log</span><br><span class="line">.env</span><br></pre></td></tr></table></figure><p>这只是示例，按项目需要保留或修改规则，再把 <code>.gitignore</code> 本身提交进仓库。</p><p><code>.gitignore</code> 不会自动取消已经跟踪的文件，也不会删除历史中的密码；秘密泄露后应先撤销或更换密钥。</p><p>每次提交前用 <code>git diff --staged</code> 检查，不上传密码、Token、验证码、私钥和不该公开的个人信息。</p><h2 id="十四、个人开发的日常流程"><a href="#十四、个人开发的日常流程" class="headerlink" title="十四、个人开发的日常流程"></a>十四、个人开发的日常流程</h2><p>开始前确认工作区干净，同步主分支并创建本次任务的分支：</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">git status</span><br><span class="line">git <span class="keyword">switch</span> main</span><br><span class="line">git pull <span class="literal">--ff-only</span> origin main</span><br><span class="line">git <span class="keyword">switch</span> <span class="literal">-c</span> feature/<span class="built_in">update-readme</span></span><br></pre></td></tr></table></figure><p>修改并保存 README，检查后提交和上传：</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">diff</span></span><br><span class="line">git add README.md</span><br><span class="line">git <span class="built_in">diff</span> <span class="literal">--staged</span></span><br><span class="line">git commit <span class="literal">-m</span> <span class="string">&quot;docs: 完善项目使用说明&quot;</span></span><br><span class="line">git push <span class="literal">-u</span> origin feature/<span class="built_in">update-readme</span></span><br></pre></td></tr></table></figure><p>接下来创建 PR、检查修改、合并，再更新本地 <code>main</code>。</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">同步 main → 创建分支 → 修改 → Add → Commit → Push → PR → Merge → 同步 main</span><br></pre></td></tr></table></figure><p>一个 Commit 尽量只做一件清楚的事，一条分支尽量只完成一个任务。</p><p>这套流程也适用于多人协作，参见 <a href="https://docs.github.com/en/get-started/using-github/github-flow">GitHub Flow</a>。</p><h2 id="十五、和朋友协作开发"><a href="#十五、和朋友协作开发" class="headerlink" title="十五、和朋友协作开发"></a>十五、和朋友协作开发</h2><p>有仓库写入权限时，双方克隆同一个仓库，各自在自己的分支开发。</p><p>仓库负责人进入 <code>Settings → Collaborators → Add people</code> 邀请朋友，朋友接受邀请后再推送代码。</p><p>朋友先同步 <code>main</code>，创建自己的功能分支，修改后 Commit、Push，再提交 PR。</p><p>负责人检查 <code>Files changed</code> 和测试结果，有问题就留言，朋友继续在同一分支提交修改。</p><p>审查选项中，Comment 是留言，Approve 是同意，Request changes 是要求修改。</p><p>确认可以合并后由有权限的人合并，双方再拉取最新 <code>main</code>，不要直接覆盖对方的文件。</p><h2 id="十六、给别人的项目贡献代码：Fork"><a href="#十六、给别人的项目贡献代码：Fork" class="headerlink" title="十六、给别人的项目贡献代码：Fork"></a>十六、给别人的项目贡献代码：Fork</h2><p>没有原仓库写入权限时，先 Fork 到自己的账号，再在副本中修改并向原仓库提交 PR。</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">原作者仓库 → Fork 到自己的 GitHub → Clone 到电脑 → 分支修改 → Push 到自己的仓库 → PR 给原作者</span><br></pre></td></tr></table></figure><p>克隆的是自己的 Fork，<code>origin</code> 指向自己的副本；原项目可另设为 <code>upstream</code>。</p><p>在 Fork 的项目目录中执行，下面的原仓库地址需要替换：</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">git remote add upstream https://github.com/原作者/原仓库.git</span><br><span class="line">git fetch upstream</span><br><span class="line">git <span class="keyword">switch</span> main</span><br><span class="line">git merge <span class="literal">--ff-only</span> upstream/main</span><br><span class="line">git push origin main</span><br></pre></td></tr></table></figure><p>工作区要先保持干净；如果 Fork 的主分支已经有自己的独立提交，快进会被拒绝，应先检查差异，不要强制覆盖。</p><p>贡献代码时从同步后的主分支创建功能分支，把功能分支推送到自己的 <code>origin</code>，再在网页上选择原仓库的主分支作为 PR 的 <code>base</code>。</p><p>Fork 和 Clone 不会让你获得原仓库的写入权限，是否接受修改由原项目维护者决定。</p><h2 id="十七、记录任务和发布版本"><a href="#十七、记录任务和发布版本" class="headerlink" title="十七、记录任务和发布版本"></a>十七、记录任务和发布版本</h2><div class="table-container"><table><thead><tr><th>功能</th><th>用途</th></tr></thead><tbody><tr><td>Issues</td><td>记录 Bug、功能需求和待办任务。</td></tr><tr><td>Labels</td><td>给 Issue 和 PR 分类，例如 <code>bug</code>、<code>documentation</code>。</td></tr><tr><td>Milestones</td><td>将一组任务归到同一个版本目标。</td></tr><tr><td>Projects</td><td>用看板整理待办、进行中和已完成的任务。</td></tr><tr><td>Tags</td><td>给某条提交标记版本号。</td></tr><tr><td>Releases</td><td>基于 Tag 发布版本说明和下载附件。</td></tr></tbody></table></div><p>在仓库的 <code>Issues → New issue</code> 创建任务，写清目标和完成条件。</p><p>修复同仓库的 Issue 时，可在 PR 说明里写 <code>Closes #1</code>；合并到默认分支后会关闭对应 Issue，<code>1</code> 换成实际编号。</p><p>准备发布时，先切到最新主分支，确认代码和测试无误，再标记版本：</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">git <span class="keyword">switch</span> main</span><br><span class="line">git pull <span class="literal">--ff-only</span> origin main</span><br><span class="line">git tag <span class="literal">-a</span> v1.<span class="number">0.0</span> <span class="literal">-m</span> <span class="string">&quot;第一个正式版本&quot;</span></span><br><span class="line">git push origin v1.<span class="number">0.0</span></span><br></pre></td></tr></table></figure><p>版本号要选一个尚未使用的值；不要重复执行命令来覆盖已有版本。</p><p>随后在 GitHub 的 Releases 中创建发布，选择这个 Tag、填写版本说明，按需要上传安装包。</p><p>Tag 不等于安装包，上传 Tag 也不会自动替项目编译程序。</p><p>README 写清项目用途和使用方法；LICENSE 用于说明许可，没有许可文件不代表可以任意使用代码。</p><h2 id="十八、GitHub-Actions：自动检查"><a href="#十八、GitHub-Actions：自动检查" class="headerlink" title="十八、GitHub Actions：自动检查"></a>十八、GitHub Actions：自动检查</h2><p>Actions 可以在 Push 或 PR 后自动运行任务，例如测试、编译和检查文档。</p><p>下面给 <code>learn-github</code> 练习仓库增加一个最小检查：确认 README 存在且不为空。</p><p>在练习项目根目录新建 <code>.github\workflows\check.yml</code>，内容如下：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">name:</span> <span class="string">Check</span> <span class="string">README</span></span><br><span class="line"></span><br><span class="line"><span class="attr">on:</span></span><br><span class="line">  <span class="attr">push:</span></span><br><span class="line">  <span class="attr">pull_request:</span></span><br><span class="line">  <span class="attr">workflow_dispatch:</span></span><br><span class="line"></span><br><span class="line"><span class="attr">permissions:</span></span><br><span class="line">  <span class="attr">contents:</span> <span class="string">read</span></span><br><span class="line"></span><br><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">check:</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">下载仓库</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">actions/checkout@v7</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">persist-credentials:</span> <span class="literal">false</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">检查</span> <span class="string">README</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">test</span> <span class="string">-s</span> <span class="string">README.md</span></span><br></pre></td></tr></table></figure><p>创建文件的目录需要先建好；它属于 GitHub 练习仓库，不是本文所在的 Hexo 博客项目。</p><p>使用功能分支提交这个文件：</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">git add .github/workflows/check.yml</span><br><span class="line">git <span class="built_in">diff</span> <span class="literal">--staged</span></span><br><span class="line">git commit <span class="literal">-m</span> <span class="string">&quot;ci: 添加 README 自动检查&quot;</span></span><br><span class="line">git push</span><br></pre></td></tr></table></figure><p>命令假设当前功能分支已经建立了远程对应关系；第一次推送时使用 <code>git push -u origin 当前分支名</code>。</p><p>打开仓库的 Actions 页面查看结果，绿色表示该任务成功，红色表示失败，应点进去看日志。</p><p>这个检查只确认 README 非空，不代表项目代码正确；实际项目要换成相应的测试或编译命令。</p><p><code>workflow_dispatch</code> 用于手动运行，文件先进入默认分支后，才可以在 Actions 页面找到对应的手动运行入口。</p><p>需要 Token 或密码时，通过 GitHub 的 Secrets 配置，不直接写进 YAML，也不在日志里输出。</p><p>配置规则参见 <a href="https://docs.github.com/en/actions/reference/workflows-and-actions/workflow-syntax">GitHub Actions 工作流语法</a>，Checkout 的用途参见 <a href="https://github.com/actions/checkout">官方 Checkout</a>。</p><h2 id="十九、常见问题"><a href="#十九、常见问题" class="headerlink" title="十九、常见问题"></a>十九、常见问题</h2><h3 id="Push-返回-403"><a href="#Push-返回-403" class="headerlink" title="Push 返回 403"></a>Push 返回 403</h3><p>先确认 <code>git remote -v</code> 指向自己的仓库，再检查当前登录账号是否有写入权限；设置 <code>user.name</code> 不会增加权限。</p><h3 id="Push-被拒绝：non-fast-forward"><a href="#Push-被拒绝：non-fast-forward" class="headerlink" title="Push 被拒绝：non-fast-forward"></a>Push 被拒绝：non-fast-forward</h3><p>远程有本地尚未包含的提交，先保存自己的改动，执行 <code>git fetch origin</code> 检查历史，再按需要合并或 Rebase。</p><p>本文的 <code>--ff-only</code> 遇到分叉会停止，不要把停止当作需要强制 Push 的理由。</p><h3 id="PR-提示没有共同历史"><a href="#PR-提示没有共同历史" class="headerlink" title="PR 提示没有共同历史"></a>PR 提示没有共同历史</h3><p>功能分支和主分支不是从同一套历史分出来的，可能是重新 <code>git init</code> 或创建了孤立分支。</p><p>先备份自己的修改，再从正确的 <code>origin/main</code> 创建新分支，把需要的改动重新提交；不要直接强行合并无关历史。</p><h3 id="明明修改了，Commit-却没内容"><a href="#明明修改了，Commit-却没内容" class="headerlink" title="明明修改了，Commit 却没内容"></a>明明修改了，Commit 却没内容</h3><p>检查文件是否保存，执行 <code>git status</code>，确认需要的修改已经 <code>git add</code> 到暂存区。</p><h3 id="Push-成功，主分支却没变化"><a href="#Push-成功，主分支却没变化" class="headerlink" title="Push 成功，主分支却没变化"></a>Push 成功，主分支却没变化</h3><p>可能只上传了功能分支，先切换 GitHub 网页的分支查看，再通过 Merge 或 PR 合并到 <code>main</code>。</p><h3 id="切换分支时提示本地修改会被覆盖"><a href="#切换分支时提示本地修改会被覆盖" class="headerlink" title="切换分支时提示本地修改会被覆盖"></a>切换分支时提示本地修改会被覆盖</h3><p>先 Commit、Stash 或备份改动，再切换分支，不要直接强制丢弃。</p><h2 id="二十、命令速查"><a href="#二十、命令速查" class="headerlink" title="二十、命令速查"></a>二十、命令速查</h2><div class="table-container"><table><thead><tr><th>命令</th><th>作用</th></tr></thead><tbody><tr><td><code>git status</code></td><td>查看分支和文件状态。</td></tr><tr><td><code>git diff</code></td><td>查看未暂存的改动。</td></tr><tr><td><code>git diff --staged</code></td><td>查看本次准备提交的改动。</td></tr><tr><td><code>git add 文件名</code></td><td>暂存文件的改动。</td></tr><tr><td><code>git commit -m &quot;说明&quot;</code></td><td>创建本地提交。</td></tr><tr><td><code>git push</code></td><td>上传当前已配置对应关系的分支。</td></tr><tr><td><code>git fetch origin</code></td><td>获取远程更新，不合并当前分支。</td></tr><tr><td><code>git pull --ff-only origin main</code></td><td>快进同步当前的主分支。</td></tr><tr><td><code>git switch -c 分支名</code></td><td>创建并切换分支。</td></tr><tr><td><code>git switch 分支名</code></td><td>切换已有分支。</td></tr><tr><td><code>git branch -a</code></td><td>查看本地和远程跟踪分支。</td></tr><tr><td><code>git branch -d 分支名</code></td><td>删除已合并的本地分支。</td></tr><tr><td><code>git merge 分支名</code></td><td>将指定分支合并到当前分支。</td></tr><tr><td><code>git log --oneline --decorate --graph --all -10</code></td><td>查看最近的分支与提交关系。</td></tr><tr><td><code>git remote -v</code></td><td>查看远程仓库地址。</td></tr></tbody></table></div><p>最重要的区别：<strong>Add 是准备提交，Commit 是本地存档，Push 是上传，Merge 才是合并。</strong></p>]]>
    </content>
    <id>https://serein0321.github.io/2026/10/12/%E4%B8%AA%E4%BA%BA%E5%BC%80%E5%8F%91%EF%BC%9Agithub%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/</id>
    <link href="https://serein0321.github.io/2026/10/12/%E4%B8%AA%E4%BA%BA%E5%BC%80%E5%8F%91%EF%BC%9Agithub%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8B/"/>
    <published>2026-10-12T10:21:31.000Z</published>
    <summary>
      <![CDATA[<p>从创建仓库开始，学会提交代码、使用分支、合并 PR，再学习和别人合作开发。</p>]]>
    </summary>
    <title>个人开发：github使用教程</title>
    <updated>2026-10-13T09:31:01.481Z</updated>
  </entry>
  <entry>
    <author>
      <name>Serein0321</name>
    </author>
    <category term="技术分享" scheme="https://serein0321.github.io/categories/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/"/>
    <category term="网站博客" scheme="https://serein0321.github.io/categories/%E6%8A%80%E6%9C%AF%E5%88%86%E4%BA%AB/%E7%BD%91%E7%AB%99%E5%8D%9A%E5%AE%A2/"/>
    <category term="博客" scheme="https://serein0321.github.io/tags/%E5%8D%9A%E5%AE%A2/"/>
    <content>
      <![CDATA[<p>不用自己买服务器和域名，用 GitHub Pages 就能搭建属于自己的hexo博客。</p><span id="more"></span><h2 id="环境准备"><a href="#环境准备" class="headerlink" title="环境准备"></a>环境准备</h2><ol><li><p>安装 Node.js</p></li><li><p>安装git</p></li><li><p>安装hexo命令行工具</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">npm install -g hexo-cli</span><br><span class="line">hexo --version</span><br></pre></td></tr></table></figure></li></ol><h2 id="step1-创建github仓库"><a href="#step1-创建github仓库" class="headerlink" title="step1: 创建github仓库"></a>step1: 创建github仓库</h2><p>登录 GitHub，点击右上角的 “+” → “New repository”，创建一个名为 <code>你的用户名.github.io</code> 的公开仓库。例如我的用户名是 Serein0321，就创建 <code>Serein0321.github.io</code>。</p><img src="/2026/10/11/%E4%BB%8E%E9%9B%B6%E5%BC%80%E5%A7%8B%E6%90%AD%E5%BB%BAhexo%E5%8D%9A%E5%AE%A2/15ddaf0b-a7fa-42f6-92b3-99c083b8f103.png" class="" title="创建GitHub仓库截图"><h2 id="step2-初始化-Hexo-项目"><a href="#step2-初始化-Hexo-项目" class="headerlink" title="step2: 初始化 Hexo 项目"></a>step2: 初始化 Hexo 项目</h2><p>环境准备就绪，现在开始搭建博客。</p><h3 id="认识博客项目"><a href="#认识博客项目" class="headerlink" title="认识博客项目"></a>认识博客项目</h3><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">D:\blog\Serein0321.github.io\</span><br><span class="line">├─ _config.yml                  博客整体配置</span><br><span class="line">├─ package.json                 项目依赖清单</span><br><span class="line">├─ package-lock.json            npm 依赖版本记录</span><br><span class="line">├─ scaffolds\                   创建文章和页面时使用的模板</span><br><span class="line">├─ source\                      自己维护的内容</span><br><span class="line">│  ├─ _posts\                   正式文章及各篇文章的同名资源文件夹</span><br><span class="line">│  ├─ _drafts\                  草稿，使用时才会创建</span><br><span class="line">│  ├─ _data\                    自定义模板等文件</span><br><span class="line">│  ├─ images\                   头像等公共图片</span><br><span class="line">│  ├─ tags\                     标签页面</span><br><span class="line">│  ├─ categories\               分类页面</span><br><span class="line">│  └─ about\                    关于页面</span><br><span class="line">├─ themes\</span><br><span class="line">│  └─ next\                     后面安装的 NexT 主题</span><br><span class="line">│     ├─ _config.yml            NexT 主题配置</span><br><span class="line">│     ├─ layout\                页面模板</span><br><span class="line">│     └─ source\                主题自带资源</span><br><span class="line">├─ node_modules\                npm 安装的依赖</span><br><span class="line">├─ public\                      Hexo 生成的网页</span><br><span class="line">└─ .deploy_git\                 部署插件的临时工作目录</span><br></pre></td></tr></table></figure><h3 id="创建博客项目"><a href="#创建博客项目" class="headerlink" title="创建博客项目"></a>创建博客项目</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"># 进入项目目录</span><br><span class="line">cd D:/blog</span><br><span class="line"></span><br><span class="line"># 初始化 Hexo 项目</span><br><span class="line">hexo init Serein0321.github.io --no-install</span><br><span class="line"></span><br><span class="line"># 进入项目目录</span><br><span class="line">cd Serein0321.github.io</span><br><span class="line"></span><br><span class="line"># 安装依赖</span><br><span class="line">npm install</span><br></pre></td></tr></table></figure><h3 id="配置-config-yml"><a href="#配置-config-yml" class="headerlink" title="配置 _config.yml"></a>配置 _config.yml</h3><p>打开项目根目录的 <code>_config.yml</code>，修改以下配置：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"># Site</span><br><span class="line">title: Serein0321&#x27;s Blog</span><br><span class="line">subtitle: 技术博客</span><br><span class="line">description: 个人技术博客</span><br><span class="line">author: Serein0321</span><br><span class="line">language: zh-CN</span><br><span class="line"></span><br><span class="line"># Deployment</span><br><span class="line">deploy:</span><br><span class="line">  type: git</span><br><span class="line">  repo: https://github.com/Serein0321/Serein0321.github.io.git</span><br><span class="line">  branch: master</span><br><span class="line">  </span><br><span class="line">### 配置 RSS 和搜索</span><br><span class="line">feed:</span><br><span class="line">  type: atom</span><br><span class="line">  path: atom.xml</span><br><span class="line">  limit: 20</span><br><span class="line"></span><br><span class="line">search:</span><br><span class="line">  path: search.xml</span><br><span class="line">  field: post</span><br><span class="line">  format: html</span><br><span class="line">  limit: 10000</span><br><span class="line">  </span><br><span class="line">#配置 Next 主题</span><br><span class="line">theme: next</span><br></pre></td></tr></table></figure><h2 id="step3-安装和配置-Next-主题"><a href="#step3-安装和配置-Next-主题" class="headerlink" title="step3: 安装和配置 Next 主题"></a>step3: 安装和配置 Next 主题</h2><h3 id="克隆-Next-主题"><a href="#克隆-Next-主题" class="headerlink" title="克隆 Next 主题"></a>克隆 Next 主题</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">cd Serein0321.github.io</span><br><span class="line">git clone https://github.com/theme-next/hexo-theme-next themes/next</span><br></pre></td></tr></table></figure><h3 id="配置Next的config-yml"><a href="#配置Next的config-yml" class="headerlink" title="配置Next的config.yml"></a>配置Next的config.yml</h3><p>打开<code>\Serein0321.github.io\themes\next\_config.yml</code>后按照下面的来进行配置。</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br></pre></td><td class="code"><pre><span class="line">#选择布局</span><br><span class="line">scheme: Pisces</span><br><span class="line"></span><br><span class="line">#设置菜单</span><br><span class="line">menu:</span><br><span class="line">  home: / || fa fa-home</span><br><span class="line">  tags: /tags/ || fa fa-tags</span><br><span class="line">  categories: /categories/ || fa fa-th</span><br><span class="line">  archives: /archives/ || fa fa-archive</span><br><span class="line">  about: /about/ || fa fa-user</span><br><span class="line">  </span><br><span class="line"># 返回顶部 + 阅读百分比</span><br><span class="line">back2top:</span><br><span class="line">  enable: true</span><br><span class="line">  scrollpercent: true</span><br><span class="line"></span><br><span class="line"># 阅读进度条</span><br><span class="line">reading_progress:</span><br><span class="line">  enable: true</span><br><span class="line">  position: top</span><br><span class="line">  color: &quot;#37c6c0&quot;</span><br><span class="line">  height: 3px</span><br><span class="line"></span><br><span class="line"># 书签</span><br><span class="line">bookmark:</span><br><span class="line">  enable: true</span><br><span class="line">  save: auto</span><br><span class="line"></span><br><span class="line"># GitHub Banner</span><br><span class="line">github_banner:</span><br><span class="line">  enable: true</span><br><span class="line">  permalink: https://github.com/你的用户名</span><br><span class="line">  title: Follow me on GitHub</span><br><span class="line"></span><br><span class="line"># 中英文空格自动排版</span><br><span class="line">pangu: true</span><br><span class="line"></span><br><span class="line"># 数学公式</span><br><span class="line">math:</span><br><span class="line">  mathjax:</span><br><span class="line">    enable: true</span><br><span class="line"></span><br><span class="line"># Pjax 局部刷新</span><br><span class="line">pjax: false</span><br><span class="line"></span><br><span class="line"># 本地搜索</span><br><span class="line">local_search:</span><br><span class="line">  enable: true</span><br></pre></td></tr></table></figure><h3 id="安装必需插件"><a href="#安装必需插件" class="headerlink" title="安装必需插件"></a>安装必需插件</h3><p>Next 主题的许多功能需要额外安装插件：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"># RSS 订阅</span><br><span class="line">npm install hexo-generator-feed --save</span><br><span class="line"></span><br><span class="line"># 本地搜索</span><br><span class="line">npm install hexo-generator-searchdb --save</span><br><span class="line"></span><br><span class="line"># 数学公式支持</span><br><span class="line">npm uninstall hexo-renderer-marked --save</span><br><span class="line">npm install hexo-renderer-kramed --save</span><br><span class="line"></span><br><span class="line">#Pjax依赖</span><br><span class="line">cd themes/next</span><br><span class="line">git clone https://github.com/theme-next/theme-next-pjax source/lib/pjax</span><br></pre></td></tr></table></figure><h2 id="step4-创建标签和分类页面"><a href="#step4-创建标签和分类页面" class="headerlink" title="step4: 创建标签和分类页面"></a>step4: 创建标签和分类页面</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">cd Serein0321.github.io</span><br><span class="line">hexo new page tags</span><br><span class="line">hexo new page categories</span><br></pre></td></tr></table></figure><p>修改生成的 <code>source/tags/index.md</code>：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">title: 标签</span><br><span class="line">type: tags</span><br><span class="line">comments: false</span><br></pre></td></tr></table></figure><p>同样修改 <code>source/categories/index.md</code>：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">title: 分类</span><br><span class="line">type: categories</span><br><span class="line">comments: false</span><br></pre></td></tr></table></figure><h2 id="step5-添加评论功能"><a href="#step5-添加评论功能" class="headerlink" title="step5: 添加评论功能"></a>step5: 添加评论功能</h2><p>功能演示：</p><img src="/2026/10/11/%E4%BB%8E%E9%9B%B6%E5%BC%80%E5%A7%8B%E6%90%AD%E5%BB%BAhexo%E5%8D%9A%E5%AE%A2/35304038-0304-44ba-9673-3d0e2f819cb9.png" class="" title="评论功能演示"><h3 id="安装-Utterances-App"><a href="#安装-Utterances-App" class="headerlink" title="安装 Utterances App"></a>安装 Utterances App</h3><p>首先需要为你的 GitHub 仓库安装 Utterances 应用：</p><ol><li>访问 <a href="https://github.com/apps/utterances">https://github.com/apps/utterances</a></li><li>点击 “Install”</li><li>选择 “Only select repositories”</li><li>选中你的博客仓库（如 <code>Serein0321.github.io</code>）</li><li>点击 “Install”</li></ol><h3 id="配置评论"><a href="#配置评论" class="headerlink" title="配置评论"></a>配置评论</h3><p>在博客目录下创建自定义评论文件：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">mkdir -p source/_data</span><br></pre></td></tr></table></figure><p>创建 <code>source/_data/comments.swig</code> 文件：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">&lt;div class=&quot;comments&quot; id=&quot;comments&quot;&gt;</span><br><span class="line">  &lt;script src=&quot;https://utteranc.es/client.js&quot;</span><br><span class="line">        repo=&quot;你的用户名/你的用户名.github.io&quot;</span><br><span class="line">        issue-term=&quot;pathname&quot;</span><br><span class="line">        theme=&quot;github-light&quot;</span><br><span class="line">        crossorigin=&quot;anonymous&quot;</span><br><span class="line">        async&gt;</span><br><span class="line">  &lt;/script&gt;</span><br><span class="line">&lt;/div&gt;</span><br></pre></td></tr></table></figure><p>然后在主题配置中启用自定义文件：</p><p>编辑 <code>themes/next/_config.yml</code>，找到 <code>custom_file_path</code> 部分，取消注释 <code>postBodyEnd</code>：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">custom_file_path:</span><br><span class="line">  postBodyEnd: source/_data/comments.swig</span><br></pre></td></tr></table></figure><h3 id="启用文章评论"><a href="#启用文章评论" class="headerlink" title="启用文章评论"></a>启用文章评论</h3><p>在每篇文章的 Front-matter 中添加 <code>comments: true</code>：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">title: 你的文章标题</span><br><span class="line">comments: true</span><br></pre></td></tr></table></figure><h2 id="step6-添加头像"><a href="#step6-添加头像" class="headerlink" title="step6: 添加头像"></a>step6: 添加头像</h2><p>功能演示：</p><img src="/2026/10/11/%E4%BB%8E%E9%9B%B6%E5%BC%80%E5%A7%8B%E6%90%AD%E5%BB%BAhexo%E5%8D%9A%E5%AE%A2/554e027f-406e-4440-b202-607116f307b6.png" class="" title="头像功能演示"><p>将头像图片放入 <code>themes/next/source/images/avatar.png</code>，然后在配置<code>\Serein0321.github.io\themes\next\_config.yml</code>中添加：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">avatar:</span><br><span class="line">  url: /images/avatar.png</span><br><span class="line">  rounded: true</span><br><span class="line">  rotated: true</span><br></pre></td></tr></table></figure><h2 id="step7-部署到github"><a href="#step7-部署到github" class="headerlink" title="step7: 部署到github"></a>step7: 部署到github</h2><h3 id="安装部署插件"><a href="#安装部署插件" class="headerlink" title="安装部署插件"></a>安装部署插件</h3><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install hexo<span class="literal">-deployer-git</span> <span class="literal">--save</span></span><br></pre></td></tr></table></figure><p>部署插件负责在执行 <code>hexo deploy</code> 时，自动将生成的网页提交并推送到指定仓库。安装插件本身不会上传网页。</p><h3 id="上传github"><a href="#上传github" class="headerlink" title="上传github"></a>上传github</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo clean &amp;&amp; hexo generate &amp;&amp; hexo deploy</span><br></pre></td></tr></table></figure><h2 id="使用教程"><a href="#使用教程" class="headerlink" title="使用教程"></a>使用教程</h2><h3 id="先设置新建文章的默认模板"><a href="#先设置新建文章的默认模板" class="headerlink" title="先设置新建文章的默认模板"></a>先设置新建文章的默认模板</h3><p>执行 <code>hexo new &quot;文章标题&quot;</code> 时，Hexo 会读取 <code>scaffolds\post.md</code>，根据它创建新文章。希望每篇文章自动带上评论开关、分类、标签和正文结构，就修改这个模板。</p><p>打开：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">D:\blog\Serein0321.github.io\scaffolds\post.md</span><br></pre></td></tr></table></figure><p>将文件内容替换为下面的模板，保存：</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line">title: &#123;&#123; title &#125;&#125;</span><br><span class="line">date: &#123;&#123; date &#125;&#125;</span><br><span class="line">categories:</span><br><span class="line"><span class="bullet">  -</span> 分类</span><br><span class="line">tags:</span><br><span class="line"><span class="bullet">  -</span> 标签1</span><br><span class="line"><span class="bullet">  -</span> 标签2</span><br><span class="line">comments: true</span><br><span class="line"><span class="section">mathjax: true</span></span><br><span class="line"><span class="section">---</span></span><br><span class="line"></span><br><span class="line">在这里写摘要</span><br><span class="line"></span><br><span class="line">&lt;!-- more --&gt;</span><br><span class="line"></span><br><span class="line">在这里写内容</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>模板中的字段含义如下：</p><div class="table-container"><table><thead><tr><th>内容</th><th>新建文章时的作用</th></tr></thead><tbody><tr><td><code>&#123;&#123; title &#125;&#125;</code></td><td>自动替换为 <code>hexo new</code> 命令中填写的标题</td></tr><tr><td><code>&#123;&#123; date &#125;&#125;</code></td><td>自动替换为创建文章的日期和时间</td></tr><tr><td><code>categories: []</code></td><td>预留分类字段，暂时不分配分类</td></tr><tr><td><code>tags: []</code></td><td>预留标签字段，暂时不分配标签</td></tr><tr><td><code>comments: true</code></td><td>默认允许文章显示评论组件；评论服务仍需按第 15 节配置</td></tr><tr><td><code>mathjax: false</code></td><td>默认不启用这篇文章的公式渲染，需要公式时改成 <code>true</code></td></tr><tr><td><code>&lt;!-- more --&gt;</code></td><td>将前面的正文作为首页摘要</td></tr><tr><td>正文小标题</td><td>每篇新文章自动带上写作结构，可以按文章需要修改</td></tr></tbody></table></div><h3 id="常用命令汇总"><a href="#常用命令汇总" class="headerlink" title="常用命令汇总"></a>常用命令汇总</h3><div class="table-container"><table><thead><tr><th>命令</th><th>说明</th></tr></thead><tbody><tr><td><code>hexo new &quot;标题&quot;</code></td><td>创建新文章</td></tr><tr><td><code>hexo generate</code></td><td>生成静态文件</td></tr><tr><td><code>hexo server</code></td><td>启动本地服务器</td></tr><tr><td><code>hexo deploy</code></td><td>部署到 GitHub</td></tr><tr><td><code>hexo clean</code></td><td>清理缓存</td></tr></tbody></table></div><h3 id="为每个博客配资源文件夹"><a href="#为每个博客配资源文件夹" class="headerlink" title="为每个博客配资源文件夹"></a>为每个博客配资源文件夹</h3><p>在<strong>博客根配置</strong>中修改已有字段，设置默认文章类型，同时开启每篇文章的资源文件夹：</p><figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">default_layout:</span> <span class="string">post</span></span><br><span class="line"><span class="attr">post_asset_folder:</span> <span class="literal">true</span></span><br></pre></td></tr></table></figure><p>这样创建用于存放该文章图片的同名文件夹。在文档里引用图片就用：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">&#123;% asset_img 首页.png 博客首页截图 %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% asset_img 配置截图.png 配置文件截图 %&#125;</span><br></pre></td></tr></table></figure><h3 id="本地浏览"><a href="#本地浏览" class="headerlink" title="本地浏览"></a>本地浏览</h3><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo clean &amp;&amp; hexo generate &amp;&amp; hexo server</span><br></pre></td></tr></table></figure>]]>
    </content>
    <id>https://serein0321.github.io/2026/10/11/%E4%BB%8E%E9%9B%B6%E5%BC%80%E5%A7%8B%E6%90%AD%E5%BB%BAhexo%E5%8D%9A%E5%AE%A2/</id>
    <link href="https://serein0321.github.io/2026/10/11/%E4%BB%8E%E9%9B%B6%E5%BC%80%E5%A7%8B%E6%90%AD%E5%BB%BAhexo%E5%8D%9A%E5%AE%A2/"/>
    <published>2026-10-10T16:01:23.000Z</published>
    <summary>
      <![CDATA[<p>不用自己买服务器和域名，用 GitHub Pages 就能搭建属于自己的hexo博客。</p>]]>
    </summary>
    <title>从零开始搭建hexo博客</title>
    <updated>2026-10-11T01:44:03.720Z</updated>
  </entry>
</feed>
