能配,但必须同时清除全局 user.name/user.email、为各账号生成独立 SSH 密钥、用 ~/.ssh/config 绑定 Host 与私钥;缺一即导致 Permission denied 或作者信息错乱。
直接说结论:能配,但必须同时处理三件事——清掉全局
和
、为每个账号生成独立 SSH 密钥、用
绑定 Host 别名与私钥。漏掉任意一环,push 时就会报
或提交人显示错账号。
为什么
git
config --global --unset user.name 必须做
Git 提交时的 author 信息默认按 global → local 顺序继承。如果留着全局配置,哪怕你给某个仓库单独设了
,只要 clone 后没手动进仓库配一次,第一次 commit 就会套用全局值——结果是代码推到 GitHub,作者却显示成 Gitee 账号名。
执行
确认输出里没有
和
别信“我只用 local 配置就够了”,很多 GUI 工具(如 VS Code 内置 Git)会跳过 local 检查,直取 global
清除后,每个仓库都得进目录单独跑一遍
和
ssh-keygen 命名不带下划线或点,否则 Windows 下可能失效
Windows 的 OpenSSH 客户端对文件名敏感,
或
在部分 Git for Windows 版本中会被忽略。实测稳定写法是纯字母 + 数字 + 下划线,且不能以数字开头。
正确示例:
错误示例:
、
、
生成时密码建议直接回车空过,否则每次 push 都要输——除非你在公司强制要求密钥口令
公钥上传前用
看一眼,确认开头是
,不是乱码或换行截断
~/.ssh/config 的 Host 名必须和 git remote URL 里的主机名完全一致
很多人卡在这步:明明 config 里写了
,但 clone 用的是
,却还是走默认密钥。问题出在 SSH 匹配逻辑——它只认 URL 中
后面第一个词,且不解析路径。
Git
程序猿必备版本控制工具
下载
如果你的 remote 是
,config 的
必须写
(不能写
)
如果你想用别名(比如避免改所有 remote),就得把 remote 改成
,同时 config 里对应写
字段才是真实域名,比如
;
路径推荐用正斜杠,Windows 下也认:
测试是否生效:运行
,返回
才算通;如果还报权限拒绝,说明 config 没加载或路径写错
git remote add 时 URL 主机名要和 config 对齐
这是最容易被忽略的操作衔接点。config 配好了,但你 clone 或 add remote 时仍用原始域名,SSH 根本不会去查 config 里的别名映射。
假设 config 里定义了
,那 remote 地址必须是
,不是
已有仓库想切换账号?先
,再 push
别依赖 GitHub Desktop 或 Sourcetree 的图形界面自动识别——它们常缓存旧 remote,手动改完记得重启客户端
检查当前 remote:
,确保输出里的主机名和 config 的
项一致
真正麻烦的从来不是生成密钥或写 config,而是每个环节的命名和 URL 必须咬死对齐:config 的 Host、remote 的主机名、
的邮箱,三者缺一不可地指向同一个账号身份。稍有错位,错误信息就只会冷冰冰地报 “Permission denied” 或 “author mismatch”,不会告诉你哪一环断了。
user.nameuser.email~/.ssh/configPermission denied (publickey)git config --local user.namegit config --global --listuser.nameuser.emailgit config --local user.name "xxx"git config --local user.email "xxx@xxx.com"id_rsa_github.comid_rsa-githubssh-keygen -t rsa -C "me@github.com" -f ~/.ssh/id_rsa_ghid_rsa.github01_giteeid-rsa-gitlabcat ~/.ssh/id_rsa_gh.pubssh-rsa AAAA...Host github.comgit@github.com:xxx/yyy.git@git@github.com:xxx/yyy.gitHostgithub.commygithubgit@mygithub:xxx/yyy.gitHost mygithubHostNameHostName github.comIdentityFileIdentityFile ~/.ssh/id_rsa_ghssh -T git@github.comHi xxx!Host gitee-workgit@gitee-work:username/repo.gitgit@gitee.com:...git remote set-url origin git@gitee-work:username/repo.gitgit remote get-url originHostgit config --local user.email