<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Git on September的个人空间</title><link>https://blog.september.win/tags/git/</link><description>Recent content in Git on September的个人空间</description><generator>Hugo -- gohugo.io</generator><language>zh</language><lastBuildDate>Sun, 24 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.september.win/tags/git/index.xml" rel="self" type="application/rss+xml"/><item><title>Git 与 GitHub 核心概念入门笔记</title><link>https://blog.september.win/p/git-github-core-concepts/</link><pubDate>Sun, 24 May 2026 00:00:00 +0000</pubDate><guid>https://blog.september.win/p/git-github-core-concepts/</guid><description>&lt;p&gt;这篇是把一份 Git 与 GitHub 的长笔记重新整理成博客版。原笔记覆盖了从安装配置、初始化仓库，到分支协作、Pull Request、Cherry-pick、Stash、Rebase 等常用操作。&lt;/p&gt;
&lt;p&gt;如果只想记住一句话：Git 负责记录代码历史，GitHub 负责把仓库放到网上协作。前者是版本控制工具，后者是代码托管和协作平台。&lt;/p&gt;
&lt;h2 id="git-和-github-是什么"&gt;Git 和 GitHub 是什么
&lt;/h2&gt;&lt;p&gt;Git 是一个版本控制工具。它解决的问题是：文件改来改去以后，怎么知道每次改了什么、谁改的、什么时候改的，以及怎么回到之前的状态。&lt;/p&gt;
&lt;p&gt;GitHub 是基于 Git 的代码托管平台。它把本地 Git 仓库放到云端，让别人可以浏览、下载、协作、提 Issue、提交 Pull Request。&lt;/p&gt;
&lt;p&gt;可以简单理解为：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Git：本地版本管理系统&lt;/li&gt;
&lt;li&gt;GitHub：远程仓库和协作平台&lt;/li&gt;
&lt;li&gt;Repository：一个项目仓库&lt;/li&gt;
&lt;li&gt;Commit：一次历史快照&lt;/li&gt;
&lt;li&gt;Branch：一条开发线&lt;/li&gt;
&lt;li&gt;Pull Request：请求别人合并你的改动&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Git 不依赖 GitHub 也能用，但多人协作和开源项目通常会搭配 GitHub 一起使用。&lt;/p&gt;
&lt;h2 id="准备工作"&gt;准备工作
&lt;/h2&gt;&lt;p&gt;最基础的环境一般包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Git&lt;/li&gt;
&lt;li&gt;VS Code&lt;/li&gt;
&lt;li&gt;一个 GitHub 账号&lt;/li&gt;
&lt;li&gt;可选：Codex、Claude Code 这类 AI coding agent&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;安装 Git 后，可以用下面命令确认：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git --version
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;新电脑第一次使用 Git，建议先配置用户名和邮箱：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git config --global user.name &lt;span class="s2"&gt;&amp;#34;你的名字&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git config --global user.email &lt;span class="s2"&gt;&amp;#34;你的邮箱&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这两个信息会写进每次提交记录里，用来标识这次 Commit 是谁提交的。&lt;/p&gt;
&lt;h2 id="初始化仓库"&gt;初始化仓库
&lt;/h2&gt;&lt;p&gt;把一个普通文件夹变成 Git 仓库，可以执行：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git init
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;执行后，文件夹里会出现一个隐藏目录：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;.git/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;这个目录保存了 Git 的全部版本信息。一般不要手动改它。删除 &lt;code&gt;.git/&lt;/code&gt;，就相当于取消这个文件夹的 Git 管理。&lt;/p&gt;
&lt;p&gt;在 VS Code 里，也可以通过 Source Control 面板点击 &lt;code&gt;Initialize Repository&lt;/code&gt; 完成初始化。&lt;/p&gt;
&lt;h2 id="gitignore-忽略文件"&gt;.gitignore 忽略文件
&lt;/h2&gt;&lt;p&gt;并不是项目里的所有文件都应该提交。&lt;/p&gt;
&lt;p&gt;常见需要忽略的内容包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;.env&lt;/code&gt;：可能保存密钥、Token、数据库密码&lt;/li&gt;
&lt;li&gt;&lt;code&gt;node_modules/&lt;/code&gt;：依赖包体积大，可以通过 &lt;code&gt;npm install&lt;/code&gt; 重新安装&lt;/li&gt;
&lt;li&gt;构建产物：例如 &lt;code&gt;dist/&lt;/code&gt;、&lt;code&gt;build/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;日志和缓存文件&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;可以在仓库根目录创建 &lt;code&gt;.gitignore&lt;/code&gt;：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;.env
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;node_modules/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dist/
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;*.log
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;原则是：源码、配置模板、文档应该提交；机器生成的临时文件、依赖目录、隐私密钥不要提交。&lt;/p&gt;
&lt;h2 id="commit-是一次快照"&gt;Commit 是一次快照
&lt;/h2&gt;&lt;p&gt;Commit 可以理解为给项目拍了一张快照。&lt;/p&gt;
&lt;p&gt;一次完整的提交流程通常是：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git status
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git add .
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git commit -m &lt;span class="s2"&gt;&amp;#34;说明这次改了什么&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;其中：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;git status&lt;/code&gt;：看当前有哪些文件被修改&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git add&lt;/code&gt;：把改动放进暂存区&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git commit&lt;/code&gt;：把暂存区内容保存成一次历史记录&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;提交信息不要写成“修改”“更新”这种空话。更好的写法是描述这次改动的意图，比如：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git commit -m &lt;span class="s2"&gt;&amp;#34;Add prompt guide category filter&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git commit -m &lt;span class="s2"&gt;&amp;#34;Fix homepage sidebar link&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git commit -m &lt;span class="s2"&gt;&amp;#34;Translate RenPy interpolation guide&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;以后回看历史时，Commit Message 是最快的索引。&lt;/p&gt;
&lt;h2 id="工作区暂存区本地仓库远程仓库"&gt;工作区、暂存区、本地仓库、远程仓库
&lt;/h2&gt;&lt;p&gt;理解 Git 最重要的是理解几个区域。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;区域&lt;/th&gt;
 &lt;th&gt;含义&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Working Directory&lt;/td&gt;
 &lt;td&gt;当前文件夹里正在编辑的文件&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Staging Area&lt;/td&gt;
 &lt;td&gt;准备提交的改动，也就是 &lt;code&gt;git add&lt;/code&gt; 后的区域&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Local Repository&lt;/td&gt;
 &lt;td&gt;本地保存的 Commit 历史&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Remote Repository&lt;/td&gt;
 &lt;td&gt;GitHub 上的远程仓库&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;常见命令对应关系：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git add &lt;span class="c1"&gt;# 工作区 -&amp;gt; 暂存区&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git commit &lt;span class="c1"&gt;# 暂存区 -&amp;gt; 本地仓库&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git push &lt;span class="c1"&gt;# 本地仓库 -&amp;gt; 远程仓库&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git pull &lt;span class="c1"&gt;# 远程仓库 -&amp;gt; 本地仓库并合并&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;很多 Git 问题，本质上是在问：这个改动现在在哪个区域？&lt;/p&gt;
