说明:解决网页能访问 GitHub 但 Git CLI 推送失败的问题

核心现象

  • 浏览器正常:可以流畅访问 github.com 网页。

  • 命令行异常:执行 git pushgit pullgit clone 时出现 Connection refusedTimeoutRecv failure 错误。

深度原因分析

代理继承差异 (核心原因)

  • 浏览器:通常会自动检测 Windows 系统的「代理服务器」设置(如 Clash、V2Ray 等提供的系统代理模式),并自动走 127.0.0.1 的代理端口。

  • Git CLI:作为命令行工具,它默认不继承系统的 GUI 代理设置。它需要通过 .gitconfig 文件或环境变量手动指定代理端口。

协议与流量特征

  • HTTPS 干扰:GitHub 的 HTTPS 流量在推送大代码块时,特征非常明显,容易受到 ISP(运营商)或防火墙的深度包检测 (DPI) 干扰,导致连接在传输中途被重置。

  • DNS 污染:命令行工具使用的 DNS 解析可能与浏览器缓存的解析结果不同,导致解析到了失效的 GitHub IP。

终端环境差异

  • 在 Trae、VS Code 或 PowerShell 等不同终端中,如果没有在配置文件中显式导出 HTTP_PROXY 环境变量,Git 就会尝试直连。

解决方案汇总

方案 A:配置 Git 全局代理(最推荐,已执行)

通过显式告知 Git 代理工具的本地端口(通常为 7890 或 1080),让 Git 流量也走代理。

# 设置全局代理 (假设代理端口为 7890)
git config --global http.proxy http://127.0.0.1:7890
git config --global https.proxy http://127.0.0.1:7890

方案 B:针对 GitHub 单独配置(进阶版)

如果你不希望国内仓库(如 Gitee)也走代理,可以只针对 GitHub 生效:

git config --global http.https://github.com.proxy http://127.0.0.1:7890
git config --global https.https://github.com.proxy http://127.0.0.1:7890

方案 C:使用 SSH 协议(稳定性最高)

SSH 协议通常比 HTTPS 协议在推送大数据时更稳定。

  1. 生成并添加 SSH Key 到 GitHub 账户。

  2. 切换远程仓库地址

    git remote set-url origin git@github.com:MorningStar0709/ppt-master-enhanced.git

方案 D:临时环境变量注入

在不修改全局配置的情况下,只对当前会话生效:

$env:HTTP_PROXY="http://127.0.0.1:7890"
$env:HTTPS_PROXY="http://127.0.0.1:7890"
git push

验证与排查工具

  • 检查当前配置git config --global --get http.proxy

  • 测试 GitHub 连接ssh -T git@github.com (仅限 SSH 模式)

  • 查看解析 IPnslookup github.com

结论:在 Windows 办公环境下,Git 推送失败通常是由于 CLI 工具没有自动同步 GUI 代理软件的设置所致。通过 git config --global 显式指定代理是目前最快且最稳定的解决方案。