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 条记录
或者加上 --oneline 查看简短信息(oneline:一行)
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
,可以一条或者多条。
根据提示,接下来同样使用 --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
执行脚本会看到以下输出信息
3.3.3 推送修改到远程仓库
使用一下命令,强制推送修改到远程仓库
git push --force --tags origin 'refs/heads/*'
3.3.4 删除本地仓库
cd ..
rm -rf repo.git