先分清两个极易混淆概念(90% 人踩坑)
user.name/user.email:提交者身份(写进 commit 记录里,谁提交代码) 远程仓库账号密码 / Token:推送拉取代码时,远程仓库鉴权身份(能不能访问仓库) 两者互相独立!只改其一没用,必须两套全部清理重置。
核心坑点预警
Git 配置优先级:仓库本地配置(local) > 全局配置(global) 哪怕你设置了全局自己的账号,如果某个项目 .git/config 里面还保留别人的配置,提交依旧显示别人名字!
完整分步操作(Windows 电脑,别人用过的 Git,重置成你自己账号)
第一步:清理旧配置,设置你自己的【提交姓名 + 邮箱】
打开 Git Bash / CMD / IDEA Terminal
1. 先删除旧全局配置(别人的账号)
# 删除全局旧用户名、邮箱
git config --global --unset user.name
git config --global --unset user.email
2. 设置你自己的全局信息(本机所有新项目默认使用)
git config --global user.name "你的姓名/昵称"
git config --global user.email "你的gitee/github注册邮箱"
3. 【重点!】处理电脑上已经存在的旧本地仓库
别人之前克隆下来的项目,每个仓库内部可能单独写了 local 配置,会覆盖全局! 两种方案任选:
方案 A(逐个仓库清理,保留项目代码)
进入项目根目录执行:
# 删除当前仓库独立配置的用户名邮箱
git config --local --unset user.name
git config --local --unset user.email
执行完成后,这个仓库就会自动使用上面设置的全局账号。
方案 B(最干净,推荐)
旧项目全部删除,之后重新用你自己账号 clone,从根源不存在旧配置。
4. 验证配置是否生效
# 查看当前生效的名字(在任意项目内执行)
git config user.name
git config user.email
# 查看所有配置+来源文件,一眼看到哪里还有旧配置
git config --list --show-origin
第二步:清除系统缓存的【远程登录凭证】(https 协议必做)
别人电脑大概率保存了旧账号密码 / Token,push/pull 的时候 Git 自动用旧账号登录,报 403 权限错误。
Windows 操作方式
- 左下角搜索:凭据管理器 → 打开
- 选择 Windows 凭据
- 在普通凭据列表找到所有
git:shturl.cc/DvPqNlL/git:https://github.com这类条目 - 全部删除
下次执行 git push /pull,会自动弹出登录框,输入你自己的账号 + 个人令牌,系统会保存你的新凭证。
命令快速清除(可选)
# 删除对应域名缓存凭证,示例gitee
echo "host=shturl.cc protocol=https" | git credential-manager erase
⚠️ 如果你们使用 SSH 方式拉取代码 上面凭据管理器无效,需要:
- 删除旧的
C:\Users\用户名\.ssh下旧的私钥 id_rsa - 生成你自己的 ssh 密钥,公钥上传到 Gitee/GitLab
第三步:额外 IDEA 注意事项
- IDEA 本身不会单独存储 git 用户信息,完全依赖系统 Git 配置;
- 如果之前使用 IDEA 记住密码,清理完系统凭据管理器即可;
- 不要在 IDEA 每个项目单独设置 git user,尽量统一使用全局配置。
极简总结流程(照着顺序执行)
- 删除全局旧 name、email → 设置你自己的全局 name、email
- 对电脑现存所有 git 项目,删除项目内 local user 配置(或者直接删项目重克隆)
- 打开 Windows 凭据管理器,删除所有 git 相关旧登录凭据
- 测试:新建文件 commit,查看提交者信息;push 代码,弹出登录框输入你的账号
常见误区澄清
- ❌ 改完全局配置就万事大吉 ✅ 老项目里面
.git/config的本地配置优先级更高,会覆盖全局,必须清理 - ❌ user.name = 远程仓库登录账号 ✅ 完全无关 user.name 只是提交记录显示的名字;远程登录账号是另外一套凭证!
- ❌ 修改配置后,历史提交记录名字会变 ✅ 不会!只能影响以后新的 commit;历史已经提交的记录永久不变。 如果你想要修改历史所有提交者姓名,需要额外 git filter-repo 脚本。
核心答案先说清楚
是的,逻辑就是这样,但有不少细节要区分开:
1. 存储时机
当你使用 HTTPS 协议 git push / pull / fetch,第一次在 IDEA / Git Bash 输入账号密码(或者个人访问令牌 Token)之后: Git Credential Manager(GCM,现代 Git 自带的凭证管理器)会把账号凭证存入 Windows 凭据管理器 → Windows 凭据 → 普通凭据。
IDEA 本身不保存密码,IDEA 只是调用系统 Git,存储密码这件事是 Git 交给系统凭证管理器完成的。
2. 匹配规则(重点)
凭据条目格式:git:shturl.cc/Hl156c2 / git:https://github.com Git 在访问远程地址时:
- 解析远程仓库地址的域名 例如远程地址
shturl.cc/Hl156c2/aaa/test.git→ 域名shturl.cc - 去凭据管理器查找前缀匹配
git:shturl.cc/Hl156c2的条目 - 如果找到 → 自动拿出账号密码,不再弹窗;找不到 → 弹出登录框
✅ 同一个域名下所有仓库,共用这一条凭证! 举例子:
- shturl.cc/Hl156c2/user/project1.git
- shturl.cc/Hl156c2/user/project2.git 只要域名相同,只会保存一条凭据,访问任意仓库都会复用这组账号。
❌ 如果远程地址域名不一样,就需要多条凭据: shturl.cc 和 github.com 是两条独立凭据,互不通用。
3. 容易踩坑的两种情况
情况 A:一个域名切换账号(高频问题)
比如之前用 A 账号登录 gitee,凭据管理器存了 A 账号;现在想换成 B 账号推送。 仅仅修改 Git 本地 user.name 没用! Git 依然会自动读取旧凭据,推送报 403 权限拒绝。 👉 解决:手动删掉这条 git:shturl.cc/Hl156c2 凭据,下次推送重新输入你的新账号。
情况 B:远程地址带端口、子路径,导致匹配失效
极少数场景远程地址格式特殊,会生成多条不同前缀的凭据,遇到推送依旧弹窗,直接全部删除即可。
4. SSH 协议不受这个影响
⚠️ 如果你项目远程地址是 git@shturl. 这种 SSH 格式: 完全不走 Windows 凭据管理器! 身份认证依靠 C:\Users\你的用户名\.ssh 下的私钥文件,和这里的普通凭据无关。
5. 补充区分两套东西(再次巩固你之前的知识点)
- user.name / user.email 写入 commit 提交记录的作者名字邮箱,和登录凭证无关,不参与远程鉴权
- Windows 凭据管理器里 git 条目 HTTPS 推拉代码时,给远程仓库做身份校验的账号密码 / Token
极简总结
IDEA 执行 push 触发 Git 请求 → Git 发现缺少凭证 → 弹窗让你输入账号 → Git 调用系统凭证管理器保存域名对应的账号信息; 后续访问相同域名下任意仓库,Git 自动读取这条凭据,无需重复输入。 想要切换账号,删除对应域名那条 git 凭据即可。
核心结论
默认行为:同一个域名,优先复用一条凭证;但并不是强制只能存在一条,可以有多条,只是匹配规则有优先级。
额外区分
再次重申不要混淆:
- Windows 凭据:HTTPS 推拉代码鉴权身份(登录仓库用)
- git config user.name:提交记录显示的作者(写到 commit 里) 二者完全独立。
一句话总结
同域名物理上可以存放多条凭证 ,依靠 URL 路径区分; 如果你只有一条不带路径的域名凭据,那域名下全部仓库强制共用这一个账号。
直接给结论
是的!只要旧账号本身拥有这个仓库的推送权限,哪怕你本地修改了 user.name/user.email,代码依旧可以正常 push 成功。
核心命令
Git 分支上游 & push/pull 全套命令总结(结合你前面所有问题)
一、查看上游绑定
# 查看所有本地分支 + 上游跟踪信息(最实用)
git branch -vv
# 查看远程仓库列表
git remote -v
二、设置上游(2 种方式)
方式 1:推送同时绑定(首次推送新分支最常用)
# 本地dev推送到 origin/dev,并绑定上游
git push -u origin dev
# 本地dev推送到 company/dev,并绑定上游(远程不是origin同样生效)
git push -u company dev
# 本地dev → 远程origin/test 【本地远程分支名不一致】
git push -u origin dev:test
-u = --set-upstream;重复执行可以覆盖旧上游
方式 2:只修改上游,不推送代码(远程分支已存在时使用)
# 格式:git branch --set-upstream-to=远程名/远程分支 本地分支
git branch --set-upstream-to=company/dev dev
三、解绑上游跟踪
git branch --unset-upstream dev
解绑后直接 git push 会报错:缺少上游分支
四、git push 核心行为
# 分支已经配置上游 → 自动推向上游(不管远程是origin还是company)
git push
# 显式指定远程+分支(不依赖上游,不会修改上游配置)
git push origin dev
# 同名简写等价:git push origin dev:dev
# 不同名推送:本地dev → 远程origin/release
git push origin dev:release
⚠️ 无上游时,裸命令
git push直接报错,不会自动创建远程分支
五、git pull 核心行为
# 自动拉取当前分支绑定的上游分支并合并
git pull
# 显式指定远程,不读取上游
git pull origin dev
六、git fetch 重点(特殊规则!不跟随上游)
# 不带参数:固定只拉取 origin,不受当前分支上游影响
git fetch
# 拉取指定远程(例如company)
git fetch company
# 一次性拉取所有远程仓库
git fetch --all
七、修改远程仓库地址
git remote set-url origin https://xxx.git
八、快速记忆关键规则
origin只是约定名称,不是 Git 硬编码关键字;- 上游 upsteam 是【每个本地分支独立配置】,各分支可以指向不同远程;
git push / git pull不带参数:完全依靠分支上游配置;git fetch不带参数:固定默认 origin;-u不止首次可用,重复执行能够覆盖切换上游;- 只写单个分支名 = 本地与远程分支同名映射 ;名称不一样必须用
本地:远程冒号格式。
对应 IDEA 映射
弹窗 dev → origin:dev 等价:本地 dev 上游 origin/dev,点击 Push 等价 git push 新分支首次推送,IDEA 默认勾选 Set upstream = 命令 -u。