<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>入门教程 on heyaohua's Blog</title><link>https://blog.heyaohua.com/tags/%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B/</link><description>Recent content in 入门教程 on heyaohua's Blog</description><image><title>heyaohua's Blog</title><url>https://blog.heyaohua.com/og-image.png</url><link>https://blog.heyaohua.com/og-image.png</link></image><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Sat, 22 Aug 2026 23:21:00 +0800</lastBuildDate><atom:link href="https://blog.heyaohua.com/tags/%E5%85%A5%E9%97%A8%E6%95%99%E7%A8%8B/index.xml" rel="self" type="application/rss+xml"/><item><title>Git 使用手册 · 初级篇：从第一次提交开始</title><link>https://blog.heyaohua.com/posts/2026/08/git-handbook-beginner/</link><pubDate>Sat, 22 Aug 2026 23:21:00 +0800</pubDate><guid>https://blog.heyaohua.com/posts/2026/08/git-handbook-beginner/</guid><description>Git 入门手册，用最少的心智负担讲清仓库、工作区、暂存区、提交、分支、远程的基本概念与日常命令，适合零基础的第一次上手。</description><content:encoded><![CDATA[<p>这是 Git 手册系列的第一篇。目标只有一个：让你今天就能用 Git 管好自己的代码，并且知道每条命令在干什么。不理解原理没关系，先把工作流跑通。</p>
<hr>
<h2 id="目录">目录</h2>
<ul>
<li>Git 是什么，解决什么问题</li>
<li>安装与初始配置</li>
<li>四个区域：工作区、暂存区、本地仓库、远程仓库</li>
<li>第一次提交</li>
<li>日常三板斧：status / add / commit</li>
<li>查看历史</li>
<li>撤销与回退（安全版）</li>
<li>连接远程仓库（GitHub / GitLab）</li>
<li>分支是什么（先会用最基础的）</li>
<li>初级常见错误</li>
</ul>
<hr>
<h2 id="git-是什么解决什么问题">Git 是什么，解决什么问题</h2>
<p>没有 Git 的时候，你是这样管理代码的：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>project/
</span></span><span style="display:flex;"><span>project-final/
</span></span><span style="display:flex;"><span>project-final-v2/
</span></span><span style="display:flex;"><span>project-final-v2-真的最终版/
</span></span></code></pre></div><p>Git 做的事：把项目的每一次修改记录成&quot;快照&quot;（commit），你可以随时查看任何历史版本、回到任何历史版本、同时维护多条并行的修改线（分支），并和别人协作而互不覆盖。</p>
<hr>
<h2 id="安装与初始配置">安装与初始配置</h2>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#6272a4"># macOS</span>
</span></span><span style="display:flex;"><span>brew install git
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#6272a4"># Ubuntu / Debian</span>
</span></span><span style="display:flex;"><span>sudo apt install git
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#6272a4"># Windows：安装 Git for Windows（自带 Git Bash）</span>
</span></span></code></pre></div><p>第一次使用必须先配置身份，否则提交会带上机器默认的匿名信息：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>git config --global user.name <span style="color:#f1fa8c">&#34;你的名字&#34;</span>
</span></span><span style="display:flex;"><span>git config --global user.email <span style="color:#f1fa8c">&#34;you@example.com&#34;</span>
</span></span><span style="display:flex;"><span>git config --global init.defaultBranch main
</span></span></code></pre></div><p>验证：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>git config --list
</span></span></code></pre></div><hr>
<h2 id="四个区域工作区暂存区本地仓库远程仓库">四个区域：工作区、暂存区、本地仓库、远程仓库</h2>
<p>这是理解 Git 所有命令的钥匙：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-text" data-lang="text"><span style="display:flex;"><span>工作区          暂存区          本地仓库          远程仓库
</span></span><span style="display:flex;"><span>(working dir)   (staging)      (repository)     (remote)
</span></span><span style="display:flex;"><span>    |               |               |                |
</span></span><span style="display:flex;"><span>    |  git add  →   |  git commit → |  git push  →   |
</span></span><span style="display:flex;"><span>    |               |               |                |
</span></span><span style="display:flex;"><span>    |  ← checkout   |  ← reset      |  ← git pull    |
</span></span></code></pre></div><ul>
<li><strong>工作区</strong>：你正在编辑的文件</li>
<li><strong>暂存区</strong>：下一次提交要包含的内容（一个&quot;待打包区&quot;）</li>
<li><strong>本地仓库</strong>：已经提交的历史快照</li>
<li><strong>远程仓库</strong>：GitHub / GitLab / 自建服务器上的副本</li>
</ul>
<p>为什么要多一个暂存区？因为你可以改 10 个文件，但只把其中 3 个相关的改动打成一次干净的提交。</p>
<hr>
<h2 id="第一次提交">第一次提交</h2>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#6272a4"># 在项目目录初始化仓库</span>
</span></span><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">cd</span> my-project
</span></span><span style="display:flex;"><span>git init
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#6272a4"># 查看状态（最重要的命令，有事没事敲一下）</span>
</span></span><span style="display:flex;"><span>git status
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#6272a4"># 把文件放进暂存区</span>
</span></span><span style="display:flex;"><span>git add README.md        <span style="color:#6272a4"># 单个文件</span>
</span></span><span style="display:flex;"><span>git add .                <span style="color:#6272a4"># 所有变更（初级可以先这样用）</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#6272a4"># 提交到本地仓库</span>
</span></span><span style="display:flex;"><span>git commit -m <span style="color:#f1fa8c">&#34;初始化项目：添加 README&#34;</span>
</span></span></code></pre></div><p>提交信息（commit message）的约定：<strong>一句话说清&quot;做了什么&quot;，用动词开头</strong>。例如 <code>修复登录页按钮错位</code>、<code>新增用户注册接口</code>。不要写 <code>update</code>、<code>fix</code>、<code>123</code>。</p>
<h3 id="gitignore告诉-git-别管某些文件">.gitignore：告诉 Git 别管某些文件</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-fallback" data-lang="fallback"><span style="display:flex;"><span># 依赖与构建产物
</span></span><span style="display:flex;"><span>node_modules/
</span></span><span style="display:flex;"><span>dist/
</span></span><span style="display:flex;"><span>*.log
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span># 环境与密钥（永远不要提交）
</span></span><span style="display:flex;"><span>.env
</span></span><span style="display:flex;"><span>*.pem
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span># 系统文件
</span></span><span style="display:flex;"><span>.DS_Store
</span></span></code></pre></div><p>新建仓库第一件事就是写 <code>.gitignore</code>。如果已经把 <code>node_modules</code> 提交了，用 <code>git rm -r --cached node_modules</code> 把它移出版本库再提交。</p>
<hr>
<h2 id="日常三板斧status--add--commit">日常三板斧：status / add / commit</h2>
<p>你的日常循环就是：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>git status                    <span style="color:#6272a4"># 现在有哪些改动？哪些已暂存？</span>
</span></span><span style="display:flex;"><span>git add &lt;file&gt;                <span style="color:#6272a4"># 挑选改动放入暂存区</span>
</span></span><span style="display:flex;"><span>git commit -m <span style="color:#f1fa8c">&#34;做了什么&#34;</span>      <span style="color:#6272a4"># 打包成一次快照</span>
</span></span></code></pre></div><p>辅助命令：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>git diff                      <span style="color:#6272a4"># 工作区 vs 暂存区：还没 add 的改动细节</span>
</span></span><span style="display:flex;"><span>git diff --staged             <span style="color:#6272a4"># 暂存区 vs 上次提交：这次将要提交什么</span>
</span></span></code></pre></div><p><strong>提交频率建议</strong>：完成一个&quot;说得清的小目标&quot;就提交一次。一天 3~10 次提交很正常；一周一次提交等于没用 Git。</p>
<hr>
<h2 id="查看历史">查看历史</h2>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>git log                       <span style="color:#6272a4"># 完整历史</span>
</span></span><span style="display:flex;"><span>git log --oneline             <span style="color:#6272a4"># 一行一条，最常用</span>
</span></span><span style="display:flex;"><span>git log --oneline --graph     <span style="color:#6272a4"># 带分支图形</span>
</span></span><span style="display:flex;"><span>git show &lt;commit-id&gt;          <span style="color:#6272a4"># 看某次提交的具体改动</span>
</span></span><span style="display:flex;"><span>git blame &lt;file&gt;              <span style="color:#6272a4"># 文件每一行是谁在哪次提交写的</span>
</span></span></code></pre></div><p>每次提交有一个 40 位的哈希 id，平时用前 7 位即可指代（如 <code>a1b2c3d</code>）。</p>
<hr>
<h2 id="撤销与回退安全版">撤销与回退（安全版）</h2>
<p>初级只需要记住三句，按&quot;还没提交到哪一步&quot;选：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span><span style="color:#6272a4"># 1. 改了文件但还没 add：丢弃工作区修改</span>
</span></span><span style="display:flex;"><span>git restore &lt;file&gt;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#6272a4"># 2. 已经 add 但还没 commit：退回暂存区（改动保留在工作区）</span>
</span></span><span style="display:flex;"><span>git restore --staged &lt;file&gt;
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#6272a4"># 3. 已经 commit：再提交一次&#34;反向提交&#34;来撤销，不改历史，最安全</span>
</span></span><span style="display:flex;"><span>git revert &lt;commit-id&gt;
</span></span></code></pre></div><p>⚠️ <code>git reset --hard</code> 和 <code>git push --force</code> 会<strong>永久丢数据或改写共享历史</strong>，初级阶段先别碰，等中级篇再学。</p>
<hr>
<h2 id="连接远程仓库github--gitlab">连接远程仓库（GitHub / GitLab）</h2>
<h3 id="情形-a本地已有项目推到新建的远程仓库">情形 A：本地已有项目，推到新建的远程仓库</h3>
<p>在 GitHub 上创建一个<strong>空仓库</strong>（不要勾选初始化 README），然后：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>git remote add origin git@github.com:yourname/my-project.git
</span></span><span style="display:flex;"><span>git branch -M main
</span></span><span style="display:flex;"><span>git push -u origin main
</span></span></code></pre></div><h3 id="情形-b从远程克隆一个已有项目">情形 B：从远程克隆一个已有项目</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>git clone git@github.com:someone/some-project.git
</span></span><span style="display:flex;"><span><span style="color:#8be9fd;font-style:italic">cd</span> some-project
</span></span></code></pre></div><h3 id="日常同步">日常同步</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>git pull        <span style="color:#6272a4"># 拉取远程最新提交并合并到本地</span>
</span></span><span style="display:flex;"><span>git push        <span style="color:#6272a4"># 推送本地提交到远程</span>
</span></span></code></pre></div><p>认证推荐配置 SSH key（<code>ssh-keygen</code> 生成后把公钥贴到 GitHub 设置里），一次配置永久免密。</p>
<hr>
<h2 id="分支是什么先会用最基础的">分支是什么（先会用最基础的）</h2>
<p>分支 = 一条独立的修改线，互不影响。默认分支是 <code>main</code>。</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>git branch                      <span style="color:#6272a4"># 列出本地分支</span>
</span></span><span style="display:flex;"><span>git switch -c feature-login     <span style="color:#6272a4"># 新建并切换到新分支</span>
</span></span><span style="display:flex;"><span>git switch main                 <span style="color:#6272a4"># 切回 main</span>
</span></span></code></pre></div><p>典型用法：</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"><code class="language-bash" data-lang="bash"><span style="display:flex;"><span>git switch -c fix-button        <span style="color:#6272a4"># 开分支做修复</span>
</span></span><span style="display:flex;"><span><span style="color:#6272a4"># …改代码、add、commit…</span>
</span></span><span style="display:flex;"><span>git switch main                 <span style="color:#6272a4"># 回主线</span>
</span></span><span style="display:flex;"><span>git merge fix-button            <span style="color:#6272a4"># 把修复合并进来</span>
</span></span><span style="display:flex;"><span>git branch -d fix-button        <span style="color:#6272a4"># 删掉用完的分支</span>
</span></span><span style="display:flex;"><span>git push                        <span style="color:#6272a4"># 同步到远程</span>
</span></span></code></pre></div><p>初级记住一个原则：<strong>永远别直接在 main 上干活，做任何改动都先开分支</strong>。合并冲突暂时不用怕，中级篇会专门讲。</p>
<hr>
<h2 id="初级常见错误">初级常见错误</h2>
<p><strong>1. 提交信息写 &ldquo;update&rdquo;</strong>
一个月后你自己都不知道这次提交干了什么。写具体点。</p>
<p><strong>2. 把 <code>.env</code>、密钥提交了</strong>
先 <code>git rm --cached .env</code> 移除并写进 <code>.gitignore</code>。注意：历史里还有，密钥必须立即更换。</p>
<p><strong>3. 在错误的目录 <code>git init</code></strong>
比如在家目录 <code>~</code> 下执行了 init。删掉误建的 <code>.git</code> 目录即可：<code>rm -rf ~/.git</code>（确认路径后再执行）。</p>
<p><strong>4. pull 下来一堆冲突，慌了</strong>
冲突不是错误，是 Git 在问你&quot;两边都改了，听谁的&quot;。先 <code>git status</code> 看哪些文件冲突，打开文件找 <code>&lt;&lt;&lt;&lt;&lt;&lt;&lt;</code> 标记，手动改对后 <code>add</code> + <code>commit</code>。</p>
<p><strong>5. 半年不 push</strong>
本地仓库丢了硬盘就没了。每天至少 push 一次。</p>
<hr>
<h2 id="本篇速查表">本篇速查表</h2>
<table>
	<thead>
			<tr>
					<th>目的</th>
					<th>命令</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>初始化</td>
					<td><code>git init</code></td>
			</tr>
			<tr>
					<td>看状态</td>
					<td><code>git status</code></td>
			</tr>
			<tr>
					<td>暂存</td>
					<td><code>git add &lt;file&gt;</code></td>
			</tr>
			<tr>
					<td>提交</td>
					<td><code>git commit -m &quot;...&quot;</code></td>
			</tr>
			<tr>
					<td>看历史</td>
					<td><code>git log --oneline</code></td>
			</tr>
			<tr>
					<td>撤销未暂存修改</td>
					<td><code>git restore &lt;file&gt;</code></td>
			</tr>
			<tr>
					<td>撤销已暂存</td>
					<td><code>git restore --staged &lt;file&gt;</code></td>
			</tr>
			<tr>
					<td>安全撤销某次提交</td>
					<td><code>git revert &lt;id&gt;</code></td>
			</tr>
			<tr>
					<td>克隆</td>
					<td><code>git clone &lt;url&gt;</code></td>
			</tr>
			<tr>
					<td>拉取 / 推送</td>
					<td><code>git pull</code> / <code>git push</code></td>
			</tr>
			<tr>
					<td>开分支</td>
					<td><code>git switch -c &lt;name&gt;</code></td>
			</tr>
			<tr>
					<td>合并</td>
					<td><code>git merge &lt;name&gt;</code></td>
			</tr>
	</tbody>
</table>
<hr>
<p>掌握这些，你已经覆盖了个人项目 90% 的场景。下一篇《中级篇》讲分支协作模型、合并冲突的正确解法、stash、reset 的三种模式和 rebase 入门——也就是从&quot;会用&quot;到&quot;用得对&quot;。</p>
]]></content:encoded></item></channel></rss>