&lt;h2 id="撤销操作discardresetrevert"&gt;撤销操作：Discard、Reset、Revert
&lt;/h2&gt;&lt;p&gt;Git 里有好几种“后悔药”，但它们适用场景不同。&lt;/p&gt;
&lt;table&gt;
 &lt;thead&gt;
 &lt;tr&gt;
 &lt;th&gt;操作&lt;/th&gt;
 &lt;th&gt;作用&lt;/th&gt;
 &lt;th&gt;适合场景&lt;/th&gt;
 &lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
 &lt;tr&gt;
 &lt;td&gt;Discard&lt;/td&gt;
 &lt;td&gt;丢掉工作区未提交的改动&lt;/td&gt;
 &lt;td&gt;文件改坏了，还没 commit&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Reset&lt;/td&gt;
 &lt;td&gt;把分支指针退回某个历史状态&lt;/td&gt;
 &lt;td&gt;本地历史需要重写，通常适合未推送的提交&lt;/td&gt;
 &lt;/tr&gt;
 &lt;tr&gt;
 &lt;td&gt;Revert&lt;/td&gt;
 &lt;td&gt;生成一个反向提交来撤销旧提交&lt;/td&gt;
 &lt;td&gt;已经推送或多人协作时更安全&lt;/td&gt;
 &lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;新手最容易混淆 &lt;code&gt;reset&lt;/code&gt; 和 &lt;code&gt;revert&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;简单规则：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;自己本地还没推送的提交，可以考虑 &lt;code&gt;reset&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;已经推送到远程、别人可能基于它继续开发的提交，优先用 &lt;code&gt;revert&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;revert&lt;/code&gt; 不会删除历史，而是新增一条“抵消旧改动”的提交，所以更适合团队协作。&lt;/p&gt;
