复盘 Git+GitHub SSH 配置:从权限报错到免密推送的全流程解决方案

在之前的 Git 仓库操作中,我先后遇到了「403 权限拒绝」「SSH 22 端口超时」「认证主机提示」等问题,最终通过 SSH 配置解决了所有推送障碍。本文将聚焦 SSH 相关技术点,复盘 "为什么要配置 SSH""如何一步步配置""遇到问题怎么解决",形成可直接复用的操作手册,方便后续遇到同类问题时快速参考。

一、核心疑问:为什么一定要配置 SSH?

在尝试用 HTTPS 方式推送代码时,反复出现 remote: Permission to myAccount/MSE_for_TAD-hb.git denied to myAccount(403 权限错误),即使输入正确账号也无法解决。而 SSH 配置能从根本上解决这些问题,核心原因有 3 点:

1. 避开 HTTPS 凭证的 "坑"

  • GitHub 早在 2021 年就弃用了 "账号 + 密码" 的 HTTPS 登录方式,必须用「个人访问令牌(PAT)」替代,但我在操作中多次因 "凭证缓存过期""PAT 权限不全" 报错;

  • SSH 通过「密钥对」认证(本地私钥 + GitHub 公钥),无需每次输入账号密码,也不存在 "凭证过期" 问题,一次配置终身免密。

2. 解决国内网络 "22 端口拦截" 问题

我执行 git push 时多次遇到 ssh: connect to host ``github.com`` port 22: Connection timed out,这是国内网络常见问题 ------ 多数网络环境会拦截 SSH 默认的 22 端口,而配置 SSH 时可指定走 443 端口(HTTPS 默认端口,几乎不被拦截),直接绕开网络限制。

3. 更安全的身份认证

  • HTTPS 凭证(PAT)若不慎泄露,攻击者可直接操作我的仓库;

  • SSH 采用 "非对称加密":本地私钥仅保存在我的电脑,GitHub 仅存储公钥,即使公钥泄露,没有私钥也无法认证,安全性更高。

二、SSH 配置全流程(复盘我的操作轨迹,每步对应问题)

我的 SSH 配置过程曾因「.ssh 目录不存在」「端口未指定」「公钥未添加」等卡壳,以下是修正后的完整流程,每步都标注了 "对话场景呼应",帮我回忆当时的操作细节:

步骤 1:创建.ssh 目录(解决 "cd ~/.ssh: No such file or directory")

我最初执行 cd ~/.ssh 时报错 "目录不存在",需先创建目录(默认路径:C:\Users\我的用户名\.ssh):

进入gitbash界面,依次执行以下命令:

复制代码
\# 1. 进入用户根目录(Windows下\~对应C:\Users\我的用户名)
​
cd \~
​
\# 2. 创建.ssh目录(若已存在则忽略)
​
mkdir .ssh
​
\# 3. 进入.ssh目录(后续操作都在此目录下)
​
cd .ssh
​
\# 验证:执行pwd,输出应类似 /c/Users/HB/.ssh(HB是我的用户名)
​
pwd

步骤 2:生成 SSH 密钥对(核心:用于 GitHub 认证)

我需要生成「ed25519 类型」密钥(比传统 RSA 更安全、密钥更小),命令中邮箱需用我 GitHub 注册的邮箱:

复制代码
\# 生成ed25519密钥,-C后接邮箱(备注作用,方便区分设备)
​
ssh-keygen -t ed25519 -C "注册github使用的邮箱@xxx.com"           

