适用读者:
git clone卡住或超时的人;一台机器要同时对接多个代码平台的人。
前置:S01-B10(Git 入门,含 SSH 密钥)。
实测环境:Ubuntu 24.04.1 / OpenSSH 9.x / Git 2.43.0;ssh.github.com:443与ssh -G解析结果均为 2026-11-05 实测。
覆盖旧文:A-1401(GitHub,72 点)、A-1402(Gitcode,72 点)、A-1403(Gitee,76 点)、A-1937(访问 GitHub 的四种方式,27 点)、A-1850(22 端口改 443,24 点)、A-1376(IDEA 配置 GitHub,34 点)= 305 点。
新增扩展:E-S01-014(~/.ssh/config、ProxyJump、ed25519)。
上一篇:S01-B10 · Git 入门:安装、账户、SSH、克隆与提交
下一篇:S01-X01 · 工具与库速查(基础层附录)。
1. 一句话结论
"连不上"分四层:DNS 解析 → TCP 连接 → SSH 握手 → 身份认证。ssh -vT 的输出能直接告诉你卡在第几层——先分层,再动手。
| 层 | 卡住的典型表现 | 一句话判断 |
|---|---|---|
| DNS | Could not resolve hostname |
域名解析失败(网络/本地 DNS/被污染) |
| TCP | Connection timed out / Connection refused |
端口不通(防火墙、运营商、平台限制) |
| 握手 | Connection closed by remote host |
通了但被中间设备掐断 |
| 认证 | Permission denied (publickey) |
网络没问题,是密钥/账号(B10 §3) |
第三、四层的区别尤其重要:很多"连不上"其实是"连上了但不认你",改配置就能解决,不需要任何网络手段。
2. 三个平台:差异比想象中大
| 维度 | GitHub | Gitee(码云) | Gitcode |
|---|---|---|---|
| 注册门槛 | 邮箱即可 | 需手机号(实名要求更严) | 需手机号 |
| SSH 入口 | ssh.github.com(默认 22) |
gitee.com |
gitcode.com(待核:当前入口域名) |
| SSH over 443 | ✅ 官方支持 | 支持(待核) | 待核 |
| 国内直连稳定性 | 不稳定(时通时断) | 稳定 | 较好 |
| 私有仓库免费 | ✅ 无限 | ✅ 有名额限制 | ✅ |
| CI 能力 | Actions(额度充足) | Gitee Go(额度较小) | 待核 |
| 镜像/同步 | — | 支持从 GitHub 同步 | 支持导入 |
选型判据:代码的主人是发布者还是协作者。
- 对外开源、要被全球看到 → GitHub。
- 国内团队协作、要合规实名 → Gitee。
- 国内且以"镜像 + 私有"为主 → Gitcode 或自建 GitLab。
三个平台可以同时作为 remote(见 §5.3):
origin指主平台,mirror指镜像平台,一条git push --all mirror完成同步。旧文三篇各讲一家,但没有把"同事多平台"这件事讲透。
3. 访问 GitHub 的四种方式(A-1937 的重排)
| 方式 | 做法 | 速度 | 风险与代价 |
|---|---|---|---|
| ① HTTPS 直连 | git clone https://github.com/u/r.git |
不稳定 | 私有库需 token,且 token 泄露风险 |
| ② SSH(22) | git clone [email protected]:u/r.git |
不稳定 | 22 端口常被阻断 |
| ③ SSH(443) | ssh.github.com:443 |
较稳定 | 需要配置(§4);部分企业网络仍拦 |
| ④ 代理/镜像 | HTTPS_PROXY 或第三方镜像站 |
取决于节点 | 镜像站可能缓存旧代码或被篡改,生产依赖不可取 |
推荐顺序:③ → ② → ① → ④。理由:SSH 密钥认证比 token 更难泄露;443 端口在受限网络里存活率最高;镜像站只适合"读",不适合作为唯一来源。
3.1 关于代理
# 只给 Git 用(不改全局环境变量)
git config --global http.proxy http://127.0.0.1:7890
# SSH 无法用 http 代理,需要 nc/connect 转发(见 §4.3)
别把代理写进全局环境变量:会影响 Maven、npm、IDE 等一切流量,制造"某个工具突然连不上"的幽灵问题。
4. 22 端口不通怎么办(A-1850 的实测验证)
旧文 A-1850 记录了一个真实场景:ssh: connect to host github.com port 22: Connection timed out。解法是把 SSH 流量走到 443。
4.1 先验证 443 到底通不通(实测)
$ timeout 20 ssh -o BatchMode=yes -p 443 -T [email protected]
Warning: Permanently added '[ssh.github.com]:443' (ED25519) to the list of known hosts.
[email protected]: Permission denied (publickey).
注意这条结果怎么读:它返回了 Permission denied (publickey)——说明 TCP 443 通了、SSH 握手成功,只是我这台机器没有 GitHub 密钥。"认证失败"在这里是好消息,它证明链路可用。
# 更底层的端口验证(不依赖 ssh 客户端)
$ exec 3<>/dev/tcp/ssh.github.com/443 && echo "443 端口可连"
443 端口可连
4.2 ~/.ssh/config 写法
Host github
HostName ssh.github.com
Port 443
User git
IdentityFile ~/.ssh/id_ed25519_github
之后克隆用别名即可:
git clone github:username/repo.git # 等价于 [email protected]:443/username/repo.git
注意:
Host github这个别名一旦存在,git clone [email protected]:...仍走 22 端口(别名不匹配)。要么统一用别名,要么把 Host 写成github.com让默认域名也走 443:Host github.com HostName ssh.github.com Port 443 User git
4.3 用 ProxyCommand 走 HTTP 代理(SSH 不支持 http 代理)
Host github.com
HostName ssh.github.com
Port 443
User git
ProxyCommand nc -X connect -x 127.0.0.1:7890 %h %p
macOS 自带 nc 支持 -X connect;Linux 需要 netcat-openbsd。
5. 一台机器三个平台:~/.ssh/config 的写法与验证
5.1 配置(实测用过的样例)
Host github
HostName ssh.github.com
Port 443
User git
IdentityFile ~/.ssh/id_ed25519_github
Host gitee
HostName gitee.com
User git
IdentityFile ~/.ssh/id_ed25519_gitee
Host blog
HostName 69.165.66.239
User root
Port 22
5.2 验证:ssh -G(不发起连接)
$ for h in github gitee blog; do ssh -G $h | grep -E '^(hostname|port|user) '; done
--- github ---
user git
hostname ssh.github.com
port 443
--- gitee ---
user git
hostname gitee.com
port 22
--- blog ---
user root
hostname 69.165.66.239
port 22
这是排障的第一条命令(2026-11-05 实测):它只解析配置、不连网,能立刻证明"到底是配置写错,还是网络不通"。
5.3 多平台同时作为 remote
git remote add origin github:me/repo.git
git remote add mirror gitee:me/repo.git
git push origin main
git push mirror main # 推送镜像
git remote -v # 确认两个地址都在
6. 在 IDEA 里绑定 GitHub(A-1376)
Settings → Version Control → GitHub → + →
A. Log In via GitHub…(浏览器 OAuth,推荐)
B. Log In with Token…(粘贴 PAT,需勾 repo / read:org 权限)
验证:Settings → Version Control → GitHub 里显示账号;Git → Clone 对话框能列出你的仓库。
| 现象 | 原因 | 修法 |
|---|---|---|
| OAuth 登录后仍显示未授权 | 浏览器登录的账号与 IDE 期望不一致 | 退出 IDE 账号,用 Token 方式重登 |
| Clone 列表为空 | Token 缺 repo 权限 |
重新签发 PAT 并勾选 |
| 企业内网无法 OAuth | 需要走代理 | Settings → Appearance & Behavior → System Settings → HTTP Proxy |
Token 不要贴在聊天/文档里。用后即撤销(GitHub → Settings → Developer settings → Tokens)。
7. 排障决策树
git clone / ssh 失败
│
1. ssh -G <alias> → 配置解析对不对?(hostname/port/user/identityfile)
│ 错 → 改 ~/.ssh/config
│ 对 ↓
2. ssh -vT <alias> → 卡在哪一层?
│ Could not resolve hostname → DNS(换 DNS / 检查 /etc/hosts)
│ Connection timed out → TCP(端口被封 → 试 443,见 §4)
│ Connection closed by remote host → 中间设备掐断(换端口/换网络)
│ Permission denied (publickey) → 认证(回 B10 §3)
│ 成功 ↓
3. git remote -v → 远端地址是不是你要的平台/协议?
4. git ls-remote <url> → 不克隆、只握手验证仓库可读
git ls-remote 是被低估的一步:它验证"地址 + 认证 + 仓库存在"三件事,但不下载任何内容。
8. 旧文对照
| 旧文 | 内容 | 本篇处理 |
|---|---|---|
| A-1401 | GitHub 平台介绍与使用 | 并入 §2 差异表;补 SSH over 443 与 PAT 替代密码 |
| A-1402 | Gitcode 平台介绍 | 并入 §2;入口域名标「待核」(旧文口径较早) |
| A-1403 | Gitee 平台介绍 | 并入 §2;补实名与私有库名额限制 |
| A-1937 | 访问 GitHub 的四种方式 | §3 重排为"推荐顺序 + 风险",补镜像站不可作生产依赖 |
| A-1850 | 22 改 443 的报错与命令 | §4 实测复现(ssh.github.com:443 + /dev/tcp 验端口);补 ProxyCommand 走 HTTP 代理 |
| A-1376 | IDEA 配置 GitHub | §6 保留,补 OAuth/Token 两条路径的取舍与故障表 |
| — | 旧文各自孤立,没有"多平台共存" | 新增 §5(ssh -G 实测输出 + 多 remote 镜像) |
9. 自测
Permission denied (publickey)说明网络通不通?为什么?Host github与Host github.com两种写法,对[email protected]:...的影响有什么不同?ssh -G与ssh -vT分别解决什么问题?- 用镜像站作为唯一代码来源有什么风险?
git ls-remote能验证哪三件事?
10. 下一篇
S01-X01 · 工具与库速查:JSON、日志、测试、数据库、AI 编码客户端
基础层的最后一篇是"速查型附录":把旧文里 10 张「待复核」的工具卡(fastjson / Gson / Jackson / Log4j 系 / SLF4J / JUnit / DBeaver / Knife4j / Forest / 其他轮子)压成一张可查的表——每类工具给出"用/不用"判据,并指向后续系列的主讲文章。
本篇属于系列《S01 · 开发环境与工具链》。旧文来源:A-1401/1402/1403/1937/1850/1376;扩展点 E-S01-014。ssh -G、443 可达性为 2026-11-05 实测。