<?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 Jiangwan&#39;s Blog</title>
        <link>https://jiangwan.ink/tags/git/</link>
        <description>Recent content in Git on Jiangwan&#39;s Blog</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>zh-cn</language>
        <lastBuildDate>Mon, 30 Mar 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://jiangwan.ink/tags/git/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>解决 Windows 环境下 Git SSH Permission denied 报错</title>
        <link>https://jiangwan.ink/p/git-windows-ssh-permission-denied/</link>
        <pubDate>Mon, 30 Mar 2026 00:00:00 +0000</pubDate>
        
        <guid>https://jiangwan.ink/p/git-windows-ssh-permission-denied/</guid>
        <description>&lt;h2 id=&#34;一现象描述&#34;&gt;一、现象描述
&lt;/h2&gt;&lt;p&gt;在 Windows 环境下配置 GitHub SSH 密钥时，常常会遇到一个充满迷惑性的报错现象。当我们在终端直接测试 SSH 连接：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ssh -T git@github.com
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;终端会正常返回欢迎信息，证明密钥配置无误：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;Hi your_username! You&amp;#39;ve successfully authenticated...
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;但紧接着执行 &lt;code&gt;git clone&lt;/code&gt; 或 &lt;code&gt;git push&lt;/code&gt; 命令时，却直接报错拒绝访问：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git@github.com: Permission denied (publickey).
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;fatal: Could not read from remote repository.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;二问题排查&#34;&gt;二、问题排查
&lt;/h2&gt;&lt;p&gt;现象表现为同一台电脑对同一份密钥的读取结果前后矛盾。为了确认 Git 在执行网络请求时到底发生了什么，我们可以开启 Git 的 SSH 调试模式。在终端临时注入环境变量，强制输出 Git 底层的 SSH 调用日志：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;GIT_SSH_COMMAND&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;ssh -v&amp;#34;&lt;/span&gt; git clone git@github.com:your-name/your-repo.git
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;通过详细日志可以观察到，&lt;code&gt;git clone&lt;/code&gt; 并没有调用系统默认的 SSH 程序，也没有去正确的 &lt;code&gt;~/.ssh&lt;/code&gt; 目录下寻找刚刚配置好的私钥。&lt;/p&gt;
&lt;h2 id=&#34;三原因分析&#34;&gt;三、原因分析
&lt;/h2&gt;&lt;p&gt;这个问题的核心在于：Windows 系统中同时存在两个互不相通的 SSH 程序。&lt;/p&gt;
&lt;pre class=&#34;mermaid&#34;&gt;
  graph TD
    A[终端环境] --&amp;gt; B{执行指令}
    B --&amp;gt;|ssh -T| C[Windows 原生 OpenSSH]
    B --&amp;gt;|git clone| D[Git 自带内部 SSH]
    
    C --&amp;gt;|读取 C:\Users\用户名\.ssh| E[找到私钥]
    E --&amp;gt; F[连接 GitHub 成功]
    
    D --&amp;gt;|MSYS2 模拟环境| G[路径解析偏差 / 无法读取 ssh-agent]
    G --&amp;gt; H[找不到私钥]
    H --&amp;gt; I[Permission denied]
&lt;/pre&gt;

