git修改已提交人的用户名和邮箱
# git 修改已提交人的用户名和邮箱
# 前言
需注意以下两点内容:
- 需要在顶层目录下(就是
.git文件夹所在的目录下,右键打开 "Git Bash Here"),否则运行下面的代码时会报错; - 确保要修改的仓库,里面的文件和远程仓库的版本一致,如果有修改还未提交的内容,需要先提交或者取消更改,否则运行下面的代码时会报错。
# 场景一:修改最后一次提交的提交人信息
执行指令:
--author:指定新的提交人信息,格式为用户名 <邮箱>。--no-edit:不修改提交说明,仅更新提交人;若需同时修改提交信息,可去掉该参数,在编辑器中编辑后保存。
# 直接修改并覆盖最后一次提交
git commit --amend --author="新用户名 <新邮箱地址>" --no-edit
1
2
2
强制推送到远程(若已推送):
--force-with-lease:比直接--force更安全,会检查远程分支是否有他人的新提交,避免覆盖他人工作。
# 如果最后一次提交已经推送到远程,需要强制推送覆盖
git push --force-with-lease origin 分支名
1
2
2
# 场景二:修改所有历史提交的提交人信息
如果需要修改仓库所有历史提交的提交人信息(如用户名 / 邮箱填写错误,需全局修正),推荐使用 Git 官方提供的脚本批量修改。
# 1. 备份仓库(可选但推荐)
为防止操作失误,先复制一份仓库目录作为备份。
# 2. 执行批量修改脚本
在仓库根目录执行以下脚本(替换其中的<旧邮箱>、<新用户名>、<新邮箱>为实际值):
主要修改以下三点内容:
OLD_EMAIL:填修改前的邮箱地址CORRECT_NAME:填新的用户名称CORRECT_EMAIL:填新的邮箱
然后在 "Git Bash Here" 打开的窗口里面运行代码:
--env-filter:通过环境变量修改提交的作者(Author)和提交者(Committer)信息。--tag-name-filter cat:保留标签信息,不修改标签。--branches --tags:对所有分支和标签的提交生效。
#!/bin/sh
git filter-branch --env-filter '
OLD_EMAIL="xxxx@qq.com"
CORRECT_NAME="chenmeng"
CORRECT_EMAIL="xxxx@qq.com"
if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_COMMITTER_NAME="$CORRECT_NAME"
export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_AUTHOR_NAME="$CORRECT_NAME"
export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 3. 清理临时文件
脚本执行后会生成临时文件,执行以下命令清理:
git update-ref -d refs/original/refs/heads/分支名
git reflog expire --expire=now --all
git gc --prune=now
1
2
3
2
3
# 强制推送到远程分支(若已推送)
执行完第一步的命令之后,执行下面这条命令,强制推送到远程仓库:
# 强制推送本地分支到远程仓库,直接覆盖远程分支的历史记录
# 风险:无论远程分支是否有他人的新提交,都会强制覆盖,可能导致他人的提交丢失
# 适用场景:本地仓库是唯一提交源,或确认远程分支无他人更新的私人仓库
git push --force
# --force-with-lease:安全的强制推送,先检查远程分支是否有本地未同步的新提交,若有则拒绝推送
# origin:指定推送的远程仓库名称(默认远程仓库名)
# --all:推送本地所有分支到远程仓库,覆盖所有对应的远程分支
# 风险:仅在确认所有本地分支的修改是最新且需要覆盖远程时使用,团队协作前需通知协作者
git push --force-with-lease origin --all
# 指定推送到 dev 分支
git push --force-with-lease origin dev
# --force-with-lease:安全强制推送,先校验远程标签是否有本地未同步的更新
# origin:指定远程仓库名称
# --tags:推送本地所有标签(tag)到远程仓库,并覆盖远程对应的同名标签
# 适用场景:修改了历史提交后,需要同步本地更新后的标签到远程
# 注意:标签一旦推送,修改后强制推送会导致远程标签历史丢失,需谨慎
git push --force-with-lease origin --tags
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 学习参考
上次更新: 2025/11/26 19:37:56