能配,但必须清空全局 user.name 和 user.email,且每个 Host 必须用别名(如 github-personal),不能直接写 github.com,否则会导致提交错乱、SSH 连接失败及审计告警。

直接说结论:能配,但必须清空全局 user.name 和 user.email,且每个 Host 必须用别名(比如 github-personal),不能直接写 github.com——否则两个账号会冲突,提交记录错乱、SSH 连不上、企业审计告警都可能发生。
为什么 git config --global user.name 必须清空
Git 提交时作者信息默认读全局配置。一旦设了全局值,所有仓库都继承它;哪怕你为某个项目单独执行了 git config user.name "xxx",只要某次 clone 后漏配、脚本没跑、或用了别人初始化的 repo,就会误推成公司账号到个人仓库(或反过来)。
- 轻则同事问“这代码谁写的”,重则触发 CI/CD 审计拦截
- 验证是否清空:
git config --global --list输出里不应再出现user.name或user.email - 清空命令只有两条:
git config --global --unset user.name和git config --global --unset user.email - 之后每个仓库都得手动运行
git config user.name "xxx"和git config user.email "xxx"
ssh-keygen -f 必须显式指定私钥路径
不加 -f 就直接回车,ssh-keygen 默认生成 ~/.ssh/id_rsa,第二次运行会覆盖第一次的私钥——结果就是两个平台共用一把钥匙,但服务器只认各自绑定的公钥,必然有一个连不上。
使用约定式提交(Conventional Commits)从 Git 历史记录中生成结构化变更日志,支持多种格式、AI 增强型描述以及可自定义的范围……
- 推荐统一用
ed25519算法:ssh-keygen -t ed25519 -C "me@github.com" -f ~/.ssh/id_ed25519_github - Windows 路径建议用正斜杠:
C:/Users/xxx/.ssh/id_ed25519_work,避免反斜杠被转义 - 密码(passphrase)可跳过(连续回车),但共享电脑上建议设一个
~/.ssh/config 里的 Host 必须是别名,不是域名
很多人写 Host github.com,以为这样 git@github.com:me/repo.git 就能自动走对应密钥——错了。SSH 匹配的是 URL 中 @ 后面的部分,而 git@github.com 的主机名确实是 github.com,但如果你有两个 GitHub 账号,它们都指向同一个域名,光靠 Host github.com 无法区分路由。
- 正确做法是定义不同别名,比如:
Host github-personal和Host github-work - 每个
Host块里必须写HostName github.com+IdentityFile路径 - 克隆时必须用别名:
git clone git@github-personal:me/repo.git,不能用原始域名 - 测试连接就用这个命令:
ssh -T git@github-personal,它是唯一能快速定位 SSH 层问题的手段
ssh-add 不是永久生效,Windows 下尤其要注意
ssh-add ~/.ssh/id_ed25519_github 只是把私钥加进当前 ssh-agent session,关掉 Git Bash 或重启后就失效。Windows 用户容易忽略这点,导致第二天 git push 直接报 Permission denied (publickey)。
- 启动 agent 并加载私钥(每次新开终端都要跑):
eval "$(ssh-agent -s)",然后ssh-add ~/.ssh/id_ed25519_github - 想一劳永逸?在
~/.bashrc末尾追加:alias ssh-personal='eval "$(ssh-agent -s)" && ssh-add ~/.ssh/id_ed25519_github' - 别依赖
IdentityAgent none这类 config 配置——它会禁用 agent,反而让ssh-add失效
最常被忽略的其实是 git remote set-url:换账号后,已有的远程地址不会自动更新。比如原来用 git@github.com:me/repo.git,现在得手动改成 git@github-personal:me/repo.git,否则还是走默认密钥。


