&lt;h3 id=&#34;1-windows-原生-openssh&#34;&gt;1. Windows 原生 OpenSSH
&lt;/h3&gt;&lt;p&gt;从 Windows 10 开始，微软内置了一套原生的 OpenSSH 工具，路径为 &lt;code&gt;C:\Windows\System32\OpenSSH\ssh.exe&lt;/code&gt;。执行 &lt;code&gt;ssh -T&lt;/code&gt; 时，系统默认唤醒的是这个原生程序。它能准确识别当前 Windows 用户的 &lt;code&gt;~/.ssh&lt;/code&gt; 目录并读取私钥，因此测试顺利通过。&lt;/p&gt;
&lt;h3 id=&#34;2-git-for-windows-自带-ssh&#34;&gt;2. Git for Windows 自带 SSH
&lt;/h3&gt;&lt;p&gt;安装 Git 时，为了兼容旧版 Windows，Git 官方打包了一个专属的 SSH 程序，路径通常在 &lt;code&gt;C:\Program Files\Git\usr\bin\ssh.exe&lt;/code&gt;。执行 &lt;code&gt;git clone&lt;/code&gt; 时，Git 会强制调用自带的内部 SSH。由于该程序运行在一个模拟的 Linux 环境 MSYS2 中，它对文件路径的解析或对 Windows 系统 ssh-agent 密钥代理服务的读取存在偏差。这导致它在连接 GitHub 时交不出密钥，从而被服务端拒绝。&lt;/p&gt;
&lt;h2 id=&#34;四解决方案&#34;&gt;四、解决方案
&lt;/h2&gt;&lt;p&gt;明确了问题是环境割裂导致的，修复逻辑就是统一底层调用。我们需要通过 Git 的全局配置，覆写它的默认行为，强制 Git 放弃内部自带的 SSH，转而调用 Windows 系统的原生 SSH 程序。&lt;/p&gt;
&lt;p&gt;在终端执行以下配置命令：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git config --global core.sshCommand &lt;span class=&#34;s2&#34;&gt;&amp;#34;C:/Windows/System32/OpenSSH/ssh.exe&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;执行完毕后，Git 的网络操作与系统的 ssh 命令彻底打通，底层调用的都是同一个能正确找到密钥的程序。再次执行 &lt;code&gt;git clone&lt;/code&gt; 即可顺利拉取代码。&lt;/p&gt;
&lt;h2 id=&#34;五总结&#34;&gt;五、总结
&lt;/h2&gt;&lt;p&gt;在开发环境搭建中，多套工具链附带的同名依赖组件往往是引发底层冲突的根源。遇到配置生效不一致的情况，利用 &lt;code&gt;GIT_SSH_COMMAND=&amp;quot;ssh -v&amp;quot;&lt;/code&gt; 这类环境变量暴露出底层的真实调用路径，是打破信息差、快速定位问题的有效手段。&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Git Commit 规范与最佳实践：为什么我们需要约定式提交</title>
        <link>https://jiangwan.ink/p/git-commit-convention-best-practices/</link>
        <pubDate>Sat, 21 Mar 2026 00:00:00 +0000</pubDate>
        
        <guid>https://jiangwan.ink/p/git-commit-convention-best-practices/</guid>
        <description>&lt;p&gt;在个人项目的早期阶段，我们往往习惯于随意地提交代码：&lt;code&gt;update&lt;/code&gt;、&lt;code&gt;fix bug&lt;/code&gt;，甚至是一个单独的 &lt;code&gt;.&lt;/code&gt;。然而，当项目周期拉长，或者开始与他人协作、参与开源社区时，这种随意的习惯会迅速带来灾难——在排查历史 Bug 或进行代码回滚时，杂乱无章的 &lt;code&gt;git log&lt;/code&gt; 犹如大海捞针。&lt;/p&gt;
