git 通过 ~/.ssh/config 文件指定 ssh 密钥,需为每个 github 账号配置独立 host 别名(如 github-personal)、hostname github.com、user git 和绝对路径 identityfile;仓库 remote url 必须使用该别名,且 config 文件权限须为 600。

怎么让 Git 知道该用哪个 SSH 密钥
Git 本身不直接管理 SSH 账号,它靠系统级的 ssh 命令来走通认证。关键在 ~/.ssh/config —— 这个文件才是决定“连 github.com 时到底用哪把密钥”的开关。
常见错误现象:git push 总是报 Permission denied (publickey),或者明明配了新账号却还是推到旧账号仓库里。
- 必须确保每个 GitHub 账号对应一对独立密钥(比如
id_rsa_personal和id_rsa_work),不能共用同一把私钥 -
~/.ssh/config里每个Host别名要唯一,且不能和真实域名冲突(别写Host github.com) - Git 仓库的 remote 地址必须改用你定义的 Host 别名,比如从
git@github.com:user/repo.git改成git@github-personal:user/repo.git
~/.ssh/config 文件怎么写才不踩坑
这个文件不是 Git 配置,是 OpenSSH 的客户端配置,语法敏感,缩进和空格不影响,但大小写和字段名必须严格。
典型错误:漏写 IdentityFile、User git 写成 user git(首字母小写无效)、Host 别名后多加了路径或端口。
-
Host后面是你自己起的别名(如github-personal),之后所有git clone或git remote set-url都得用它 -
HostName github.com是真实目标域名,不能省略或写错 -
IdentityFile必须写绝对路径,推荐用~/.ssh/id_rsa_personal这种形式,不要用相对路径 - 每组配置之间空一行,避免被当成同一段
Host github-personal HostName github.com User git IdentityFile ~/.ssh/id_rsa_personal Host github-work HostName github.com User git IdentityFile ~/.ssh/id_rsa_work
怎么改已有的仓库绑定账号
改 remote URL 是最直接的办法。很多人以为改了全局 user.name 就能切账号,其实没用——GitHub 只认 SSH key,不看 Git 用户名。
常见错误现象:commit 里显示的是 A 账号的 name/email,但 push 却失败,或者成功推到了 B 账号下。
- 先确认当前 remote:
git remote get-url origin - 如果还是
git@github.com:...,就立刻换掉:git remote set-url origin git@github-personal:username/repo.git - 每个仓库都要单独设置,没有“全局切换”这回事
- 可以配合
git config user.name和git config user.email控制 commit 签名,但这和 SSH 认证完全无关
为什么 clone 新仓库时还走默认密钥
因为 git clone git@github.com:user/repo.git 中的 github.com 没匹配上你 ~/.ssh/config 里的任何 Host 别名,ssh 默认 fallback 到 id_rsa。
性能/兼容性影响:不用别名也能工作,但一旦多个账号共存,就必然混乱;某些 CI 环境或老旧 Git 客户端对 Host 别名支持弱,建议始终显式使用别名。
- clone 时直接用别名:
git clone git@github-work:org/repo.git - 别依赖
git clone https://...+ token,那绕开了 SSH,又得单独管 token 权限和过期 - 检查是否生效:执行
ssh -T git@github-personal,看到 Hi xxx! 才算通
最容易被忽略的是:改完 ~/.ssh/config 后,不需要重启终端或重装 Git,但必须确保文件权限是 600(chmod 600 ~/.ssh/config),否则 ssh 会静默忽略它。











