生成两个不同的 SSH 密钥
首先,我们需要为两个账号分别生成一套密钥对。切记不要一律回车使用默认文件名(id_ed25519),否则后生成的会覆盖掉先生成的。
打开 Git Bash,依次运行以下命令:
- 生成个人账号的密钥
ssh-keygen -t ed25519 -C "your_personal_email@example.com" -f ~/.ssh/id_ed25519_personal
2. 生成工作账号的密钥
ssh-keygen -t ed25519 -C "your_work_email@example.com" -f ~/.ssh/id_ed25519_work
提示:运行后会提示输入密码(passphrase),可以直接连续按回车跳过。现在你的 ~/.ssh/ 目录下应该有 4 个文件:两个公钥(.pub)和两个私钥。
将公钥添加到对应的 GitHub 账号
登录你的个人 GitHub 账号,进入 Settings -> SSH and GPG keys -> New SSH key。
在 Git Bash 中运行以下命令,复制个人公钥的内容,贴到 GitHub 中:
cat ~/.ssh/id_ed25519_personal.pub
退出个人账号,登录你的工作 GitHub 账号,同样进入 SSH and GPG keys。
在 Git Bash 中运行以下命令,复制工作公钥的内容并添加:
cat ~/.ssh/id_ed25519_work.pub
创建并配置 SSH config 文件
这一步是核心。我们需要告诉 SSH,当遇到不同的托管地址时,该掏出哪把钥匙。
- 在
~/.ssh/目录下创建一个名为config的文件(注意没有后缀名):
touch ~/.ssh/config
2. 使用记事本或编辑器打开它(也可以在 Git Bash 中运行 notepad ~/.ssh/config),将以下内容复制进去并保存:
# 账号一:张三丰(使用自定义别名,走443端口)
Host github-zhang-shanfeng
HostName ssh.github.com
Port 443
User git
IdentityFile ~/.ssh/id_ed25519_zhang_shanfeng
# 账号二:小土坡(使用自定义别名,走443端口)
Host github-xiaotupo-com
HostName ssh.github.com
Port 443
User git
IdentityFile ~/.ssh/id_ed25519
# 默认配置:为了让你平时不加别名直接使用 github.com 时,也能正常走443端口(默认指向小土坡账号)
Host github.com
HostName ssh.github.com
Port 443
User git
IdentityFile ~/.ssh/id_ed25519
💡 核心逻辑解析:
- Host:这是你自定义的“别名”。个人账号我们保留了原生的
github.com;工作账号我们改成了github-work。 - HostName:真实的服务器地址,统一都是
github.com。 - IdentityFile:该别名对应的私钥绝对路径。
测试连接
配置完成后,我们在 Git Bash 中验证一下 SSH 是否能正确识别这两个账号:
# 测试个人账号 ssh -T git@github.com # 测试工作账号 ssh -T git@github-work
在日常中如何使用?
既然配置了别名,你在克隆(Clone)和推送(Push)工作仓库时,就需要做一点小小的改变。
1. 克隆个人仓库(保持原样)
因为别名就是 github.com,你可以直接复制 GitHub 上的 SSH 地址:
git clone git@github.com:personal_username/repo-name.git
2. 克隆工作仓库(需要修改域名)
如果工作仓库的官方 SSH 地址是 git@github.com:work_username/project.git,你需要把其中的 github.com 替换为你的别名 github-work:
git clone git@github-work:work_username/project.git
⚠️ 别忘了配置局部用户名和邮箱!
为了防止用工作账号提交代码时,注释里显示的却是你的个人邮箱,进到各自的仓库目录后,记得单独设置本地的 user.name 和 user.email:
# 进入工作仓库 cd /path/to/work/project # 设置仅在当前仓库生效的局部配置(不加 --global) git config user.name "Your Work Name" git config user.email "your_work_email@example.com"
怎么 Push
从零开始的新项目(还没关联 GitHub)
如果你在本地新建了一个文件夹,写了代码,现在想推送到 张三丰 的账号:
- 初始化并提交本地代码:
git init git add . git commit -m "first commit"
2. 关联远程仓库(关键点:使用别名):
官方给你的地址通常是 git@github.com:zhang-shanfeng/repo.git,你需要把 github.com 改成你的别名 github-zhang-shanfeng
git remote add origin git@github-zhang-shanfeng:zhang-shanfeng/repo.git
3. 正常推送:
git push -u origin main
(之后再推送,直接敲 git push 即可)
现有的项目(想切换成张三丰的账号推送)
如果这个项目你之前就已经在开发了,或者你是直接用官方默认地址 clone 下来的,你需要修改它的远程连接地址。
把地址修改为带有别名的地址 :
git remote set-url origin git@github-zhang-shanfeng:zhang-shanfeng/repo.git
正常推送:
git push origin main
直接用别名 Clone 下来的项目
如果你在一开始下载项目时,就已经使用了别名:
git clone git@github-zhang-shanfeng:zhang-shanfeng/repo.git
那么 Git 已经默默把别名记在小本本(该项目的 .git/config)里了。你什么都不用改,后续直接:
git push origin main
检查你的提交签名(非常重要)
虽然你通过别名把代码成功推到了张三丰的账号上,但如果你的本地邮箱没改,GitHub 上的提交历史(Contribution Graph)里显示的头像和名字可能还是小土坡的 。
每次为新仓库配置完别名后,一定记得进到该仓库的目录下,单独修正该仓库的用户名和邮箱 :
# 只修改当前仓库的配置(不要加 --global) git config user.name "张三丰" git config user.email "zhangshanfeng@example.com"