&lt;p&gt;建立 Git Commit 规范，不仅是为了让提交历史看起来整洁，更是为了降低沟通成本、实现自动化（如自动生成 Changelog），以及方便未来的自己进行“代码考古”。&lt;/p&gt;
&lt;p&gt;目前开源社区中最为主流的标准是&lt;strong&gt;约定式提交（Conventional Commits）&lt;/strong&gt;。本文将对其核心规则与日常最佳实践进行梳理。&lt;/p&gt;
&lt;h2 id=&#34;一核心规则约定式提交拆解&#34;&gt;一、核心规则：约定式提交拆解
&lt;/h2&gt;&lt;p&gt;约定式提交要求每次提交信息必须符合固定的结构：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&amp;lt;type&amp;gt;[optional scope]: &amp;lt;description&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[optional body]
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;[optional footer(s)]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;在日常开发中，我们最常用的是第一行（Header）。它由三个部分组成：&lt;/p&gt;
&lt;h3 id=&#34;1-type提交类型&#34;&gt;1. Type（提交类型）
&lt;/h3&gt;&lt;p&gt;Type 用于明确指出这次提交的性质。严谨界定 Type 是规范的核心，以下是常用的类型及其边界：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;feat&lt;/strong&gt;: 新增功能（Feature）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;fix&lt;/strong&gt;: 修复 Bug。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;docs&lt;/strong&gt;: 仅包含文档的修改（如 README、接口注释）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;style&lt;/strong&gt;: 代码格式变动（不影响代码逻辑，如空格、缩进、去除多余空行等）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;refactor&lt;/strong&gt;: 代码重构（注意边界：既不是新增功能，也不是修复 Bug 的代码变动）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;perf&lt;/strong&gt;: 优化性能的代码修改。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;test&lt;/strong&gt;: 添加缺失的测试或更正现有测试。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;chore&lt;/strong&gt;: 构建过程、辅助工具或依赖库的变动（如更新 npm 包、修改 webpack 配置）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;2-scope作用域&#34;&gt;2. Scope（作用域）
&lt;/h3&gt;&lt;p&gt;Scope 用于说明 commit 影响的范围，比如 &lt;code&gt;auth&lt;/code&gt;、&lt;code&gt;router&lt;/code&gt;、&lt;code&gt;db&lt;/code&gt; 等。它可以帮助团队成员快速定位改动发生的模块。例如：
&lt;code&gt;feat(auth): 新增 JWT 登录支持。&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&#34;3-description描述&#34;&gt;3. Description（描述）
&lt;/h3&gt;&lt;p&gt;简短地描述改动内容。几个书写建议：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;动宾结构&lt;/strong&gt;：以动词开头，如“新增 xxx”、“修复 xxx”。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;精简准确&lt;/strong&gt;：不要超过 50 个字符，说清楚“做了什么”即可。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;二最佳实践commit-的颗粒度与习惯&#34;&gt;二、最佳实践：Commit 的颗粒度与习惯
&lt;/h2&gt;&lt;p&gt;仅仅记住格式是不够的，规范的落地还需要良好的工程习惯支撑。&lt;/p&gt;
&lt;h3 id=&#34;1-控制合理的提交颗粒度&#34;&gt;1. 控制合理的提交颗粒度
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;一个 Commit 应该只包含一个逻辑上的改动。&lt;/strong&gt; 这是新手最容易踩的坑。如果在开发新功能时顺手修复了一个历史 Bug，或者格式化了整个文件，请务必将它们拆分为多个独立的 Commit（例如一个 &lt;code&gt;feat&lt;/code&gt;，一个 &lt;code&gt;fix&lt;/code&gt;，一个 &lt;code&gt;style&lt;/code&gt;）。&lt;/p&gt;
&lt;p&gt;过大的、揉捏了各种变动的 Commit 会让代码审查（Code Review）变得异常困难，一旦新功能引发线上故障，想要单纯回滚那个附带的 Bug 修复几乎不可能。&lt;/p&gt;
&lt;h3 id=&#34;2-关联-issue-或任务流&#34;&gt;2. 关联 Issue 或任务流
&lt;/h3&gt;&lt;p&gt;如果是为了解决某个特定的 Issue 或需求，应该在提交信息中（通常在 Footer 部分，或者直接在 Description 末尾）附带 Issue 编号。例如：
&lt;code&gt;fix(user): 修复并发注册时的锁问题 (#123)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;主流的托管平台（如 GitHub、GitLab）会自动将这个 Commit 与对应的 Issue 关联并闭环。&lt;/p&gt;
</description>
        </item>
        <item>
        <title>Git 基础配置与 VS Code 协同指南</title>
        <link>https://jiangwan.ink/p/git-vscode-collaboration-guide/</link>
        <pubDate>Sat, 21 Mar 2026 00:00:00 +0000</pubDate>
        
        <guid>https://jiangwan.ink/p/git-vscode-collaboration-guide/</guid>
        <description>&lt;p&gt;在日常的开发与项目协作中，一套顺畅的 Git 工作流是不可或缺的基建，能大幅提升开发和团队协作效率。本文旨在梳理 Git 的基础环境配置，演示如何利用 VS code，将 Git 的底层空间概念通过可视化操作的方式，实现代码的拉取与推送。&lt;/p&gt;
&lt;h2 id=&#34;一-基础环境准备&#34;&gt;一、 基础环境准备
&lt;/h2&gt;&lt;p&gt;进行版本控制和代码编写，首先需要准备好 Git 和编辑器环境。&lt;/p&gt;
&lt;h3 id=&#34;1-git-下载与安装&#34;&gt;1. Git 下载与安装
&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Windows&lt;/strong&gt;：前往 &lt;a class=&#34;link&#34; href=&#34;https://git-scm.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Git 官方网站&lt;/a&gt; 下载安装包，常规情况下一路点击“下一步”保持默认配置即可。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;macOS&lt;/strong&gt;：推荐使用 Homebrew 安装，终端执行 &lt;code&gt;brew install git&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;安装完成后，在终端（Terminal 或命令提示符）输入 &lt;code&gt;git --version&lt;/code&gt;，若能正确输出版本号，即代表安装成功。&lt;/p&gt;
&lt;h3 id=&#34;2-vs-code-安装&#34;&gt;2. VS Code 安装
&lt;/h3&gt;&lt;p&gt;前往 &lt;a class=&#34;link&#34; href=&#34;https://code.visualstudio.com/&#34;  target=&#34;_blank&#34; rel=&#34;noopener&#34;
    &gt;Visual Studio Code 官网&lt;/a&gt; 下载对应系统的安装包。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;💡 小提示：Windows 用户在安装向导中，建议勾选“将‘通过 Code 打开’操作添加到 Windows 资源管理器文件/目录上下文菜单”，这样后续在文件夹里右键就能直接用 VS Code 打开项目，非常方便。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&#34;3-全局身份配置&#34;&gt;3. 全局身份配置
&lt;/h3&gt;&lt;p&gt;Git 是分布式版本控制系统，每一次代码提交（Commit）都需要记录是谁完成的。因此，安装后的首要任务是配置全局的用户名 and 邮箱。在终端中执行以下命令（替换为你自己的信息）：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git config --global user.name &lt;span class=&#34;s2&#34;&gt;&amp;#34;Jiangwan&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git config --global user.email &lt;span class=&#34;s2&#34;&gt;&amp;#34;your_email@example.com&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;💡 命名与邮箱建议：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;公司/团队协作&lt;/strong&gt;：建议 &lt;code&gt;user.name&lt;/code&gt; 使用真实姓名或工号拼音，邮箱使用公司企业邮箱，方便在 GitLab 等内部系统中追溯代码责任人。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;个人开发/开源社区&lt;/strong&gt;：建议使用网名或常用昵称（如 GitHub ID），邮箱与 GitHub/Gitee 注册邮箱保持一致，以便平台正确统计你的提交贡献（绿点）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h2 id=&#34;二-鉴权打通本地与远程仓库&#34;&gt;二、 鉴权：打通本地与远程仓库
&lt;/h2&gt;&lt;p&gt;要在本地电脑和云端之间传输代码，必须解决权限认证问题。主要有 HTTPS 和 SSH 两种协议。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;为什么开发者更偏爱 SSH 而非 HTTPS？&lt;/strong&gt;
很多公司内部使用 HTTPS 也很顺畅，那是因为 Git Credential Manager 帮你缓存了账号密码或 Token。但从底层体验上，SSH 有几个核心优势：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;网络与代理友好&lt;/strong&gt;：在国内使用 GitHub 时，HTTPS 往往需要频繁配置 Git 代理（&lt;code&gt;http.proxy&lt;/code&gt;），否则极易网络超时。而 SSH 走的是 22 端口，认证机制不同，配置代理规则也更底层且灵活。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;安全性更高且无过期烦恼&lt;/strong&gt;：HTTPS 的 Token 会有过期机制，而 SSH 采用非对称加密的“公钥-私钥”对，只要私钥不泄露，鉴权通道就一直安全有效。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;1-生成-ssh-密钥-推荐-ed25519&#34;&gt;1. 生成 SSH 密钥 (推荐 Ed25519)
&lt;/h3&gt;&lt;p&gt;以往的教程常教大家生成 rsa 密钥，但目前 GitHub 和技术社区更推荐使用 &lt;code&gt;ed25519&lt;/code&gt; 算法。相比 RSA，它生成的密钥更短、生成和验证速度更快，且安全性更高。在终端中运行以下命令，连续按回车键保持默认设置（不需要设置额外密码）：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ssh-keygen -t ed25519 -C &lt;span class=&#34;s2&#34;&gt;&amp;#34;your_email@example.com&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;(注：如果你的旧系统不支持 ed25519，再退回使用 &lt;code&gt;ssh-keygen -t rsa -b 4096 -C &amp;quot;...&amp;quot;&lt;/code&gt; 即可)&lt;/em&gt;&lt;/p&gt;
&lt;h3 id=&#34;2-配置公钥至托管平台&#34;&gt;2. 配置公钥至托管平台
&lt;/h3&gt;&lt;p&gt;密钥生成后，包含公钥（&lt;code&gt;.pub&lt;/code&gt; 结尾）和私钥。我们需要将公钥提供给托管平台。查看并复制公钥内容：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;cat ~/.ssh/id_ed25519.pub
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;将终端打印出的字符复制。登录 GitHub，进入 Settings -&amp;gt; SSH and GPG keys -&amp;gt; New SSH key，将其粘贴并保存。&lt;/p&gt;
&lt;h3 id=&#34;3-连接测试&#34;&gt;3. 连接测试
&lt;/h3&gt;&lt;p&gt;在终端输入以下命令验证是否配置成功：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ssh -T git@github.com
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;如果看到类似 &lt;code&gt;Hi [Username]! You&#39;ve successfully authenticated...&lt;/code&gt; 的提示，说明鉴权通道已打通。&lt;/p&gt;
&lt;h2 id=&#34;三-参与协作加入-github-组织-organization&#34;&gt;三、 参与协作：加入 GitHub 组织 (Organization)
&lt;/h2&gt;&lt;p&gt;在实际的兴趣小组开发或开源协作中，我们经常需要先加入一个 GitHub 组织，才能获取内部代码仓库的协同权限。&lt;/p&gt;
&lt;h3 id=&#34;1-接受组织邀请&#34;&gt;1. 接受组织邀请
&lt;/h3&gt;&lt;p&gt;组织管理员会通过你的 GitHub 用户名或注册邮箱发送邀请。留意你的邮箱邮件，或者直接登录 GitHub，点击右上角的通知小铃铛（Notifications），找到邀请信息并点击 &amp;ldquo;Join&amp;rdquo; 即可。加入后，你可以在个人主页左侧的 Organizations 列表中看到该组织。&lt;/p&gt;
&lt;h3 id=&#34;2-踩坑提示拉取与推送权限&#34;&gt;2. 踩坑提示：拉取与推送权限
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;：加入组织后，你通常可以直接 Clone 组织内的代码。但如果在后续 Push 代码时遇到 &lt;code&gt;Permission denied&lt;/code&gt; 或 &lt;code&gt;403 Forbidden&lt;/code&gt; 错误，这通常是因为管理员尚未给你分配目标仓库的 Write（写入）权限。
&lt;strong&gt;解决办法&lt;/strong&gt;：直接联系组织的管理员，请他们将你所在的 Team 或个人账号的仓库权限从 Read 提升至 Write 即可。&lt;/p&gt;
&lt;h2 id=&#34;四-vs-code-协同实战核心流转&#34;&gt;四、 VS Code 协同实战：核心流转
&lt;/h2&gt;&lt;p&gt;加入组织并搞定权限后，我们就可以正式开始写代码了。在进行 Git 操作前，我们需要先理清 Git 的四个核心空间概念。&lt;/p&gt;
&lt;h3 id=&#34;1-核心概念前置与空间映射&#34;&gt;1. 核心概念前置与空间映射
&lt;/h3&gt;&lt;p&gt;以下是 Git 底层流转概念与 VS Code 可视化操作的对应关系：&lt;/p&gt;
&lt;pre class=&#34;mermaid&#34;&gt;
  flowchart LR
    subgraph LocalEnv [本地电脑环境]
        direction LR
        Workspace[工作区&amp;lt;br&amp;gt;Working Directory]
        Index[暂存区&amp;lt;br&amp;gt;Staging Area]
        Local[本地仓库&amp;lt;br&amp;gt;Local Repository]
    end
    Remote[远程仓库&amp;lt;br&amp;gt;Remote Repository]

    Workspace -- &amp;#34;git add&amp;lt;br&amp;gt;(点击 + 号)&amp;#34; --&amp;gt; Index
    Index -- &amp;#34;git commit&amp;lt;br&amp;gt;(点击 提交)&amp;#34; --&amp;gt; Local
    Local -- &amp;#34;git push&amp;lt;br&amp;gt;(点击 同步更改)&amp;#34; --&amp;gt; Remote
    Remote -. &amp;#34;git pull&amp;lt;br&amp;gt;(自动/手动 拉取)&amp;#34; .-&amp;gt; Workspace
&lt;/pre&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;工作区 (Working Directory)&lt;/strong&gt;：你在编辑器里直接看到和修改的代码文件。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;暂存区 (Staging Area)&lt;/strong&gt;：一个缓冲地带，用于挑选并确定下一次要提交哪些修改（相当于“购物车”）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;本地仓库 (Local Repository)&lt;/strong&gt;：代码在本地的完整历史版本记录（相当于“本地结账”）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;远程仓库 (Remote Repository)&lt;/strong&gt;：托管在云端的代码库（相当于“云端备份”）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;2-完整工作流演示&#34;&gt;2. 完整工作流演示
&lt;/h3&gt;&lt;p&gt;无论你偏好可视化点击还是敲击命令行，底层流转逻辑是一致的。以下提供两种方式供你参考：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Step 1: 拉取项目 (Clone)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;VS Code 方式&lt;/strong&gt;：&lt;code&gt;Ctrl+Shift+P&lt;/code&gt; 唤出命令面板，输入 &lt;code&gt;Git: Clone&lt;/code&gt;，粘贴组织仓库的 SSH 地址。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Git 命令&lt;/strong&gt;：终端执行 &lt;code&gt;git clone &amp;lt;你的SSH仓库地址&amp;gt;&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Step 2: 编写代码 (Modify)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;VS Code 方式&lt;/strong&gt;：在工作区正常修改。VS Code 侧边栏“源代码管理”会提示文件被更改（M 或 U）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Git 命令&lt;/strong&gt;：随时可通过 &lt;code&gt;git status&lt;/code&gt; 命令查看当前有哪些文件被修改或未被追踪。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Step 3: 暂存更改 (Stage)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;VS Code 方式&lt;/strong&gt;：点击文件右侧的 &lt;code&gt;+&lt;/code&gt; 号。这就是把文件从“工作区”推入“暂存区”。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Git 命令&lt;/strong&gt;：终端执行 &lt;code&gt;git add .&lt;/code&gt;（暂存当前目录下所有更改），或指定单个文件 &lt;code&gt;git add &amp;lt;文件名&amp;gt;&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Step 4: 提交版本 (Commit)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;VS Code 方式&lt;/strong&gt;：在面板输入框填写提交信息（如 &lt;code&gt;feat: 新增登录接口&lt;/code&gt;），点击 “提交”。代码正式存入本地仓库。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Git 命令&lt;/strong&gt;：终端执行 &lt;code&gt;git commit -m &amp;quot;feat: 新增登录接口&amp;quot;&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Step 5: 推送云端 (Push)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;VS Code 方式&lt;/strong&gt;：点击 “同步更改 (Sync Changes)”，将本地仓库的新版本同步到远程仓库。 &lt;em&gt;(注：VS Code 的同步按钮实际上包含了 Pull 和 Push 两个动作)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Git 命令&lt;/strong&gt;：终端执行 &lt;code&gt;git push&lt;/code&gt;（若需先合并远程最新代码，可先执行 &lt;code&gt;git pull&lt;/code&gt;）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;五-进阶分支管理与子仓库&#34;&gt;五、 进阶：分支管理与子仓库
&lt;/h2&gt;&lt;p&gt;随着项目复杂度提升，你必然会用到分支与子仓库，这两者在团队协作中极为重要。&lt;/p&gt;
&lt;h3 id=&#34;1-分支的新建与合并-branch--merge&#34;&gt;1. 分支的新建与合并 (Branch &amp;amp; Merge)
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;为什么需要分支？&lt;/strong&gt;
为了不污染主线代码（&lt;code&gt;main&lt;/code&gt; / &lt;code&gt;master&lt;/code&gt;），开发新功能或修复 Bug 时，我们通常会拉取一个独立的分支，开发测试完毕后再合并回去。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;新建与切换&lt;/strong&gt;：在 VS Code 左下角点击当前分支名（如 &lt;code&gt;main&lt;/code&gt;），在弹出的菜单中选择 “创建新分支 (Create new branch)”，输入新分支名（如 &lt;code&gt;feat/user-login&lt;/code&gt;）即可自动切换。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;合并分支&lt;/strong&gt;：假设你在新分支开发完毕并提交了。先在左下角切换回 &lt;code&gt;main&lt;/code&gt; 分支，然后 &lt;code&gt;Ctrl+Shift+P&lt;/code&gt; 唤出面板，输入 &lt;code&gt;Git: Merge Branch&lt;/code&gt;，选择刚才的 &lt;code&gt;feat/user-login&lt;/code&gt;，即可将新代码合并到主线上。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;2-git-子仓库-submodule&#34;&gt;2. Git 子仓库 (Submodule)
&lt;/h3&gt;&lt;p&gt;&lt;strong&gt;什么是子仓库？&lt;/strong&gt;
在大型项目或微服务架构中，你可能需要在一个主 Git 仓库里嵌套另一个 Git 仓库（比如引用一个通用的 UI 组件库，或者把公共配置抽离出来）。这就是 Submodule。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;添加子仓库&lt;/strong&gt;：
在终端执行：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git submodule add &amp;lt;子仓库的git地址&amp;gt; &amp;lt;本地存放目录&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;踩坑提示&lt;/strong&gt;：当别人 Clone 含有子仓库的主项目时，默认情况下子仓库是空文件夹！必须使用递归拉取命令：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git clone --recursive &amp;lt;主仓库地址&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;em&gt;(如果已经 clone 完了，可以使用 &lt;code&gt;git submodule update --init --recursive&lt;/code&gt; 补救拉取)&lt;/em&gt;。&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