&lt;h2 id="branch-分支"&gt;Branch 分支
&lt;/h2&gt;&lt;p&gt;分支是另一条开发线。&lt;/p&gt;
&lt;p&gt;常见用法是：主分支保持稳定，新功能放到单独分支开发。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git switch -c feature/login
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;开发完成后，再合并回主分支：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git switch main
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git merge feature/login
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;分支的价值在于隔离风险。你可以在 &lt;code&gt;feature&lt;/code&gt; 分支上尝试新功能，不影响 &lt;code&gt;main&lt;/code&gt; 的稳定状态。&lt;/p&gt;
&lt;p&gt;如果使用 VS Code 或 GitHub Desktop，也可以通过界面创建、切换和删除分支。&lt;/p&gt;
&lt;h2 id="head-是什么"&gt;HEAD 是什么
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;HEAD&lt;/code&gt; 表示当前仓库指向哪一次提交。&lt;/p&gt;
&lt;p&gt;通常情况下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;在 &lt;code&gt;main&lt;/code&gt; 分支上，&lt;code&gt;HEAD&lt;/code&gt; 指向 &lt;code&gt;main&lt;/code&gt; 的最新提交&lt;/li&gt;
&lt;li&gt;在 &lt;code&gt;feature&lt;/code&gt; 分支上，&lt;code&gt;HEAD&lt;/code&gt; 指向 &lt;code&gt;feature&lt;/code&gt; 的最新提交&lt;/li&gt;
&lt;li&gt;如果 checkout 到某个历史提交，可能进入 detached HEAD 状态&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Detached HEAD 可以用来看历史代码，但不适合直接长期开发。需要继续改的话，最好从这个状态创建一个新分支。&lt;/p&gt;
&lt;h2 id="worktree-工作树"&gt;Worktree 工作树
&lt;/h2&gt;&lt;p&gt;Worktree 可以让一个仓库同时拥有多个工作目录。&lt;/p&gt;
&lt;p&gt;它适合这种场景：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;主目录保持当前任务&lt;/li&gt;
&lt;li&gt;另开一个目录修 bug&lt;/li&gt;
&lt;li&gt;再开一个目录试验新分支&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;常用命令：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git worktree add ../project-feature feature-name
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;AI coding agent 很适合搭配 worktree：每个任务一个独立工作树，互相不干扰，完成后再合并。&lt;/p&gt;
&lt;h2 id="merge-conflict-合并冲突"&gt;Merge Conflict 合并冲突
&lt;/h2&gt;&lt;p&gt;当两个分支修改了同一个文件的同一部分，Git 不知道该保留谁，就会产生冲突。&lt;/p&gt;
&lt;p&gt;解决冲突不是“哪个按钮更高级”，而是人工判断最终文件应该长什么样。&lt;/p&gt;
&lt;p&gt;一般流程：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;打开冲突文件&lt;/li&gt;
&lt;li&gt;找到冲突标记&lt;/li&gt;
&lt;li&gt;保留正确内容&lt;/li&gt;
&lt;li&gt;删除冲突标记&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git add&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;git commit&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;冲突标记大概长这样：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;span class="lnt"&gt;4
&lt;/span&gt;&lt;span class="lnt"&gt;5
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; HEAD
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;当前分支内容
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;=======
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;另一个分支内容
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt;&amp;gt; feature
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;在 VS Code 中可以选择保留当前、保留传入、两者都保留，但最终还是要确认合并后的代码是否合理。&lt;/p&gt;
&lt;h2 id="clonepushpull"&gt;Clone、Push、Pull
&lt;/h2&gt;&lt;p&gt;远程仓库最常用的三个动作是：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git clone &amp;lt;url&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git push
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git pull
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;含义分别是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;clone&lt;/code&gt;：把 GitHub 上的仓库复制到本地&lt;/li&gt;
&lt;li&gt;&lt;code&gt;push&lt;/code&gt;：把本地提交推送到 GitHub&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pull&lt;/code&gt;：把 GitHub 上的新提交拉到本地&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果你先在 GitHub 创建仓库，再复制到本地，一般用 &lt;code&gt;clone&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;如果你先在本地写了项目，再想传到 GitHub，就先 &lt;code&gt;git init&lt;/code&gt;、&lt;code&gt;commit&lt;/code&gt;，再添加远程仓库并 &lt;code&gt;push&lt;/code&gt;。&lt;/p&gt;
&lt;h2 id="github-页面常用功能"&gt;GitHub 页面常用功能
&lt;/h2&gt;&lt;p&gt;GitHub 不只是放代码的网盘，它还有很多协作功能。&lt;/p&gt;
&lt;p&gt;常用区域包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Code：查看代码、下载 zip、复制 clone 地址&lt;/li&gt;
&lt;li&gt;Commit：查看提交历史&lt;/li&gt;
&lt;li&gt;README：项目介绍，一般是仓库首页最重要的说明&lt;/li&gt;
&lt;li&gt;Releases：发布版本和下载构建产物&lt;/li&gt;
&lt;li&gt;Issues：提 bug、需求、讨论&lt;/li&gt;
&lt;li&gt;Pull Requests：代码合并请求&lt;/li&gt;
&lt;li&gt;Actions：自动化构建、测试和部署&lt;/li&gt;
&lt;li&gt;Fork：把别人的项目复制一份到自己账号下&lt;/li&gt;
&lt;li&gt;Star：收藏项目，也能反映项目热度&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;快捷键也很实用：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/&lt;/code&gt;：搜索仓库内容&lt;/li&gt;
&lt;li&gt;&lt;code&gt;t&lt;/code&gt;：快速找文件&lt;/li&gt;
&lt;li&gt;&lt;code&gt;.&lt;/code&gt;：在浏览器打开网页版 VS Code&lt;/li&gt;
&lt;li&gt;&lt;code&gt;?&lt;/code&gt;：查看 GitHub 快捷键&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="fork-和-pull-request"&gt;Fork 和 Pull Request
&lt;/h2&gt;&lt;p&gt;开源协作通常不是直接改别人的仓库，而是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Fork：把仓库复制到自己账号&lt;/li&gt;
&lt;li&gt;Clone：把自己的 fork 克隆到本地&lt;/li&gt;
&lt;li&gt;Branch：创建新分支修改&lt;/li&gt;
&lt;li&gt;Commit：提交改动&lt;/li&gt;
&lt;li&gt;Push：推送到自己的远程仓库&lt;/li&gt;
&lt;li&gt;Pull Request：请求原项目合并&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Pull Request 不是单纯的“上传代码”，它也是讨论区。维护者可以 review 代码、提出修改意见，直到确认没问题再合并。&lt;/p&gt;
&lt;p&gt;如果你是项目协作者，仓库管理员也可以直接把你加成 collaborator。这样你可以直接 push 到仓库，但更推荐仍然通过分支和 PR 保持审查流程。&lt;/p&gt;
&lt;h2 id="cherry-pick-精选提交"&gt;Cherry-pick 精选提交
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;cherry-pick&lt;/code&gt; 用来把某几个 Commit 单独拿到当前分支。&lt;/p&gt;
&lt;p&gt;例如 feature 分支有三次提交：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;span class="lnt"&gt;3
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;A 修按钮
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;B 改文案
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;C 加功能
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;你只想把 &lt;code&gt;A&lt;/code&gt; 合到 main，不想要 &lt;code&gt;B&lt;/code&gt; 和 &lt;code&gt;C&lt;/code&gt;，就可以 cherry-pick &lt;code&gt;A&lt;/code&gt; 的 Commit ID。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git cherry-pick &amp;lt;commit-id&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;它适合“只挑某个改动”的场景，不适合替代正常合并流程。&lt;/p&gt;
&lt;h2 id="stash-临时存储"&gt;Stash 临时存储
&lt;/h2&gt;&lt;p&gt;如果你正在改代码，突然需要切到另一个分支处理急事，但当前改动还不适合提交，可以用：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git stash
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;它会把当前未提交改动临时收起来，让工作区恢复干净。&lt;/p&gt;
&lt;p&gt;回来以后再恢复：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git stash pop
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;Stash 适合临时切换任务，不应该长期当作保存代码的地方。真正有价值的进度还是应该 commit。&lt;/p&gt;
&lt;h2 id="rebase-变基"&gt;Rebase 变基
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;rebase&lt;/code&gt; 可以把一个分支的提交“挪到”另一个分支最新提交之后，让历史更线性。&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;span class="lnt"&gt;2
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git switch feature
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;git rebase main
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;效果是：feature 分支像是基于最新 main 重新开发出来的一样。&lt;/p&gt;
&lt;p&gt;注意：rebase 会改写提交历史。&lt;br&gt;
如果这个分支已经推送并且别人也在用，随便 rebase 再强推会影响别人。所以它更适合个人分支、尚未公开协作的分支。&lt;/p&gt;
&lt;p&gt;简单规则：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;自己一个人用的功能分支，可以 rebase&lt;/li&gt;
&lt;li&gt;多人共用的公共分支，谨慎 rebase&lt;/li&gt;
&lt;li&gt;主分支不要乱 rebase&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="ai-时代更要懂-git"&gt;AI 时代更要懂 Git
&lt;/h2&gt;&lt;p&gt;现在很多代码可以交给 AI agent 写，但 Git 反而更重要。&lt;/p&gt;
&lt;p&gt;因为 AI 改代码很快，也可能一次改很多文件。如果没有 Git，你很难回答这些问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;AI 到底改了哪些文件？&lt;/li&gt;
&lt;li&gt;哪次改动引入了问题？&lt;/li&gt;
&lt;li&gt;能不能只保留其中一部分？&lt;/li&gt;
&lt;li&gt;能不能回到 AI 修改前的状态？&lt;/li&gt;
&lt;li&gt;多个 AI 任务能不能并行？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以 AI coding 的基础动作应该是：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;一个任务 -&amp;gt; 一个分支或 worktree -&amp;gt; 小步 commit -&amp;gt; 审查 diff -&amp;gt; 再合并
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;不要让 AI 在一个长期混乱的工作区里连续改很多轮。每完成一个明确的小功能，就 commit 一次。这样即使后面改坏了，也能清楚地回退。&lt;/p&gt;
&lt;h2 id="总结"&gt;总结
&lt;/h2&gt;&lt;p&gt;Git 的核心不是背命令，而是理解版本流动：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;工作区 -&amp;gt; 暂存区 -&amp;gt; 本地仓库 -&amp;gt; 远程仓库
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;GitHub 的核心也不是“上传代码”，而是围绕仓库建立协作流程：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;
&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;
&lt;td class="lntd"&gt;
&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Fork -&amp;gt; Branch -&amp;gt; Commit -&amp;gt; Push -&amp;gt; Pull Request -&amp;gt; Review -&amp;gt; Merge
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;&lt;p&gt;掌握这些概念后，命令只是操作方式。无论是在 VS Code 里点按钮，还是让 AI agent 执行命令，本质都是在移动文件状态、提交历史和分支指针。&lt;/p&gt;
&lt;p&gt;对新手来说，最值得先熟练的不是所有高级命令，而是这几件事：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;会看 &lt;code&gt;git status&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;会做小步 commit&lt;/li&gt;
&lt;li&gt;会写清楚提交信息&lt;/li&gt;
&lt;li&gt;会用分支隔离任务&lt;/li&gt;
&lt;li&gt;会区分 &lt;code&gt;discard&lt;/code&gt;、&lt;code&gt;reset&lt;/code&gt;、&lt;code&gt;revert&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;会把本地改动 push 到 GitHub&lt;/li&gt;
&lt;li&gt;会通过 Pull Request 协作&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这些掌握了，Git 和 GitHub 就不再是黑盒，而是你和 AI、队友、未来的自己协作时最可靠的底座。&lt;/p&gt;</description></item></channel></rss>