推送失败常由环境变量冲突间接引发,主要表现为https凭据错乱、ssh密钥未加载或终端与gui环境不一致;需先用git remote -v确认协议类型,再按对应路径排查钥匙串、ssh-agent配置及path加载问题。
推送失败本身不是环境变量直接导致的,但环境变量冲突会间接破坏 git 的认证链或命令查找路径,最终表现为 git push 失败。常见于 https 凭据错乱、ssh 密钥未加载、或终端与 gui 环境不一致这三类场景。
确认 Git 使用的是哪种协议
执行以下命令查看远程地址:
git remote -v
如果显示 https://github.com/xxx/yyy.git,问题大概率在钥匙串凭据;如果是 git@github.com:xxx/yyy.git,则重点排查 SSH 密钥和 agent 加载状态。
HTTPS 协议下钥匙串凭据冲突
macOS 钥匙串可能缓存多个同域名条目(如 github.com、git:https://github.com),互相覆盖导致认证失败:
- 打开「钥匙串访问」App,搜索
github.com(或你实际用的 Git 服务商域名) - 筛选类型为 internet password 的条目,服务器匹配域名,账户名为
git或你的邮箱 - 右键删除所有相关条目(不要编辑留空)
- 重新运行
git push,系统会弹窗要求输入账号 + Personal Access Token(启用 2FA 后必须用 token)
SSH 协议下密钥未生效或被干扰
即使私钥存在且公钥已上传,钥匙串仍可能拦截并提供错误密钥:
- 检查密钥是否已加载:ssh-add -l,若无输出,运行 ssh-add ~/.ssh/id_ed25519(替换为你实际的私钥路径)
- 禁用钥匙串对 SSH 的自动管理:在钥匙串中搜索
ssh,删掉类型为 SSH key 的无关条目 - 验证连接:ssh -T git@github.com,成功应返回 “Hi username! You've successfully authenticated.”
- 注意 GUI 应用(如 VS Code 内置终端)可能读取
~/.zprofile而非~/.zshrc,确保ssh-agent启动逻辑写在~/.zprofile中
终端与 GUI 环境不一致导致 PATH 或代理失效
某些 Git 操作(尤其是通过 IDE 触发的 push)依赖 GUI 启动的 shell 环境,而它不一定加载你修改过的 ~/.zshrc:
- 新开一个独立终端窗口(不是新标签页),运行 echo $PATH 和 which git,确认调用的是预期版本(比如 Homebrew 安装的 git 而非 Xcode 自带)
- 从 Finder 启动 Terminal.app 或 VS Code,再测试
git push,这才是真实 GUI 场景 - 若发现 GUI 下
git不可用,检查~/.zprofile是否缺失export PATH="/opt/homebrew/bin:$PATH"(Apple Silicon)或/usr/local/bin:$PATH(Intel) - 清空 shell 命令缓存:hash -d,避免旧路径残留











