1. 问题现象
很多开发者遇到过这个奇怪的现象:
- ✅ 浏览器可以正常打开
github.com - ❌ 终端执行
git pull、git push、git clone超时报错
报错信息通常是这样的:
fatal: unable to access 'https://github.com/xxx/xxx.git/':
Failed to connect to github.com port 443 after 21046 ms: Timed out
2. 原因分析
核心原因:浏览器和 Git 走的网络通道不一样。
| 程序 | 网络方式 | 说明 |
|---|---|---|
| 浏览器 | 系统代理 | 自动读取系统代理设置(Clash/V2Ray 等) |
| Git | 直连 | 默认不走系统代理,直接连接目标服务器 |
在国内网络环境下,直连 GitHub 经常不稳定或被干扰,导致超时。而浏览器通过代理工具(Clash、V2Ray、Shadowsocks 等)绕过了这个问题。
3. 解决方案:为 Git 配置代理
3.1 确认代理端口
首先找到你代理工具的本地监听端口。常见代理工具的默认端口:
| 代理工具 | 默认 HTTP 端口 | 默认 SOCKS5 端口 |
|---|---|---|
| Clash for Windows | 7890 | 7891 |
| Clash Verge | 7897 | 7898 |
| V2RayN | 10809 | 10808 |
| Shadowsocks | 1080 | 1080 |
也可以在代理工具的设置界面中查看。
3.2 Windows 设置方法
打开终端(PowerShell 或 Git Bash),执行:
# 设置 HTTP 和 HTTPS 代理(以 Clash 默认端口 7890 为例)
git config --global http.proxy http://127.0.0.1:7890
git config --global https.proxy http://127.0.0.1:7890
如果使用 SOCKS5 代理:
git config --global http.proxy socks5://127.0.0.1:7891
git config --global https.proxy socks5://127.0.0.1:7891
3.3 macOS / Linux 设置方法
与 Windows 完全相同,在终端中执行同样的命令即可。
3.4 验证配置
# 查看当前代理配置
git config --global --get http.proxy
git config --global --get https.proxy
# 测试拉取
git pull
如果输出 http://127.0.0.1:7890 且 git pull 正常执行,说明配置成功。
4. 只对 GitHub 走代理
如果你只想让 Git 访问 GitHub 时走代理,其他仓库(如公司内网 GitLab)不走代理,可以这样设置:
# 只对 github.com 走代理
git config --global http.https://github.com.proxy http://127.0.0.1:7890
这样访问非 GitHub 的仓库时,Git 会直连,不受代理影响。
5. 取消代理配置
当你不需要代理时(比如换了网络环境),可以随时取消:
# 取消全局代理
git config --global --unset http.proxy
git config --global --unset https.proxy
# 取消 GitHub 专属代理
git config --global --unset http.https://github.com.proxy
6. 使用 SSH 方式替代 HTTPS
除了配置代理,还可以将远程地址从 HTTPS 切换为 SSH,SSH 方式通常更稳定:
# 查看当前远程地址
git remote -v
# 切换为 SSH 地址
git remote set-url origin git@github.com:用户名/仓库名.git
⚠️ 使用 SSH 方式需要先配置 SSH Key,可参考 GitHub SSH 配置文档。
7. 常见问题
Q: 配置代理后仍然超时?
检查代理工具是否正在运行,端口是否正确。可以先用浏览器确认代理工具正常工作。
Q: 代理端口怎么查?
- Clash for Windows:设置 → Port → 查看 HTTP Port
- V2RayN:设置 → 参数设置 → 本地监听端口
- 通用方法:在 PowerShell 中运行以下命令查看系统代理:
[System.Net.WebRequest]::DefaultWebProxy.GetProxy('https://github.com')
输出中的 127.0.0.1:端口号 就是你的代理地址。
Q: 公司内网 GitLab 也受影响?
使用第 4 节的「只对 GitHub 走代理」方案,或使用 SSH 方式访问内网仓库。
8. 总结
| 方案 | 优点 | 缺点 |
|---|---|---|
| 全局 HTTP 代理 | 简单直接 | 所有 Git 操作都走代理 |
| GitHub 专属代理 | 精准控制 | 只对 GitHub 生效 |
| SSH 方式 | 稳定可靠 | 需要额外配置 SSH Key |
推荐组合使用:GitHub 专属代理 + SSH 方式,兼顾便利性和稳定性。