彻底搞定Git重新登录:清除凭据、SSH密钥与Token认证全指南
平时接手一台新电脑或者换了新的代码托管平台账号最常干的一件事就是“清除本地的git并重新登录”。但大多数人都在这一步卡住——明明删了仓库重新clone还是用旧账号推送或者改了密码再去push依然报权限错误。先说一个很多人没意识到的点git本身没有“登录”这个概念。第一次用git的人都以为它像网盘一样装完客户端输个账号密码就能用。实际上git是一个分布式版本控制系统你本地这份仓库就是完整的历史记录仓库提交、回滚、分支操作全部在本地完成。所谓“登录”其实是和远程托管平台GitHub、GitLab、Gitee或者公司自建的Git服务之间的认证。这个认证状态藏在三个完全不同的地方而“清除并重新登录”这件事本质就是把这三种状态搞清楚、分别重置一遍。这篇文章我把这套流程拆到最细不管是刚装了git还没搞明白的新手还是被token过期折腾了半天的老手都可以照着操作。重点不是“删掉重来”而是搞清楚你本地到底什么在作祟。1. 动手前先分清git的“登录态”其实存在三个地方先别急着敲命令。很多重登失败的人问题不是不会删而是删了不该删的、留下了该删的。git在本地涉及认证和身份的东西有三层每一层的作用完全不同。1.1 第一层HTTPS凭据如果你clone仓库的时候用的是https://github.com/xxx/xxx.git这种地址那么push、pull时走的是HTTPS协议。这种方式的认证信息用户名、密码或token默认会交给git的credential helper保存起来。Windows上存在Windows凭据管理器里。macOS上存在钥匙串访问里。Linux上默认可能存成~/.git-credentials明文文件或者交给libsecret一类的系统钥匙串。这一层是你“重新登录”时首先该处理的东西。因为就算你在网页上生成了新token、改了新密码只要本地凭据管理器里存的还是旧的那份git就永远拿旧凭据去认证然后一直报错。1.2 第二层SSH密钥如果你clone的时候用的是gitgithub.com:xxx/xxx.git这种地址走的是SSH协议。SSH走的是公钥/私钥对认证私钥存在本地~/.ssh/目录里公钥配置在托管平台的账号里。这一层不存在用户名密码认的是“这把私钥有没有对应的公钥被你挂在了账号下”。1.3 第三层提交身份user.name / user.email这一层严格说不算登录态但经常被误当成登录问题。它只决定你每次git commit时提交记录上显示的作者名字和邮箱是什么。它存在git的配置文件里分三个优先级仓库级.git/config 用户级~/.gitconfig 系统级/etc/gitconfig。很多人的真实场景是登录认证其实都正常push也成功就是提交记录里显示的名字不对然后他以为是“需要清除本地git重新登录”。这时候你删凭据、删SSH key一顿操作猛如虎最后发现名字还是错的——因为你根本没碰配置文件。层面存储位置作用属于登录态HTTPS凭据系统凭据管理器 / ~/.git-credentials验证“你能不能访问这个远程仓库”是SSH密钥~/.ssh/ 下私钥 平台公钥验证“你持有这把私钥”是提交身份.git/config、~/.gitconfig提交记录上显示的名字邮箱否但容易混把这三层分清楚之后“清除本地git并重新登录”的真正含义就浮出水面了清掉旧凭据、重建身份配置然后重新认证一次。接下来按场景走流程。2. 动手前先做三件事备份、确认地址、查清当前账号我见过太多人上来就rm -rf ~/.ssh结果把还在用的部署密钥也给删了服务器上CI/CD全挂。清理之前花三分钟做一次现状排查省下来的时间绝对比这三分钟多。2.1 确认每个仓库的远程地址是HTTPS还是SSH在项目目录里执行git remote -v输出长这样origin https://github.com/yourname/yourrepo.git (fetch) origin https://github.com/yourname/yourrepo.git (push)或者origin gitgithub.com:yourname/yourrepo.git (fetch) origin gitgithub.com:yourname/yourrepo.git (push)这决定了你接下来需要清的是哪一层。HTTPS就去清凭据SSH就去处理密钥。如果一台机器上多个仓库混用了两种协议那两层都要处理。2.2 备份SSH目录和git配置文件这一步很多人跳过觉得没必要。但事实上~/.ssh里可能不只有github的密钥还有服务器部署用的、公司内网git用的、甚至跳板机用的。全部删掉再重建代价非常高。安全做法是整体打包mkdir -p ~/git-cleanup-backup cp -r ~/.ssh ~/git-cleanup-backup/ cp ~/.gitconfig ~/git-cleanup-backup/ 2/dev/null这样就算后面删错了也能找回。备份完再检查一下~/.ssh/下有哪些文件ls -la ~/.ssh/常见的文件有id_rsa、id_rsa.pub、id_ed25519、id_ed25519.pub、known_hosts、config。其中known_hosts是记录你连接过哪些主机的指纹删不删无所谓删了下次连接会再问一次确认。config文件是多账号配置的关键后面细说。2.3 确认当前账号是谁在操作前先查一下当前这台机器上github认的是谁ssh -T gitgithub.com如果SSH方式正常会返回Hi yourname! Youve successfully authenticated, but GitHub does not provide shell access.HTTPS方式下可以通过这个命令看当前凭据对应的用户git config --list --show-origin这会列出所有配置项以及它们来自哪个文件能直观看到当前全局user.name和user.email是什么以及有没有配置credential.helper。这一步能帮你判断问题到底出在哪一层别一上来就全拆了。3. 清除HTTPS凭据系统管理器里的旧token是重灾区如果你用的是HTTPS方式而且遇到了“明明密码对了却认证失败”“换了新token还是push不了”这类问题九成是系统凭据管理器里存了旧凭据。git在认证失败后不会自动去更新凭据它会一直用旧的那份去撞墙。3.1 Windows通过凭据管理器删除最直接的办法打开控制面板右上角查看方式切换为“大图标”。找到“凭据管理器”进入“Windows凭据”。在列表里找以git:https://开头的条目比如git:https://github.com。展开后点“删除”。这一条删掉之后等于清了这台机器上该host的HTTPS凭据。下次push时会重新弹窗要求输入用户名和token。注意如果你GitHub、GitLab、Gitee都在这台机器上登录过要分别找到对应的host条目别只删了GitHub的。3.2 Windows/Linux/macOS通用用git命令精准删除不想去控制面板翻来翻去也可以在命令行直接操作。git提供了一个专门命令printf protocolhttps\nhostgithub.com\n\n | git credential reject这段的意思是告诉git“请将protocol为https、host为github.com的凭据删除”。如果你用的是gitlab把host换成gitlab.com即可。如果是公司自建git服务换成对应的域名或IP。执行完没有任何输出是正常的它不会给你“删除成功”的提示。你可以用下面命令验证是否还在git credential fill输入protocolhttps hostgithub.com然后按CtrlD结束输入如果返回了username和password说明凭据管理器里还有值如果什么都没有返回说明清干净了。3.3 macOS钥匙串访问 git credential-managermacOS用户如果用系统git默认凭据存储在钥匙串里。打开“钥匙串访问”右上角搜索github.com把相关条目全部删除即可。如果你安装了GitHub Desktop或者git官方版的Git Credential Manager也可以用命令git credential-manager github logout然后会提示是否清掉本机保存的GitHub账号信息选是即可。3.4 Linux小心~/.git-credentials明文文件Linux下如果配置了credential.helper store那么凭据会明文存在~/.git-credentials一行一条https://yourname:ghp_xxxxxgithub.com清理方式就是打开这个文件删掉对应行或者整个文件删掉。为了干净顺便看下全局配置git config --global --unset credential.helper这一步不是必须的但如果你打算完全重新配置建议把helper也复位。否则删完文件下次push时git又自动帮你存一份新的。4. SSH密钥的清理与重建不只是删私钥那么简单SSH方式清理起来比HTTPS多一层因为涉及两端本地私钥和平台上的公钥。很多人只删了本地私钥忘了去平台删掉对应的公钥结果就是“我以为我登出账号了其实那把旧钥匙还能用”。4.1 先去平台回收旧公钥登录你的托管平台进入设置里的SSH keys页面。GitHub的位置是Settings - SSH and GPG keys。找到旧公钥删除。这一步的作用是“作废”这把钥匙哪怕本地私钥还在也无法再用它认证。如果你是要整台机器交接给别人或者怀疑私钥泄漏这一步绝对不能跳过。只清本地不删远端等于锁门不锁窗。4.2 清理本地私钥和known_hosts确认这把私钥没有用在其他服务器上之后再处理本地文件。我的习惯是不直接删而是移动到一个备份目录万一后面发现问题还能找回来mkdir -p ~/.ssh/backup mv ~/.ssh/id_ed25519 ~/.ssh/backup/ mv ~/.ssh/id_ed25519.pub ~/.ssh/backup/注意检查是否还有id_rsa/id_rsa.pub以及是否还有其他命名的密钥文件比如多账号场景下的id_ed25519_work、id_ed25519_personal。另外ssh-agent里可能还缓存着密钥。清一下ssh-add -D这个命令会清空agent里所有已加载的私钥缓存。不确定是否加载了的话先执行ssh-add -l查看列表。4.3 生成新密钥对并加载到agent推荐用Ed25519算法ssh-keygen -t ed25519 -C 你的邮箱或备注 -f ~/.ssh/id_ed25519为什么不推荐rsaRSA 4096位也能用但长度更长、生成和验证稍慢而且新生态包括GitHub对Ed25519支持已经很完善。如果你的agent或者公司老服务器不支持Ed25519再退回RSAssh-keygen -t rsa -b 4096 -C 你的邮箱或备注 -f ~/.ssh/id_rsa生成过程中会提示设置passphrase。建议设置一个虽然每次push可能要输一次密码但私钥本身的泄漏风险会低很多。如果嫌麻烦可以用ssh-add配合agent在会话内记住。生成完后加载进agenteval $(ssh-agent -s) ssh-add ~/.ssh/id_ed25519macOS用户如果希望钥匙串记住passphrasessh-add --apple-use-keychain ~/.ssh/id_ed255194.4 把新公钥挂到平台并验证查看公钥内容cat ~/.ssh/id_ed25519.pub复制输出粘贴到平台的SSH keys设置里给个容易认的标题比如“MacBook Pro个人机”。然后验证ssh -T gitgithub.com第一次连接会提示The authenticity of host github.com (20.205.243.166) cant be established.输入yes回车即可。如果看到Hi username!说明密钥已经生效。注意验证通过只代表“你手上这把新钥匙能用”。但仓库的remote地址还是SSH的gitgithub.com:...的话直接用就行。如果之前的remote是HTTPS那么你还需要改地址下一节讲。5. 重新登录的完整流程从token生成到remote地址刷新前面清完旧状态这一节讲“重新登录”怎么走完整流程缺一环都可能导致你重新认证了却还是连不上。5.1 生成新的tokenHTTPS场景如果你走HTTPS现在的托管平台基本都不支持账号密码直连了。以GitHub为例2021年8月13日起密码方式已经彻底停用必须用Personal Access Token。生成路径GitHub头像 - Settings - Developer settings - Personal access tokens - Tokens (classic) - Generate new token。有效期按需选建议30~90天别选never忘了轮换反而危险。权限勾选repo私有仓库推拉需要如果只用public仓库勾public_repo即可。生成后立即复制保存。token只会完整显示这一次关掉页面就看不到了。这个token就是你的“密码”。push时提示输入用户名时填你的GitHub用户名密码处粘贴token而不是你账号的登录密码。这是新手几乎必踩的坑。5.2 检查并修正remote地址无论你是清了HTTPS凭据还是重建了SSH密钥最后都要确认remote地址指向的是你当前想用的协议和账号。如果之前clone时用的HTTPS而你这次重建了SSH密钥想走SSH那就要改地址git remote set-url origin gitgithub.com:yourname/yourrepo.git反过来也一样git remote set-url origin https://github.com/yourname/yourrepo.git改完之后再看一眼git remote -v这一步极其容易被忽略。很多人清完凭据、生成完token、配好密钥push还是报错一看remote地址里还带着别人的用户名或者还指向旧账号白折腾半天。5.3 触发一次真正的重新认证做完上面这些找个项目目录执行一次简单的操作git pull origin mainHTTPS方式下这时会弹出凭据窗口或命令行交互提示要求输入用户名和token。输入并勾选记住后后续操作不再重复询问。SSH方式下则会提示输入passphrase如果你设了的话。这里有个容易误解的地方很多人认为git pull没反应是卡了。其实是git在等待你输入凭据只是提示不够明显。如果是命令行窗口仔细看光标位置一般会显示Username for https://github.com:。5.4 复位提交身份参数前面说过user.name和user.email不是登录态但重新登录场景里经常要一起配。检查当前值git config --global user.name git config --global user.email如果为空或想改重新配置git config --global user.name 你的名字 git config --global user.email 你的邮箱注意这里设置的是全局配置影响这台机器上所有仓库。如果只想改当前仓库去掉--global即可。有没有更省心的方式我习惯把全局的user.email设成私密邮箱不同项目仓库再用git config user.email单独覆盖避免把个人邮箱带到公司项目里。重新登录后的自检清单建议逐一跑一遍git remote -v # 地址是否正确 git config user.name # 提交身份是否正确 git config user.email ssh -T gitgithub.com # SSH方式确认当前密钥对应的账号 git ls-remote origin HEAD # 确认能正常访问远程仓库6. 重登之后最容易翻车的三个场景多账号、残留缓存、地址错配流程走完大部分人都能正常登录了。但根据我的观察总有几种情况在“清除并重新登录”之后依然会出问题这里单独拎出来讲。6.1 一台电脑多个账号的SSH配置这是SSH方式下最常见的翻车点。假设你的个人GitHub和公司GitLab都在同一台机器上你生成了两把密钥然后发现连github用的总是第一把key导致公司账号识别错误或者反过来。原因很简单SSH默认会加载~/.ssh/下所有私钥逐个尝试认证而平台只认你挂过公钥的那把。如果账号A的机器上试了账号B的私钥会直接被拒绝。解决办法是创建~/.ssh/config文件按Host区分Host github.com HostName github.com User git IdentityFile ~/.ssh/id_ed25519_personal Host gitlab.work.com HostName gitlab.work.com User git IdentityFile ~/.ssh/id_ed25519_work这样SSH在连接不同域名时用不同私钥。注意如果某个内网git服务的端口不是22还要加Port字段。但这里牵扯到另一个问题如果配置了Host别名remote地址也要跟着变。比如git remote set-url origin gitgithub.com:yourname/yourrepo.git用到别名时则写成git remote set-url origin github.com:yourname/yourrepo.git两者区别在于git后面跟的是真实域名还是别名。用别名时URL是别名:用户名/仓库.git。很多人改完config账号还是不对就是这里出了问题。6.2 清理完凭据之后遇到Authentication failed这条太典型了。我见过不下十个人按流程删了凭据、生成了新tokenpush时还是报fatal: Authentication failed for https://github.com/...排查顺序按下面来一般几分钟就能定位确认token是刚生成的而且复制时没有遗漏字符token中间有空格复制进去也会炸。确认token权限够。repo权限是基础如果还涉及删除、改设置需要extra权限。确认凭据管理器里没有残留旧token。Windows上再查一遍凭据管理器macOS再搜一下钥匙串。有些情况下刚才删除的只是某一条但同一host存在多条记录。确认当前remote地址的协议是HTTPS。如果你之前clone用的是旧的SSH地址又改用token走HTTPS不更新URL一样失败。6.3 提醒一句某些平台还在用账号密码模式前面重点说了GitHub停用密码直连的事但并不是所有平台都这样。Gitee目前还支持账号密码H2认证有些公司自建的GitLab也还允许密码方式。所以在“清除并重新登录”之前先确认一下平台当前接受哪种认证方式可以少走很多弯路。判断方法很简单访问平台官网查一下认证相关的文档或者直接看创建token的入口在哪里。有Personal access token入口的平台基本都建议用token。“能用密码尽量用密码”是很多老人还在沿用的习惯但放在新平台环境下容易踩坑。6.4 一次真实的排查案例去年帮一个同事排查过类似问题。他的情况是换了个新单位公司分配了新的GitLab账号但本地git还是登录着个人GitHub账号。他clone公司仓库用的是HTTPSpush时报401。他怀疑是git没“重新登录”就把.gitconfig里的user.email改了还重新生成了token结果还是不行。最后排查发现问题出在两处一是Windows凭据管理器里存着他个人GitHub账号的凭据而公司GitLab是同一个域名段下的git.xxx.comgit自动把凭据送过去认证了二是remote地址里竟然还带着他个人GitHub的用户名前缀。两个问题都解决后一次通过。这个案例的启示是有时候“清除并重新登录”不只是一个命令而是一个链路排查的过程。把HTTPS凭据、SSH密钥、remote地址、配置文件这四样东西全过一遍绝大部分登录问题的修复时间能控制在十分钟以内。我个人的习惯是每逢换设备、换账号、token到期先备份再动手备份完先看remote再看凭据顺序不要乱。这套流程帮我省过太多次重复劳动了。你按上面的步骤走一遍基本不会再被“git登录”这件事卡住。