执行后会出现 3 次提示,全程按回车键(无需设置密码,简化后续操作):

  • 提示 1:Enter file in which to save the key (/c/Users//.ssh/id_ed25519): → 回车(默认路径);

  • 提示 2:Enter passphrase (empty for no passphrase): → 回车(无密码);

  • 提示 3:Enter same passphrase again: → 回车(确认无密码)。

生成结果验证:

执行后在 .ssh 目录下会生成两个文件:

  • id_ed25519:本地私钥(绝对不能泄露,不要上传到仓库);

  • id_ed25519.pub:公钥(需要上传到 GitHub,用于身份匹配)。

步骤 3:配置 SSH 走 443 端口(解决 "22 端口超时")

这是解决我「SSH 连接超时」的关键步骤 ------ 通过配置文件强制 SSH 连接 GitHub 时走 443 端口,避开 22 端口拦截:

复制代码
\# 在.ssh目录下创建config文件(无后缀),写入端口配置
​
echo -e "Host github.com\n  Hostname ssh.github.com\n  Port 443\n  User git\n  IdentityFile \~/.ssh/id\_ed25519" > config
​
\# 验证配置内容(确保无拼写错误)
​
cat config
配置参数解读(对应我的场景):
  • Host ``github.com:对 "github.com" 这个域名生效;

  • Hostname ``ssh.github.com:GitHub 的 SSH 专用域名(固定值);

  • Port 443:指定连接端口为 443(解决 22 端口超时);

  • User git:SSH 连接 GitHub 的固定用户名(必须是 git,不能改);

  • IdentityFile ~/.ssh/id_ed25519:指定使用刚才生成的私钥(路径要正确)。

步骤 4:将公钥添加到 GitHub(解决 "权限认证失败")

SSH 认证的核心是 "GitHub 存储的公钥" 与 "我本地的私钥" 匹配,因此需要将 id_ed25519.pub 中的内容添加到 GitHub:

步骤 4.1:复制公钥内容
复制代码
\# 读取公钥文件内容并复制(Windows下可直接全选输出结果,Ctrl+C复制)
​
cat id\_ed25519.pub

输出示例(需全选复制以 ssh-ed25519 开头的整行):

复制代码
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIxxxxxxxxxxxxxxxxx我的公钥内容xxxxxxxxxxxxxx HB@BEN-WIN
步骤 4.2:在 GitHub 中添加公钥
  1. 登录我的 GitHub 账号(myAccount),点击右上角头像 → 选择「Settings」;

  2. 在左侧菜单找到「SSH and GPG keys」→ 点击「New SSH key」;

  3. 填写两个核心字段:

  • 「Title」:填备注(如 "BEN-WIN 电脑",方便区分多台设备);

  • 「Key」:粘贴刚才复制的公钥内容(确保无多余空格 / 换行);

  1. 点击「Add SSH key」完成添加(若弹出账号验证,输入 GitHub 密码即可)。

步骤 5:测试 SSH 连接(验证配置是否成功)

这是 "临门一脚",需确认 SSH 能正常连通 GitHub,对应我之前遇到的「The authenticity of host」提示:

复制代码
\# 测试SSH连接GitHub(-T表示“不打开终端,仅测试认证”)
​
ssh -T git@github.com
场景 1:首次连接(出现主机认证提示)

我首次执行时会看到以下提示,这是 SSH 的安全验证(确认连接的是真实 GitHub 服务器):

复制代码
The authenticity of host '\[ssh.github.com]:443 (\[20.205.243.160]:443)' can't be established.
​
ED25519 key fingerprint is SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU.
​
This key is not known by any other names.
​
Are you sure you want to continue connecting (yes/no/\[fingerprint])?
  • 操作 :输入小写 yes(必须小写,不能输 Y/YES),回车;

  • 原理 :GitHub 官方公开的 ED25519 指纹就是 SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU,确认匹配即可安全连接。

场景 2:连接成功(核心验证结果)

若输出以下内容,说明 SSH 配置完全成功,我的身份已通过 GitHub 认证:

复制代码
Warning: Permanently added '\[ssh.github.com]:443,\[20.205.243.160]:443' (ED25519) to the list of known hosts.
​
Hi myAccount! You've successfully authenticated, but GitHub does not provide shell access.
  • 关键信息:Hi myAccount! You've successfully authenticated(认证成功)。

三、SSH 配置后的后续操作(复盘我的推送流程)

SSH 配置成功后,还需关联仓库并解决「分支落后」问题,才能顺利推送代码,对应我最后遇到的 non-fast-forward 报错:

步骤 1:关联 GitHub 仓库(替换 HTTPS 地址为 SSH)

我之前的远程地址是 HTTPS 格式,需替换为 SSH 地址(避免混用导致报错):

复制代码
\# 1. 进入我的项目目录(替换为实际路径)
​
cd /d/Code/DeepLearning/TAL/MSE\_for\_TAD/MSE\_for\_TAD-hb
​
\# 2. 查看当前远程地址(确认是HTTPS格式)
​
git remote -v
​
\# 3. 删除旧的HTTPS远程地址(默认远程名为origin)
​
git remote rm origin
​
\# 4. 添加新的SSH远程地址(替换为我的仓库SSH地址)
​
\# 仓库SSH地址获取:GitHub仓库页面 → Code → SSH → 复制
​
git remote add origin git@github.com:myAccount/MSE\_for\_TAD-hb.git
​
\# 5. 验证远程地址(输出应为SSH格式)
​
git remote -v

步骤 2:拉取远程分支(解决 "non-fast-forward" 分支落后)

我推送时曾报错 Updates were rejected because the tip of your current branch is behind,原因是 "本地分支落后于远程(如远程有 README 文件,本地没有)",需先拉取对齐:

复制代码
\# 拉取远程master分支,--allow-unrelated-histories解决“历史无关”问题
​
\# -X theirs自动用远程内容覆盖本地冲突(如README文件)
​
git pull origin master --allow-unrelated-histories -X theirs

步骤 3:最终推送代码(免密成功)

拉取对齐后,执行推送命令,此时已无需输入账号密码,直接免密推送:

复制代码
\# -u 绑定本地master分支与远程master分支(仅首次推送需要)
​
git push -u origin master
推送成功的输出示例:
复制代码
Enumerating objects: 8, done.
​
Counting objects: 100% (8/8), done.
​
Delta compression using up to 32 threads
​
Compressing objects: 100% (5/5), done.
​
Writing objects: 100% (6/6), 580 bytes | 580.00 KiB/s, done.
​
Total 6 (delta 0), reused 0 (delta 0), pack-reused 0
​
To github.com:myAccount/MSE\_for\_TAD-hb.git
​
   a1b2c3d..d4e5f6g  master -> master
​
Branch 'master' set up to track remote branch 'master' from 'origin'.

四、复盘关键:遇到 SSH 问题的排查流程(后续复用)

若后续再次遇到 SSH 相关报错,可按以下流程排查,覆盖我之前遇到的所有场景:

1. 先检查 SSH 连接是否正常

复制代码
\# 核心命令:测试SSH连接
​
ssh -T git@github.com
​
\# 若输出“Hi 用户名!” → 连接正常;若超时/认证失败 → 进入下一步

2. 检查.ssh 配置文件

复制代码
\# 查看config文件内容,确认443端口配置正确
​
cat \~/.ssh/config
​
\# 重点检查:Hostname是否为ssh.github.com、Port是否为443、IdentityFile路径是否正确

3. 检查公钥是否在 GitHub 中

  • 登录 GitHub → Settings → SSH and GPG keys → 确认已添加的公钥 "Title" 与我的设备匹配,且公钥内容与 ~/.ssh/id_ed25519.pub 一致。

4. 检查远程地址是否为 SSH 格式

复制代码
git remote -v
​
\# 输出应为 git@github.com:用户名/仓库名.git,而非https://开头

五、总结:SSH 配置的核心要点(复盘速记)

  1. 核心目的:解决 HTTPS 的 403 权限错误、22 端口超时,实现免密推送;

  2. 关键步骤:创建目录→生成密钥→配置 443 端口→添加公钥→测试连接→关联仓库→拉取推送;

  3. 避坑重点

  • 目录路径:~/.ssh 对应 Windows 的 C:\Users\用户名\.ssh

  • 端口配置:必须指定 Port 443,避开 22 端口拦截;

  • 认证提示:首次连接需输入小写 yes,而非 Y/YES;

  • 远程地址:必须替换为 SSH 格式,避免 HTTPS 与 SSH 混用。

通过以上流程,可在任何设备上复现 SSH 配置操作,快速解决 Git+GitHub 的推送问题,无需再反复排查权限或网络错误。

(注:文档部分内容可能由 AI 生成,注意甄别)

相关推荐
长安城没有风4 小时前
在 IntelliJ IDEA 中高效使用 Git 的实用指南
java·git·intellij-idea
Zaki_gd4 小时前
【GIT】-- gitignore已经提交的文件
git
周杰伦_Jay5 小时前
【Agent智能体】开发流程与开源框架对比(GitHub热门项目分析)
开源·github
CoderJia程序员甲5 小时前
GitHub 热榜项目 - 日榜(2025-12-14)
ai·llm·github
nvd115 小时前
GKE web 应用实现 Auth0 + GitHub OAuth 2.0登录实施指南
前端·github
_OP_CHEN5 小时前
【Git原理与使用】(六)Git 企业级开发模型实战:从分支规范到 DevOps 全流程落地
大数据·linux·git·gitee·项目管理·devops·企业级组件
永恒-龙啸6 小时前
闲置机安装istoreos+常用软件介绍
linux·github·开源软件·istoreos
Irene19916 小时前
GitHub 新建项目操作指南
github
测试人社区-小明6 小时前
医疗AI测试:构建安全可靠的合规体系
运维·人工智能·opencv·数据挖掘·机器人·自动化·github