Git 修改已提交的 commit 信息,包括作者、邮箱

1. 背景

不同电脑配置了不同的用户名、邮箱,例如:不小心用公司电脑提交了 commit 到个人的github 仓库,想改掉已经提交的 commit 的信息。

2. 修改用户名、邮箱

// 全局修改
git config --global user.name "silinchen"
git config --global user.email "silinccc@gmail.com"
// 针对某个仓库修改
git config user.name "silinchen"
git config user.email "silinccc@gmail.com"

这里修改只对后续的提交有效

接下来看看怎么修改已经提交的 commit 信息

3. 修改 commit 信息,包括作者、邮箱

3.1 修改最后一次 commit 的信息

直接使用 amend 进行修正

3.1.1 修改 commit 注释信息

git commit --amend

出现修改注释信息的界面, 输入 i 进入修改模式,修改好注释后,按 Esc 键 退出编辑模式,输入 :wq 保存并退出。

注:注释信息一般显示在第一行,窗口下面第一个字符是 # 的内容不需要修改

3.1.2 修改作者、邮箱
git commit --amend --author="{username} <{email}>"

例如:git commit --amend --author="silinchen <silinccc@gmail.com>"

3.2 修改某几次 commit 的信息

3.2.1 使用 log 查看提交记录

git log -2

注:-2 代表最后 2 条记录

git log -2

或者加上 --oneline 查看简短信息(oneline:一行)

git log --oneline -2

git log --oneline -2

3.2.2 rebase 需要修改的 commit

git rebase -i HEAD~2
// 或者
git rebase -i {commitID} // 例如 git rebase -i d95ddfb

注:

HEAD~2 表示最后两条 commit

指定 commit ID 则表示对应 commit 之前的记录

这里需要注意,如果你需要修改某条 commit 信息,commit ID 需要填再前一条 commit 的 ID

执行 rebase 命令后,会出现 reabse 的编辑窗口,窗口底下会有提示怎么操作。

这里把需要修改的 commit 最前面的 pick 改为 edit,可以一条或者多条。

git rebase tip

根据提示,接下来同样使用 --amend 进行修改

3.2.3 修改 commit 信息

只修改注释信息

git commit --amend

只修改作者、邮箱

git commit --amend --author="{username} <{email}>" --no-edit

同时修改注释信息、作者、邮箱

git commit --amend --author="{username} <{email}>"

修改完成后,继续执行下面命令

git rebase --continue

如果是修改多条的话,重复以上 3.3.2 操作即可。

直到出现以下提示,说明全部修改已经完成。

Successfully rebased and updated refs/heads/master.

3.2.4 push 仓库更改到远程仓库

强制 push

git push --force origin master

注:当仓库是多人操作时,可能会覆盖别人push 的代码,请谨慎操作。

3.3 使用脚本自动更改

github 以前的推荐操作,但现在该文章已经不在,原因未知。(链接地址

3.3.1 拉取一个新的仓库

注意:不要在旧的仓库里操作,用以下命令重新拉取一个仓库

git clone --bare https://github.com/user/repo.git

进入仓库

cd repo.git

3.3.2 使用脚本修改信息

使用以下脚本,把相关参数改为自己的。

  • OLD_EMAIL:旧邮箱,需要被修改掉的commit 邮箱

  • CORRECT_NAME: 新用户名

  • CORRECT_EMAIL: 新邮箱

#!/bin/sh

git filter-branch --env-filter '

OLD_EMAIL="your-old-email@example.com"
CORRECT_NAME="Your Correct Name"
CORRECT_EMAIL="your-correct-email@example.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

创建一个sh 脚本文件,把上面脚本内容复制进来,保存

vi amend.sh

执行脚本

sh ./amend.sh

执行脚本会看到以下输出信息

sh output

3.3.3 推送修改到远程仓库

使用一下命令,强制推送修改到远程仓库

git push --force --tags origin 'refs/heads/*'

3.3.4 删除本地仓库

cd ..
rm -rf repo.git

相关文档

Git 工具 - 重写历史

Github 文档