<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>教程 on 我的博客</title><link>https://blog.5616760.com/tags/%E6%95%99%E7%A8%8B/</link><description>Recent content in 教程 on 我的博客</description><generator>Hugo -- gohugo.io</generator><language>zh</language><lastBuildDate>Thu, 17 Sep 2026 09:30:00 +0800</lastBuildDate><atom:link href="https://blog.5616760.com/tags/%E6%95%99%E7%A8%8B/index.xml" rel="self" type="application/rss+xml"/><item><title>Git 与 GitHub 完全入门指南：从零开始到日常协作</title><link>https://blog.5616760.com/0007.html</link><pubDate>Thu, 17 Sep 2026 09:30:00 +0800</pubDate><guid>https://blog.5616760.com/0007.html</guid><description>&lt;h2 id="一前言为什么每个开发者都要学-git-与-github"&gt;一、前言：为什么每个开发者都要学 Git 与 GitHub&#10;&lt;/h2&gt;&lt;p&gt;如果你写过代码、保存过文档，就会知道一个常见的痛点：&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;报告_v1.docx&#10;报告_v1_最终.docx&#10;报告_v1_最终_真的不改了.docx&#10;报告_v1_最终_真的不改了_老板说要改.docx&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Git 的出现彻底解决了这个问题。它是一套&lt;strong&gt;分布式版本控制系统&lt;/strong&gt;，可以精确记录文件的每一次改动，让你随时回退、对比、分支实验，并与他人无缝协作。&lt;/p&gt;&#10;&lt;p&gt;而 &lt;strong&gt;GitHub&lt;/strong&gt; 是目前全球最大的代码托管平台，基于 Git 构建，提供了远程仓库、Pull Request、Issue、Actions、Pages 等一整套协作工具。&lt;/p&gt;&#10;&lt;p&gt;简单地说：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;Git&lt;/strong&gt; = 本地版本管理工具（命令行）&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;GitHub&lt;/strong&gt; = 远端协作平台（网站 + 服务）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;两者配合的典型场景就是：&lt;strong&gt;本地写代码 → Git 记录改动 → 推送到 GitHub → 团队成员从 GitHub 同步 → 通过 PR 合并代码&lt;/strong&gt;。你正在看的这篇文章，就是 Hugo + Git + GitHub + Vercel 这条流水线自动构建发布的。&lt;/p&gt;&#10;&lt;p&gt;本文将从零开始，按&amp;quot;概念 → 安装 → 命令 → 协作 → 实战&amp;quot;的顺序，逐步带你掌握 Git 与 GitHub 的完整日常用法。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="二必须先理解的-8-个核心概念"&gt;二、必须先理解的 8 个核心概念&#10;&lt;/h2&gt;&lt;p&gt;在敲命令之前，请把下面这 8 个概念记牢。它们会贯穿你使用 Git 的每分每秒。&lt;/p&gt;&#10;&lt;h3 id="1-仓库repository简称-repo"&gt;1. 仓库（Repository，简称 Repo）&#10;&lt;/h3&gt;&lt;p&gt;存放你项目文件 + 所有改动历史的目录。一个项目对应一个仓库。&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;本地仓库&lt;/strong&gt;：你电脑上的 &lt;code&gt;.git&lt;/code&gt; 目录及其管理的文件&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;远程仓库&lt;/strong&gt;：托管在 GitHub / GitLab / Gitee 等平台上的副本&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="2-工作区暂存区版本库三区模型"&gt;2. 工作区、暂存区、版本库（三区模型）&#10;&lt;/h3&gt;&lt;p&gt;这是 Git 最核心的状态机：&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart LR&#10; W["工作区&lt;br/&gt;Working&lt;br/&gt;你编辑的文件"]&#10; S["暂存区&lt;br/&gt;Staged&lt;br/&gt;下次提交的快照"]&#10; R["版本库&lt;br/&gt;Repository&lt;br/&gt;HEAD 指向的历史"]&#10; M["远程仓库&lt;br/&gt;Remote&lt;br/&gt;GitHub"]&#10;&#10; W --&gt;|"git add"| S&#10; S --&gt;|"git commit"| R&#10; R --&gt;|"git push"| M&#10; M -.-&gt;|"git pull"| W&#10; S -.-&gt;|"git restore --staged"| W&#10; R -.-&gt;|"git reset"| W&#10;&#10; style W fill:#f59e0b,stroke:#b45309,stroke-width:2px,color:#fff&#10; style S fill:#3b82f6,stroke:#1e40af,stroke-width:2px,color:#fff&#10; style R fill:#10b981,stroke:#047857,stroke-width:2px,color:#fff&#10; style M fill:#8b5cf6,stroke:#6d28d9,stroke-width:2px,color:#fff&lt;/pre&gt;&lt;p&gt;四个区域的作用：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;工作区&lt;/strong&gt;：你正在编辑的文件&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;暂存区&lt;/strong&gt;：已标记&amp;quot;下次要提交&amp;quot;的快照（一个中间层，让你可以精确控制哪些改动进一次提交）&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;版本库&lt;/strong&gt;：已经提交、永久保存的历史&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;远程仓库&lt;/strong&gt;：托管在 GitHub / GitLab / Gitee 等平台上的副本，本质是版本库的远端镜像&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;不理解暂存区是初学者最大的卡点。&lt;strong&gt;记住一句话&lt;/strong&gt;：暂存区是&amp;quot;草稿箱&amp;quot;，版本库是&amp;quot;档案柜&amp;quot;。你可以把多个改动分批放进草稿箱，分多次提交进档案柜。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="3-提交commit"&gt;3. 提交（Commit）&#10;&lt;/h3&gt;&lt;p&gt;一次提交 = 一个&lt;strong&gt;带说明的快照&lt;/strong&gt;。每次 commit 都有一个全球唯一的哈希值（如 &lt;code&gt;a1b2c3d...&lt;/code&gt;），是回退、对比、定位的钥匙。&lt;/p&gt;&#10;&lt;h3 id="4-分支branch"&gt;4. 分支（Branch）&#10;&lt;/h3&gt;&lt;p&gt;指向某个 commit 的轻量指针。主分支默认叫 &lt;code&gt;main&lt;/code&gt;（老项目可能是 &lt;code&gt;master&lt;/code&gt;）。分支存在的意义是&lt;strong&gt;让你在不影响主线的情况下做实验&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;h3 id="5-head"&gt;5. HEAD&#10;&lt;/h3&gt;&lt;p&gt;一个特殊的&amp;quot;指针&amp;quot;，永远指向&lt;strong&gt;你当前所在的位置&lt;/strong&gt;（通常是某分支的最新 commit）。&lt;/p&gt;&#10;&lt;h3 id="6-远程remote"&gt;6. 远程（Remote）&#10;&lt;/h3&gt;&lt;p&gt;本地仓库对远端仓库的&amp;quot;昵称&amp;quot;，默认叫 &lt;code&gt;origin&lt;/code&gt;，可以配多个（如 &lt;code&gt;origin&lt;/code&gt; + &lt;code&gt;upstream&lt;/code&gt;）。&lt;/p&gt;&#10;&lt;h3 id="7-合并mergevs-变基rebase"&gt;7. 合并（Merge）vs 变基（Rebase）&#10;&lt;/h3&gt;&lt;p&gt;把两条分支&amp;quot;合到一起&amp;quot;的两种不同方式：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;merge&lt;/strong&gt;：保留分支历史，会产生合并 commit&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;rebase&lt;/strong&gt;：把当前分支&amp;quot;接到&amp;quot;目标分支顶端，历史是线性的（更干净，但会改写 commit 哈希）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="8-冲突conflict"&gt;8. 冲突（Conflict）&#10;&lt;/h3&gt;&lt;p&gt;两个分支对同一文件的同一行做了不同的修改，Git 会停下来让你手动决定保留哪一方。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="三环境准备安装-git-与注册-github"&gt;三、环境准备：安装 Git 与注册 GitHub&#10;&lt;/h2&gt;&lt;h3 id="1-安装-git"&gt;1. 安装 Git&#10;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Windows&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;方式 A（推荐）：&lt;a class="link" href="https://git-scm.com/download/win" target="_blank" rel="noopener"&#10; &gt;Git 官网&lt;/a&gt; 下载安装包，一路 Next&lt;/li&gt;&#10;&lt;li&gt;方式 B（包管理器）：&lt;code&gt;winget install Git.Git&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;安装完打开 Git Bash（Git 自带的终端），后续命令都在这里敲&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;macOS&lt;/strong&gt;&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;自带 Xcode Command Line Tools：&lt;code&gt;xcode-select --install&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;或 Homebrew：&lt;code&gt;brew install git&lt;/code&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;&lt;strong&gt;Linux（Debian/Ubuntu）&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;sudo apt update &lt;span style="color:#f92672"&gt;&amp;amp;&amp;amp;&lt;/span&gt; sudo apt install git -y&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;验证安装&lt;/strong&gt;&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git --version&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 输出示例：git version 2.45.0&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="2-首次配置告诉-git-你是谁"&gt;2. 首次配置：告诉 Git 你是谁&#10;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;必须配&lt;/strong&gt;，不然无法 commit：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git config --global user.name &lt;span style="color:#e6db74"&gt;&amp;#34;你的名字&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git config --global user.email &lt;span style="color:#e6db74"&gt;&amp;#34;你的邮箱@example.com&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;邮箱建议用 GitHub 注册邮箱&lt;/strong&gt;，这样你的 commit 在 GitHub 上会显示头像。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;常用配置项：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 默认分支名（GitHub 新仓库默认是 main，老项目可能是 master）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git config --global init.defaultBranch main&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 中文文件名不转义（Windows 常用）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git config --global core.quotepath false&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 提交时自动转换 CRLF（推荐 Windows 用户）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git config --global core.autocrlf true&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# macOS / Linux 用户&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git config --global core.autocrlf input&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 漂亮的 log（强烈推荐，后面会介绍怎么配别名）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git config --global alias.lg &lt;span style="color:#e6db74"&gt;&amp;#34;log --oneline --graph --decorate --all&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;查看所有配置：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git config --list&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="3-注册-github-账号"&gt;3. 注册 GitHub 账号&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;打开 &lt;a class="link" href="https://github.com/" target="_blank" rel="noopener"&#10; &gt;github.com&lt;/a&gt; → Sign up&lt;/li&gt;&#10;&lt;li&gt;选用户名（这会是你的个人主页域名的一部分，如 &lt;code&gt;github.com/xxx&lt;/code&gt;，慎重）&lt;/li&gt;&#10;&lt;li&gt;邮箱 + 密码 + 验证&lt;/li&gt;&#10;&lt;li&gt;建议勾选&amp;quot;接收产品更新邮件&amp;quot;（了解新功能）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="4-配置-ssh-密钥强烈推荐省去每次输入密码"&gt;4. 配置 SSH 密钥（强烈推荐，省去每次输入密码）&#10;&lt;/h3&gt;&lt;h4 id="第一步生成密钥"&gt;第一步：生成密钥&#10;&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ssh-keygen -t ed25519 -C &lt;span style="color:#e6db74"&gt;&amp;#34;你的邮箱@example.com&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 一路回车，使用默认路径与空密码即可&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;生成的密钥文件在：&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;文件&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;用途&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;路径（Windows / macOS·Linux）&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;id_ed25519&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;私钥&lt;/strong&gt;，留在本地，绝不能泄露&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;C:\Users\你的用户名\.ssh\id_ed25519&lt;/code&gt; / &lt;code&gt;~/.ssh/id_ed25519&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;id_ed25519.pub&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;strong&gt;公钥&lt;/strong&gt;，需要上传到 GitHub&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;同目录下的 &lt;code&gt;.pub&lt;/code&gt; 文件&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h4 id="第二步把公钥告诉-github"&gt;第二步：把公钥告诉 GitHub&#10;&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 查看并复制公钥内容&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cat ~/.ssh/id_ed25519.pub&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;打开 GitHub → 右上角头像 → &lt;strong&gt;Settings&lt;/strong&gt; → &lt;strong&gt;SSH and GPG keys&lt;/strong&gt; → &lt;strong&gt;New SSH key&lt;/strong&gt; → Title 任意，Key 类型选 Authentication，把公钥粘贴进去 → Add SSH key。&lt;/p&gt;&#10;&lt;h4 id="第三步测试连通性"&gt;第三步：测试连通性&#10;&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ssh -T git@github.com&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 首次会问是否信任，输入 yes&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 看到 &amp;#34;Hi &amp;lt;用户名&amp;gt;! You&amp;#39;ve successfully authenticated...&amp;#34; 就成功了&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;HTTPS vs SSH&lt;/strong&gt;：HTTPS 每次 push 要输用户名密码（或 PAT），SSH 配置一次永久免密。&lt;strong&gt;强烈推荐 SSH&lt;/strong&gt;。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="四最小工作流3-条命令搞定本地版本管理"&gt;四、最小工作流：3 条命令搞定本地版本管理&#10;&lt;/h2&gt;&lt;p&gt;假设你已经在本地有一个项目目录 &lt;code&gt;my-project&lt;/code&gt;，想用 Git 管理它。&lt;/p&gt;&#10;&lt;h3 id="第-1-步初始化仓库"&gt;第 1 步：初始化仓库&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd my-project&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git init&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;执行后目录下会多出一个 &lt;code&gt;.git&lt;/code&gt; 隐藏目录，这就是 Git 的&amp;quot;大脑&amp;quot;。&lt;/p&gt;&#10;&lt;h3 id="第-2-步查看状态"&gt;第 2 步：查看状态&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git status&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;这是你最常用的命令之一，随时告诉你&amp;quot;现在哪些文件被改了、哪些被暂存了&amp;quot;。&lt;/p&gt;&#10;&lt;h3 id="第-3-步第一次提交"&gt;第 3 步：第一次提交&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 把所有文件加入暂存区&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git add .&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 提交到版本库&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git commit -m &lt;span style="color:#e6db74"&gt;&amp;#34;第一次提交：初始化项目&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;到这里，本地 Git 仓库就建好了。完整流程如下：&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart LR&#10; A[1. 创建文件&lt;br/&gt;echo &amp;gt; README.md] --&gt; B[2. git init&lt;br/&gt;初始化仓库]&#10; B --&gt; C[3. git add&lt;br/&gt;加入暂存区]&#10; C --&gt; D[4. git commit&lt;br/&gt;写入版本库]&#10; D --&gt; E([git log&lt;br/&gt;查看历史])&lt;/pre&gt;&lt;p&gt;完整命令行版（可直接复制执行）：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo &lt;span style="color:#e6db74"&gt;&amp;#34;# My Project&amp;#34;&lt;/span&gt; &amp;gt; README.md&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git init&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git add README.md&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git commit -m &lt;span style="color:#e6db74"&gt;&amp;#34;Initial commit&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git log --oneline &lt;span style="color:#75715e"&gt;# 查看提交历史&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#10;&lt;h2 id="五必须吃透的-12-条核心命令"&gt;五、必须吃透的 12 条核心命令&#10;&lt;/h2&gt;&lt;p&gt;下面这些命令覆盖 90% 的日常使用，&lt;strong&gt;务必熟记&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;命令&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;作用&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;常用场景&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;git status&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;查看工作区与暂存区状态&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;任何时候不确定&amp;quot;现在是什么状态&amp;quot;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;git add &amp;lt;file&amp;gt;&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;把文件加入暂存区&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;修改后准备提交&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;git commit -m &amp;quot;msg&amp;quot;&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;提交暂存区的内容到版本库&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;每次&amp;quot;完成一个小功能&amp;quot;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;git log&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;查看提交历史&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;想看过去做过什么&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;git diff&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;查看未暂存的改动&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;提交前确认改了什么&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;git diff --staged&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;查看已暂存的改动&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;提交前最后确认&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;git restore &amp;lt;file&amp;gt;&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;撤销工作区修改（未暂存）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;改错了想回退&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;git restore --staged &amp;lt;file&amp;gt;&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;把文件从暂存区撤回到工作区&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;add 多了想撤销&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;git reset --hard &amp;lt;commit&amp;gt;&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;回退到某个 commit（危险）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;想彻底回到过去&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;git revert &amp;lt;commit&amp;gt;&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;新建一个 commit 撤销指定 commit&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;已推送的内容要回退&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;git stash&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;临时藏起来未提交的改动&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;切分支前不想提交&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;git stash pop&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;把藏起来的改动恢复回来&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;切回分支后继续改&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h3 id="详细解释与示例"&gt;详细解释与示例&#10;&lt;/h3&gt;&lt;h4 id="git-log看历史"&gt;&lt;code&gt;git log&lt;/code&gt;：看历史&#10;&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git log &lt;span style="color:#75715e"&gt;# 完整输出&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git log --oneline &lt;span style="color:#75715e"&gt;# 每个 commit 一行（推荐）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git log --oneline --graph --all &lt;span style="color:#75715e"&gt;# 图形化显示所有分支&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git log --author&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;你的名字&amp;#34;&lt;/span&gt; &lt;span style="color:#75715e"&gt;# 按作者过滤&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git log --since&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;2026-01-01&amp;#34;&lt;/span&gt; &lt;span style="color:#75715e"&gt;# 按时间过滤&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git log -p &amp;lt;file&amp;gt; &lt;span style="color:#75715e"&gt;# 看某个文件的全部改动历史&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="git-diff看差异"&gt;&lt;code&gt;git diff&lt;/code&gt;：看差异&#10;&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git diff &lt;span style="color:#75715e"&gt;# 工作区 vs 暂存区（未 add 的改动）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git diff --staged &lt;span style="color:#75715e"&gt;# 暂存区 vs 版本库（已 add 未 commit 的改动）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git diff main feature &lt;span style="color:#75715e"&gt;# 两个分支的差异&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git diff HEAD~1 HEAD &lt;span style="color:#75715e"&gt;# 当前 commit vs 上一个 commit&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="git-add精确控制粒度"&gt;&lt;code&gt;git add&lt;/code&gt;：精确控制粒度&#10;&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git add file.txt &lt;span style="color:#75715e"&gt;# 单个文件&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git add dir/ &lt;span style="color:#75715e"&gt;# 整个目录&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git add . &lt;span style="color:#75715e"&gt;# 当前目录下所有改动&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git add -p &lt;span style="color:#75715e"&gt;# 交互式：逐个 hunk（代码块）选择是否 add（高级但极好用）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="git-commit写好提交说明"&gt;&lt;code&gt;git commit&lt;/code&gt;：写好提交说明&#10;&lt;/h4&gt;&lt;p&gt;好习惯是&lt;strong&gt;一行不超过 50 字的祈使句&lt;/strong&gt;，如：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;✅ &lt;code&gt;fix: 修复用户登录失败问题&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;✅ &lt;code&gt;docs: 更新 README 安装步骤&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;❌ &lt;code&gt;改了点东西&lt;/code&gt;（太模糊）&lt;/li&gt;&#10;&lt;li&gt;❌ &lt;code&gt;Updated some files.&lt;/code&gt;（同义反复）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;更复杂的多行说明：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git commit -m &lt;span style="color:#e6db74"&gt;&amp;#34;feat: 增加用户导出功能&amp;#34;&lt;/span&gt; -m &lt;span style="color:#e6db74"&gt;&amp;#34;- 支持 CSV 格式&amp;#34;&lt;/span&gt; -m &lt;span style="color:#e6db74"&gt;&amp;#34;- 修复分页边界问题&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;或者用编辑器写：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git commit &lt;span style="color:#75715e"&gt;# 会打开默认编辑器，写完保存关闭即提交&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="撤销类重点中的重点"&gt;撤销类（重点中的重点）&#10;&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 撤销工作区的修改（文件回到上次 add 或 commit 的状态）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git restore file.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 把已 add 的文件撤回到工作区（暂存区取消，但工作区保留）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git restore --staged file.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 修改最后一次 commit（追加改动 / 修改说明）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git commit --amend&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# ⚠️ 注意：amend 会改写 commit hash，**只对**未推送的 commit 使用&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 回退到指定 commit（--hard 会丢掉之后所有改动，慎用）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git reset --hard HEAD~1 &lt;span style="color:#75715e"&gt;# 回退 1 个 commit&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git reset --hard a1b2c3d &lt;span style="color:#75715e"&gt;# 回退到指定哈希&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 安全回退（已推送到远端时用这个，会产生新 commit 撤销改动）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git revert HEAD&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;黄金法则&lt;/strong&gt;：&lt;code&gt;reset&lt;/code&gt; 用来操作本地未推送的 commit；&lt;code&gt;revert&lt;/code&gt; 用来操作已经推送到远端的 commit。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h4 id="git-stash临时存放"&gt;&lt;code&gt;git stash&lt;/code&gt;：临时存放&#10;&lt;/h4&gt;&lt;p&gt;切分支时手头还有改动没提交，又不想带过去污染分支：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git stash &lt;span style="color:#75715e"&gt;# 藏起来&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git stash list &lt;span style="color:#75715e"&gt;# 查看藏起来的列表&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git stash pop &lt;span style="color:#75715e"&gt;# 恢复并删除 stash&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git stash apply stash@&lt;span style="color:#f92672"&gt;{&lt;/span&gt;0&lt;span style="color:#f92672"&gt;}&lt;/span&gt; &lt;span style="color:#75715e"&gt;# 恢复但不删除（可恢复多次）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git stash drop stash@&lt;span style="color:#f92672"&gt;{&lt;/span&gt;0&lt;span style="color:#f92672"&gt;}&lt;/span&gt; &lt;span style="color:#75715e"&gt;# 删除指定 stash&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git stash clear &lt;span style="color:#75715e"&gt;# 清空所有 stash&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#10;&lt;h2 id="六把仓库推上-github远程协作入门"&gt;六、把仓库推上 GitHub：远程协作入门&#10;&lt;/h2&gt;&lt;h3 id="1-在-github-上创建空仓库"&gt;1. 在 GitHub 上创建空仓库&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;登录 GitHub → 右上角 &lt;strong&gt;+&lt;/strong&gt; → &lt;strong&gt;New repository&lt;/strong&gt;&lt;/li&gt;&#10;&lt;li&gt;Repository name：&lt;code&gt;my-project&lt;/code&gt;（最好和本地目录同名）&lt;/li&gt;&#10;&lt;li&gt;选 &lt;strong&gt;Public&lt;/strong&gt;（公开，任何人可看）或 &lt;strong&gt;Private&lt;/strong&gt;（私有）&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;不要&lt;/strong&gt;勾选 &amp;ldquo;Add a README&amp;rdquo; / &amp;ldquo;.gitignore&amp;rdquo; / &amp;ldquo;license&amp;rdquo;（避免和本地冲突）&lt;/li&gt;&#10;&lt;li&gt;点 &lt;strong&gt;Create repository&lt;/strong&gt;&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="2-本地关联远端"&gt;2. 本地关联远端&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;cd my-project &lt;span style="color:#75715e"&gt;# 进入你的本地仓库&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 添加远程仓库（SSH 方式，推荐）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git remote add origin git@github.com:你的用户名/my-project.git&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 如果你用的是 HTTPS&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# git remote add origin https://github.com/你的用户名/my-project.git&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 查看远程仓库&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git remote -v&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="3-第一次推送"&gt;3. 第一次推送&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 推送 main 分支到 origin&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git push -u origin main&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# -u 是 --set-upstream 的简写，建立本地分支与远端分支的关联&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 之后只需 git push 即可&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="4-后续日常推送"&gt;4. 后续日常推送&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git add .&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git commit -m &lt;span style="color:#e6db74"&gt;&amp;#34;feat: xxx&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git push &lt;span style="color:#75715e"&gt;# 不再需要写 origin main，因为 -u 已经记住&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="5-从远端拉取"&gt;5. 从远端拉取&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git pull &lt;span style="color:#75715e"&gt;# 拉取并自动合并（= git fetch + git merge）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git fetch &lt;span style="color:#75715e"&gt;# 只拉取不合并（更安全，适合先看看远端有什么）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;建议&lt;/strong&gt;：日常用 &lt;code&gt;pull&lt;/code&gt;，遇到不确定的远端变更用 &lt;code&gt;fetch&lt;/code&gt; 先看一眼。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="七分支管理团队协作的核心武器"&gt;七、分支管理：团队协作的核心武器&#10;&lt;/h2&gt;&lt;p&gt;分支是 Git 区别于其他版本控制系统的灵魂。它让你在不影响主线的情况下自由实验。&lt;/p&gt;&#10;&lt;h3 id="1-分支的直观理解"&gt;1. 分支的直观理解&#10;&lt;/h3&gt;&lt;pre class="mermaid" style="visibility:hidden"&gt;gitGraph&#10; commit id: "A"&#10; commit id: "B"&#10; branch feature-login&#10; checkout feature-login&#10; commit id: "C"&#10; commit id: "D"&#10; commit id: "E"&#10; checkout main&#10; commit id: "F"&#10; commit id: "G"&#10; merge feature-login&lt;/pre&gt;&lt;p&gt;&lt;code&gt;main&lt;/code&gt; 在 B 之后分叉出 &lt;code&gt;feature-login&lt;/code&gt;，你在 &lt;code&gt;feature-login&lt;/code&gt; 上做了 C/D/E，主线 &lt;code&gt;main&lt;/code&gt; 继续往前走到 F/G。等你做完功能后，把 &lt;code&gt;feature-login&lt;/code&gt; 合并回 &lt;code&gt;main&lt;/code&gt;，历史就合到一起了。&lt;/p&gt;&#10;&lt;h3 id="2-常用分支命令"&gt;2. 常用分支命令&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 查看所有本地分支&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git branch&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 查看所有分支（包括远端）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git branch -a&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 创建分支&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git branch feature-login&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 切换到指定分支（旧语法）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git checkout feature-login&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 创建并切换（新语法，推荐）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git switch -c feature-login&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 或：git checkout -b feature-login&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 删除已合并的分支&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git branch -d feature-login&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 强制删除未合并的分支（会丢改动，慎用）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git branch -D feature-login&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 重命名当前分支&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git branch -m new-name&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="3-合并分支"&gt;3. 合并分支&#10;&lt;/h3&gt;&lt;h4 id="merge-方式保留历史"&gt;Merge 方式（保留历史）&#10;&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 切回主分支&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git switch main&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 把 feature 分支合并进来&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git merge feature-login&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;合并后会产生一个&lt;strong&gt;合并 commit&lt;/strong&gt;，完整保留分支历史。&lt;/p&gt;&#10;&lt;h4 id="rebase-方式线性历史"&gt;Rebase 方式（线性历史）&#10;&lt;/h4&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 在 feature 分支上&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git switch feature-login&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git rebase main&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# feature 分支的 commit 会被&amp;#34;重放&amp;#34;到 main 顶端&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;之后切回 main 做 fast-forward merge，历史就是干净的直线。&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;何时用哪个&lt;/strong&gt;：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;&lt;strong&gt;个人本地分支、还没推送&lt;/strong&gt;：随便 rebase，历史更干净&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;多人共享的远端分支&lt;/strong&gt;：&lt;strong&gt;绝对不要 rebase&lt;/strong&gt;，会扰乱其他人的本地历史&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;不确定时&lt;/strong&gt;：用 merge&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;&lt;strong&gt;两种方式的结果对比&lt;/strong&gt;（同一起点 &lt;code&gt;B&lt;/code&gt;，分支 &lt;code&gt;feature&lt;/code&gt; 上做了 C/D/E，主线在 B 之后又走了 F）：&lt;/p&gt;&#10;&lt;pre class="mermaid" style="visibility:hidden"&gt;%% merge 方式：保留分支拓扑，多一个合并 commit&#10;gitGraph&#10; commit id: "A"&#10; commit id: "B"&#10; branch feature&#10; checkout feature&#10; commit id: "C"&#10; commit id: "D"&#10; commit id: "E"&#10; checkout main&#10; commit id: "F"&#10; merge feature tag: "merge commit"&lt;/pre&gt;&lt;pre class="mermaid" style="visibility:hidden"&gt;%% rebase 方式：feature 被"重放"到 main 顶端，main merge 时是 fast-forward&#10;gitGraph&#10; commit id: "A"&#10; commit id: "B"&#10; branch feature&#10; checkout feature&#10; commit id: "C'"&#10; commit id: "D'"&#10; commit id: "E'"&#10; checkout main&#10; commit id: "F"&#10; merge feature tag: "fast-forward"&lt;/pre&gt;&lt;h3 id="4-冲突解决"&gt;4. 冲突解决&#10;&lt;/h3&gt;&lt;p&gt;当你 merge / rebase / pull 时，两个分支对同一行做了不同修改，Git 会暂停并提示：&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;CONFLICT (content): Merge conflict in src/app.js&#10;Automatic merge failed; fix conflicts and then commit the result.&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;打开冲突文件，会看到冲突标记：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-javascript" data-lang="javascript"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;HEAD&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;main 分支的代码&amp;#34;&lt;/span&gt;);&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;=======&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a6e22e"&gt;console&lt;/span&gt;.&lt;span style="color:#a6e22e"&gt;log&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;feature 分支的代码&amp;#34;&lt;/span&gt;);&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;feature&lt;/span&gt;&lt;span style="color:#f92672"&gt;-&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;login&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;手动编辑保留正确内容&lt;/strong&gt;，删除 &lt;code&gt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&lt;/code&gt; &lt;code&gt;====&lt;/code&gt; &lt;code&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&lt;/code&gt; 标记，然后：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git add src/app.js&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git commit &lt;span style="color:#75715e"&gt;# 完成合并&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 如果是 rebase，继续：git rebase --continue&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="5-一个推荐的工作流git-flow-简化版"&gt;5. 一个推荐的工作流（Git Flow 简化版）&#10;&lt;/h3&gt;&lt;p&gt;适合个人 / 小团队：&lt;/p&gt;&#10;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;分支&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;用途&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;从哪拉&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;合并到&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;main&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;稳定版本&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;—&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;—&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;dev&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;开发集成&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;main&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;main&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;feature/*&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;新功能&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;dev&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;dev&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;fix/*&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;修 bug&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;dev&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;dev&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;p&gt;日常节奏：在 &lt;code&gt;feature/xxx&lt;/code&gt; 上写功能 → PR 合并到 &lt;code&gt;dev&lt;/code&gt; → 稳定后 &lt;code&gt;dev&lt;/code&gt; 合并到 &lt;code&gt;main&lt;/code&gt;。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="八pull-request团队协作的灵魂"&gt;八、Pull Request：团队协作的灵魂&#10;&lt;/h2&gt;&lt;p&gt;Pull Request（PR，GitLab 上叫 Merge Request）是 GitHub 的&amp;quot;代码评审&amp;quot;机制。&lt;/p&gt;&#10;&lt;h3 id="1-典型流程"&gt;1. 典型流程&#10;&lt;/h3&gt;&lt;pre class="mermaid" style="visibility:hidden"&gt;flowchart TD&#10; A[Fork 主仓库&lt;br/&gt;到自己的账号] --&gt; B[Clone 到本地&lt;br/&gt;git clone fork-url]&#10; B --&gt; C[添加 upstream 远程&lt;br/&gt;指向原作者仓库]&#10; C --&gt; D[新建功能分支&lt;br/&gt;git switch -c fix-bug]&#10; D --&gt; E[改代码 + add + commit&lt;br/&gt;+ push 到 fork 分支]&#10; E --&gt; F[在 GitHub 创建 PR&lt;br/&gt;Compare &amp; pull request]&#10; F --&gt; G{评审结果}&#10; G --&gt;|需修改| H[本地继续修改&lt;br/&gt;+ 重新 push]&#10; H --&gt; F&#10; G --&gt;|通过| I[Merge 到主分支]&#10; I --&gt; J([本地 PR 已合并])&lt;/pre&gt;&lt;p&gt;要点展开：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;Fork 主仓库&lt;/strong&gt;（在 GitHub 网页上点 Fork）到自己的账号下&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;克隆 fork 仓库&lt;/strong&gt;到本地：&lt;code&gt;git clone git@github.com:你的用户名/project.git&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;添加上游：&lt;code&gt;git remote add upstream git@github.com:原作者/project.git&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;创建分支：&lt;code&gt;git switch -c fix-bug&lt;/code&gt;&lt;/li&gt;&#10;&lt;li&gt;改代码 → &lt;code&gt;add&lt;/code&gt; → &lt;code&gt;commit&lt;/code&gt; → &lt;code&gt;push&lt;/code&gt; 到自己 fork 的 &lt;code&gt;fix-bug&lt;/code&gt; 分支&lt;/li&gt;&#10;&lt;li&gt;在 GitHub 上点 &lt;strong&gt;Compare &amp;amp; pull request&lt;/strong&gt; → 写标题和说明 → 创建 PR&lt;/li&gt;&#10;&lt;li&gt;项目维护者评审（review）→ 讨论 → 同意后合并（merge）&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="2-写好-pr-说明"&gt;2. 写好 PR 说明&#10;&lt;/h3&gt;&lt;p&gt;好的 PR 模板：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;## 改了什么&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; 新增 xxx 接口&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;-&lt;/span&gt; 修复 yyy bug&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;## 怎么测&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;1.&lt;/span&gt; 启动 xxx 服务&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;2.&lt;/span&gt; 调用 xxx 接口&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;3.&lt;/span&gt; 看到返回 zzz&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;## 截图 / 日志&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;（可选）&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;## 相关 Issue&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Closes #123&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="3-code-review-基本礼仪"&gt;3. Code Review 基本礼仪&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;对别人的 PR：就事论事、对代码不对人；提问而非命令（&amp;ldquo;这里我不太理解&amp;rdquo; vs &amp;ldquo;这里写错了&amp;rdquo;）&lt;/li&gt;&#10;&lt;li&gt;对自己的 PR：保持小颗粒度（一个 PR 只做一件事）；自己先 review 一遍再请求评审&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="九撤销与恢复挽救你的误操作"&gt;九、撤销与恢复：挽救你的&amp;quot;误操作&amp;quot;&#10;&lt;/h2&gt;&lt;h3 id="1-撤销工作区的改动"&gt;1. 撤销工作区的改动&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git restore file.txt &lt;span style="color:#75715e"&gt;# 撤销单个文件&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git restore . &lt;span style="color:#75715e"&gt;# 撤销所有改动&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="2-撤销暂存"&gt;2. 撤销暂存&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git restore --staged file.txt &lt;span style="color:#75715e"&gt;# 撤销单个文件的暂存&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git restore --staged . &lt;span style="color:#75715e"&gt;# 撤销所有暂存&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="3-撤销最后一次-commit未推送"&gt;3. 撤销最后一次 commit（未推送）&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git commit --amend &lt;span style="color:#75715e"&gt;# 改写最后一次 commit&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 或&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git reset --soft HEAD~1 &lt;span style="color:#75715e"&gt;# 撤销 commit 但保留改动在暂存区&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git reset HEAD~1 &lt;span style="color:#75715e"&gt;# 撤销 commit 改动回到工作区&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git reset --hard HEAD~1 &lt;span style="color:#75715e"&gt;# 撤销 commit 并丢弃所有改动（⚠️ 危险）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="4-撤销已推送的-commit"&gt;4. 撤销已推送的 commit&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 生成一个新 commit 撤销指定 commit 的改动（推荐，保留历史）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git revert a1b2c3d&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git push&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 或者直接回退远端分支（⚠️ 危险，会影响其他人）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git reset --hard HEAD~1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git push --force-with-lease&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;code&gt;git push --force&lt;/code&gt; 是危险操作，会&lt;strong&gt;覆盖&lt;/strong&gt;远端历史，可能让协作者的工作丢失。优先用 &lt;code&gt;--force-with-lease&lt;/code&gt;（如果远端有你不知道的新 commit，会拒绝覆盖）。&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;h3 id="5-找回丢失的-commit"&gt;5. 找回丢失的 commit&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git reflog &lt;span style="color:#75715e"&gt;# 查看所有 HEAD 移动记录（30 天内）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 找到你想要的哈希，然后&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git reset --hard &amp;lt;哈希&amp;gt; &lt;span style="color:#75715e"&gt;# 回到那个 commit&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;reflog&lt;/code&gt; 是 Git 的&amp;quot;后悔药&amp;quot;，大多数丢失的 commit 都能从这里找回来。&lt;/p&gt;&#10;&lt;h3 id="6-恢复误删的分支"&gt;6. 恢复误删的分支&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git reflog | grep &lt;span style="color:#e6db74"&gt;&amp;#34;分支删除前的提交&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git switch -c branch-name &amp;lt;哈希&amp;gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#10;&lt;h2 id="十gitignore忽略不该追踪的文件"&gt;十、.gitignore：忽略不该追踪的文件&#10;&lt;/h2&gt;&lt;p&gt;你不想把 &lt;code&gt;node_modules/&lt;/code&gt;、&lt;code&gt;__pycache__/&lt;/code&gt;、&lt;code&gt;.env&lt;/code&gt;、&lt;code&gt;*.log&lt;/code&gt;、&lt;code&gt;dist/&lt;/code&gt; 这些文件提交到仓库。&lt;code&gt;.gitignore&lt;/code&gt; 就是干这个的。&lt;/p&gt;&#10;&lt;h3 id="1-创建方式"&gt;1. 创建方式&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;方式 A：仓库根目录创建 &lt;code&gt;.gitignore&lt;/code&gt; 文件&lt;/li&gt;&#10;&lt;li&gt;方式 B：&lt;code&gt;hugo new site&lt;/code&gt; 等命令会自动生成模板&lt;/li&gt;&#10;&lt;li&gt;方式 C：GitHub 仓库创建时直接选模板&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="2-常用模板按语言--框架"&gt;2. 常用模板（按语言 / 框架）&#10;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;Node.js&lt;/strong&gt;&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;node_modules/&#10;dist/&#10;.env&#10;npm-debug.log*&#10;yarn-debug.log*&#10;yarn-error.log*&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Python&lt;/strong&gt;&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;__pycache__/&#10;*.py[cod]&#10;*.egg-info/&#10;.venv/&#10;venv/&#10;.env&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;Hugo&lt;/strong&gt;&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;public/&#10;resources/_gen/&#10;.hugo_build.lock&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;通用建议&lt;/strong&gt;&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;.DS_Store # macOS&#10;Thumbs.db # Windows&#10;*.swp # Vim&#10;.vscode/ # VSCode 个人配置（按需）&#10;.idea/ # JetBrains 个人配置（按需）&#10;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="3-已经被追踪的文件怎么办"&gt;3. 已经被追踪的文件怎么办？&#10;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;.gitignore&lt;/code&gt; 只对&lt;strong&gt;未追踪&lt;/strong&gt;的文件生效。如果某个文件已经被 &lt;code&gt;git add&lt;/code&gt; 过了，需要先取消追踪：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 从版本库移除但保留本地文件&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git rm --cached file.txt&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 然后提交&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git commit -m &lt;span style="color:#e6db74"&gt;&amp;#34;chore: 从追踪列表移除 file.txt&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="4-一行速记"&gt;4. 一行速记&#10;&lt;/h3&gt;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;模式&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;含义&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;*.log&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;所有 .log 文件&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;/TODO&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;根目录的 TODO 文件&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;build/&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;所有 build 目录&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;doc/*.txt&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;doc 目录下（不递归）的 .txt&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;doc/**/*.txt&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;doc 目录及其子目录的所有 .txt&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;!README.md&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;否定，不忽略这个&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="十一github-进阶功能"&gt;十一、GitHub 进阶功能&#10;&lt;/h2&gt;&lt;h3 id="1-issue任务与缺陷追踪"&gt;1. Issue：任务与缺陷追踪&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;任何人都可以在公开仓库提 Issue&lt;/li&gt;&#10;&lt;li&gt;标题 + 描述 + 标签（bug / enhancement / question / documentation）&lt;/li&gt;&#10;&lt;li&gt;用 &lt;code&gt;#123&lt;/code&gt; 在 commit / PR 中引用，会自动建立双向链接&lt;/li&gt;&#10;&lt;li&gt;在 commit message 写 &lt;code&gt;Fixes #123&lt;/code&gt; 或 &lt;code&gt;Closes #123&lt;/code&gt;，合并 PR 后会自动关闭对应 Issue&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;h3 id="2-projects看板"&gt;2. Projects：看板&#10;&lt;/h3&gt;&lt;p&gt;类似 Trello 的项目看板，可以把 Issue / PR 拖拽到不同列（Todo / In Progress / Done），适合个人任务管理。&lt;/p&gt;&#10;&lt;h3 id="3-wiki项目文档"&gt;3. Wiki：项目文档&#10;&lt;/h3&gt;&lt;p&gt;仓库内的多页面文档系统，适合写详细文档、API 参考、FAQ。&lt;/p&gt;&#10;&lt;h3 id="4-github-actions自动化-cicd"&gt;4. GitHub Actions：自动化 CI/CD&#10;&lt;/h3&gt;&lt;p&gt;在仓库的 &lt;code&gt;.github/workflows/&lt;/code&gt; 下放 YAML 文件，可以做到：&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;PR 触发自动跑测试&lt;/li&gt;&#10;&lt;li&gt;push 后自动部署（你正在看的 Hugo 博客就是这条链路）&lt;/li&gt;&#10;&lt;li&gt;自动发版、自动发 release notes&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;示例 &lt;code&gt;.github/workflows/hugo.yml&lt;/code&gt;：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;name&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;Deploy Hugo to GitHub Pages&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;on&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;push&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;branches&lt;/span&gt;: [&lt;span style="color:#ae81ff"&gt;main]&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;jobs&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;build&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;runs-on&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;ubuntu-latest&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;steps&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;uses&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;actions/checkout@v4&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;uses&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;peaceiris/actions-hugo@v3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;with&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;hugo-version&lt;/span&gt;: &lt;span style="color:#e6db74"&gt;&amp;#39;latest&amp;#39;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;extended&lt;/span&gt;: &lt;span style="color:#66d9ef"&gt;true&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;run&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;hugo --minify&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;uses&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;actions/upload-pages-artifact@v3&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;with&lt;/span&gt;:&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;path&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;./public&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#f92672"&gt;id&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;deployment&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;uses&lt;/span&gt;: &lt;span style="color:#ae81ff"&gt;actions/deploy-pages@v4&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="5-github-pages免费静态网站"&gt;5. GitHub Pages：免费静态网站&#10;&lt;/h3&gt;&lt;p&gt;仓库 Settings → Pages → 选分支 → 即可发布静态站点。&lt;strong&gt;个人博客 / 项目文档最简方案&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;h3 id="6-gist代码片段"&gt;6. Gist：代码片段&#10;&lt;/h3&gt;&lt;p&gt;适合分享单文件 / 小段代码。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="十二常见坑与最佳实践"&gt;十二、常见坑与最佳实践&#10;&lt;/h2&gt;&lt;h3 id="1-提交粒度"&gt;1. 提交粒度&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;✅ &lt;strong&gt;一个 commit 只做一件事&lt;/strong&gt;：修一个 bug / 加一个功能 / 改一处文档&lt;/li&gt;&#10;&lt;li&gt;❌ 一次 commit 改 50 个文件、跨多个功能&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;好粒度让你能精准回退、精准 cherry-pick。&lt;/p&gt;&#10;&lt;h3 id="2-不要提交的东西"&gt;2. 不要提交的东西&#10;&lt;/h3&gt;&lt;table&gt;&#10;&#9;&lt;thead&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;类型&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;例子&lt;/th&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;th&gt;处理&lt;/th&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/thead&gt;&#10;&#9;&lt;tbody&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;编译产物&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;dist/&lt;/code&gt; &lt;code&gt;build/&lt;/code&gt; &lt;code&gt;public/&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;加 &lt;code&gt;.gitignore&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;依赖&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;node_modules/&lt;/code&gt; &lt;code&gt;vendor/&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;加 &lt;code&gt;.gitignore&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;敏感信息&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;.env&lt;/code&gt; &lt;code&gt;config.json&lt;/code&gt; 里的密码&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;加 &lt;code&gt;.gitignore&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;IDE 配置&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;.idea/&lt;/code&gt; &lt;code&gt;.vscode/&lt;/code&gt;（团队统一除外）&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;加 &lt;code&gt;.gitignore&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;系统文件&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;&lt;code&gt;.DS_Store&lt;/code&gt; &lt;code&gt;Thumbs.db&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;加 &lt;code&gt;.gitignore&lt;/code&gt;&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&#9;&#9;&lt;tr&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;大型二进制&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;视频、设计稿 PSD&lt;/td&gt;&#10;&#9;&#9;&#9;&#9;&#9;&lt;td&gt;用 Git LFS&lt;/td&gt;&#10;&#9;&#9;&#9;&lt;/tr&gt;&#10;&#9;&lt;/tbody&gt;&#10;&lt;/table&gt;&#10;&lt;h3 id="3-已经提交了敏感信息"&gt;3. 已经提交了敏感信息？&#10;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;立刻做两件事&lt;/strong&gt;：&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;改密码 / 撤销凭证&lt;/li&gt;&#10;&lt;li&gt;从 Git 历史清除（用 &lt;code&gt;git filter-repo&lt;/code&gt; 或 BFG Repo-Cleaner）&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;p&gt;只在最新 commit 改不够，&lt;strong&gt;必须清理历史&lt;/strong&gt;。如果推到 GitHub 是公开仓库，敏感信息相当于已经泄露。&lt;/p&gt;&#10;&lt;h3 id="4-大文件用-git-lfs"&gt;4. 大文件：用 Git LFS&#10;&lt;/h3&gt;&lt;p&gt;Git 不擅长管理大型二进制文件（几十 MB 以上）。Git LFS（Large File Storage）会用指针文件替代真实内容，存到独立存储。&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git lfs install&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git lfs track &lt;span style="color:#e6db74"&gt;&amp;#34;*.psd&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git add .gitattributes&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git add *.psd&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git commit -m &lt;span style="color:#e6db74"&gt;&amp;#34;add design files via LFS&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="5-避免-force-push-到共享分支"&gt;5. 避免 force push 到共享分支&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git push --force-with-lease &lt;span style="color:#75715e"&gt;# 安全版：远端没新 commit 才允许&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;绝对禁止 &lt;code&gt;git push --force&lt;/code&gt; 到 &lt;code&gt;main&lt;/code&gt; / &lt;code&gt;dev&lt;/code&gt; 等多人协作的分支。&lt;/p&gt;&#10;&lt;h3 id="6-别在主分支上直接改"&gt;6. 别在主分支上直接改&#10;&lt;/h3&gt;&lt;p&gt;永远在 feature 分支上改，PR 合并。即便是个人项目，也养成这个习惯。&lt;/p&gt;&#10;&lt;h3 id="7-commit-message-模板"&gt;7. commit message 模板&#10;&lt;/h3&gt;&lt;p&gt;在仓库根目录放 &lt;code&gt;.gitmessage&lt;/code&gt;：&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;# &amp;lt;type&amp;gt;(&amp;lt;scope&amp;gt;): &amp;lt;subject&amp;gt;&#10;#&#10;# body (optional)&#10;#&#10;# footer (optional)&#10;&#10;# type: feat fix docs style refactor test chore&#10;&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;配置：&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git config commit.template .gitmessage&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="8-提速别名与工具"&gt;8. 提速：别名与工具&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# 配别名（写到 ~/.gitconfig 也行）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git config --global alias.st status&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git config --global alias.co switch&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git config --global alias.br branch&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git config --global alias.lg &lt;span style="color:#e6db74"&gt;&amp;#34;log --oneline --graph --decorate --all&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git config --global alias.unstage &lt;span style="color:#e6db74"&gt;&amp;#34;restore --staged&amp;#34;&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;之后 &lt;code&gt;git st&lt;/code&gt; 就等于 &lt;code&gt;git status&lt;/code&gt;。&lt;/p&gt;&#10;&lt;h3 id="9-出错了怎么办"&gt;9. 出错了怎么办？&#10;&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;任何误操作，先 &lt;code&gt;git reflog&lt;/code&gt;&lt;/strong&gt;。它会告诉你 HEAD 走过的每一步，绝大多数情况都能恢复。&lt;/p&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="十三推荐学习路径"&gt;十三、推荐学习路径&#10;&lt;/h2&gt;&lt;ol&gt;&#10;&lt;li&gt;&lt;strong&gt;第一周&lt;/strong&gt;：掌握第 1～6 节命令，足够日常提交、推送&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;第二周&lt;/strong&gt;：学分支管理与冲突处理&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;第三周&lt;/strong&gt;：上手一次 PR 流程（哪怕是自己的仓库）&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;第一个月&lt;/strong&gt;：配置 SSH、&lt;code&gt;.gitignore&lt;/code&gt;、GitHub Actions&lt;/li&gt;&#10;&lt;li&gt;&lt;strong&gt;持续练习&lt;/strong&gt;：用 Git 管理一切文本内容（博客 / 笔记 / 配置文件）&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="推荐资源"&gt;推荐资源&#10;&lt;/h3&gt;&lt;ul&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://git-scm.com/book/zh/v2" target="_blank" rel="noopener"&#10; &gt;Pro Git 中文版&lt;/a&gt;（官方免费书，最权威）&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://learngitbranching.js.org/?locale=zh_CN" target="_blank" rel="noopener"&#10; &gt;Learn Git Branching&lt;/a&gt;（交互式可视化练习，强烈推荐）&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://ohshitgit.com/" target="_blank" rel="noopener"&#10; &gt;Oh Shit, Git!?!&lt;/a&gt;（急救手册，英文）&lt;/li&gt;&#10;&lt;li&gt;&lt;a class="link" href="https://docs.github.com/zh" target="_blank" rel="noopener"&#10; &gt;GitHub Docs&lt;/a&gt;（官方中文文档）&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;hr&gt;&#10;&lt;h2 id="十四速查表cheat-sheet"&gt;十四、速查表（Cheat Sheet）&#10;&lt;/h2&gt;&lt;h3 id="仓库操作"&gt;仓库操作&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git init &lt;span style="color:#75715e"&gt;# 初始化仓库&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git clone &amp;lt;url&amp;gt; &lt;span style="color:#75715e"&gt;# 克隆远端仓库&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git remote add origin &amp;lt;url&amp;gt; &lt;span style="color:#75715e"&gt;# 添加远程&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git remote -v &lt;span style="color:#75715e"&gt;# 查看远程&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="文件操作"&gt;文件操作&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git status &lt;span style="color:#75715e"&gt;# 查看状态&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git add &amp;lt;file&amp;gt; &lt;span style="color:#75715e"&gt;# 加入暂存区&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git add . &lt;span style="color:#75715e"&gt;# 暂存区所有改动&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git commit -m &lt;span style="color:#e6db74"&gt;&amp;#34;msg&amp;#34;&lt;/span&gt; &lt;span style="color:#75715e"&gt;# 提交&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git commit --amend &lt;span style="color:#75715e"&gt;# 改写最后一次 commit&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git restore &amp;lt;file&amp;gt; &lt;span style="color:#75715e"&gt;# 撤销工作区改动&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git restore --staged &amp;lt;file&amp;gt; &lt;span style="color:#75715e"&gt;# 撤销暂存&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git rm &amp;lt;file&amp;gt; &lt;span style="color:#75715e"&gt;# 删除文件并暂存&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git mv &amp;lt;old&amp;gt; &amp;lt;new&amp;gt; &lt;span style="color:#75715e"&gt;# 重命名文件并暂存&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="查看历史"&gt;查看历史&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git log &lt;span style="color:#75715e"&gt;# 完整历史&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git log --oneline &lt;span style="color:#75715e"&gt;# 简洁历史&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git log --graph --all &lt;span style="color:#75715e"&gt;# 图形化所有分支&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git diff &lt;span style="color:#75715e"&gt;# 工作区 vs 暂存区&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git diff --staged &lt;span style="color:#75715e"&gt;# 暂存区 vs 版本库&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git show &amp;lt;commit&amp;gt; &lt;span style="color:#75715e"&gt;# 看某次提交详情&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="分支"&gt;分支&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git branch &lt;span style="color:#75715e"&gt;# 列出本地分支&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git branch -a &lt;span style="color:#75715e"&gt;# 列出所有分支&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git branch &amp;lt;name&amp;gt; &lt;span style="color:#75715e"&gt;# 创建分支&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git switch &amp;lt;name&amp;gt; &lt;span style="color:#75715e"&gt;# 切换分支&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git switch -c &amp;lt;name&amp;gt; &lt;span style="color:#75715e"&gt;# 创建并切换&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git branch -d &amp;lt;name&amp;gt; &lt;span style="color:#75715e"&gt;# 删除已合并分支&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git branch -D &amp;lt;name&amp;gt; &lt;span style="color:#75715e"&gt;# 强制删除分支&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="合并"&gt;合并&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git merge &amp;lt;branch&amp;gt; &lt;span style="color:#75715e"&gt;# 合并分支&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git rebase &amp;lt;branch&amp;gt; &lt;span style="color:#75715e"&gt;# 变基&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git rebase -i HEAD~3 &lt;span style="color:#75715e"&gt;# 交互式 rebase（改写最近 3 个 commit）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="远程"&gt;远程&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git fetch &lt;span style="color:#75715e"&gt;# 拉取远端（不合并）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git pull &lt;span style="color:#75715e"&gt;# 拉取并合并&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git push &lt;span style="color:#75715e"&gt;# 推送到远端&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git push -u origin &amp;lt;branch&amp;gt; &lt;span style="color:#75715e"&gt;# 首次推送并建立关联&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git push --force-with-lease &lt;span style="color:#75715e"&gt;# 安全强推&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="撤销与恢复"&gt;撤销与恢复&#10;&lt;/h3&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git reset --soft HEAD~1 &lt;span style="color:#75715e"&gt;# 撤销 commit 改动留暂存区&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git reset --mixed HEAD~1 &lt;span style="color:#75715e"&gt;# 撤销 commit 改动回工作区&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git reset --hard HEAD~1 &lt;span style="color:#75715e"&gt;# 撤销 commit 并丢弃改动&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git revert &amp;lt;commit&amp;gt; &lt;span style="color:#75715e"&gt;# 新 commit 撤销指定 commit&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git stash &lt;span style="color:#75715e"&gt;# 临时存放改动&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git stash pop &lt;span style="color:#75715e"&gt;# 恢复并删除 stash&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;git reflog &lt;span style="color:#75715e"&gt;# 查看 HEAD 历史（救命用）&lt;/span&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;&#10;&lt;h2 id="十五写在最后"&gt;十五、写在最后&#10;&lt;/h2&gt;&lt;p&gt;Git 的学习曲线前陡后缓：&lt;strong&gt;前 2 小时会觉得概念很多、命令记不住&lt;/strong&gt;；&lt;strong&gt;用满一周后会有&amp;quot;豁然开朗&amp;quot;的感觉&lt;/strong&gt;；&lt;strong&gt;用满一个月后你就再也离不开它了&lt;/strong&gt;。&lt;/p&gt;&#10;&lt;p&gt;不要试图一次背完所有命令。&lt;strong&gt;先记住 5 条&lt;/strong&gt;：&lt;code&gt;add&lt;/code&gt; / &lt;code&gt;commit&lt;/code&gt; / &lt;code&gt;push&lt;/code&gt; / &lt;code&gt;pull&lt;/code&gt; / &lt;code&gt;status&lt;/code&gt;，跑起来再说。其它的查速查表或本文就好。&lt;/p&gt;&#10;&lt;p&gt;最后送一句 Git 社区的老话：&lt;/p&gt;&#10;&#10; &lt;blockquote&gt;&#10; &lt;p&gt;&lt;strong&gt;&amp;ldquo;Commit early, commit often, push frequently.&amp;rdquo;&lt;/strong&gt;&#10;（早提交，多提交，常推送。）&lt;/p&gt;&#10;&#10; &lt;/blockquote&gt;&#10;&lt;p&gt;祝你在版本控制的路上少踩坑、多享受。&lt;/p&gt;&#10;</description></item></channel></rss>