修改git历史的author和email

Git 配置文件分为三级,系统级(--system)、用户级(--global)和目录级(--local),三者的使用优先级以离目录 (repository)最近为原则,如果三者的配置不一样,则生效优先级 目录级>用户级>系统级,可以通过 git config --help 查看更多内容。

  • 系统级配置存储在 /etc/gitconfig 文件中,可以使用 git config --system user.name "jim" ,git config --sytem user.email "jim.jim@gmail.com" 来进行配置,该配置对系统上所有用户及他们所拥有的仓库都生效的配置值。
  • 用户级存储在每个用户的 ~/.gitconfig 中,可以使用 git config --global user.name "jim" ,git config --global user.email "jim.jim@gmail.com" 来进行配置,该配置对当前用户上所有的仓库有效。
  • 目录级存储在每个仓库下的 .git/config 中,可以使用 git config --local user.name "jim" , git config --local user.email "jim.jim@gmail.com" 来进行配置,只对当前仓库生效。

如果上次提交 msg 错误/有未提交的文件应该同上一次一起提交,需要重新提交备注:git commit --amend -m 'new msg'

修改上次提交的 author、email可以使用 :git commit --amend --author="newName <newEmail>"

修改整个历史记录中的某些错误的 author、email有两种方式 git rebase 或者 git filter-branch

1
2
3
4
5
6
7
# git rebase 模式
git rebase -i -p 76892625a7b126f4772f8d7e331ada3552c11ce1
# 弹出编辑器,在需要修改的 commit 处 由 picked 改变为 edit ,然后 wq 退出 vim;
git commit --amend --author 'newName <newEmail>'
# 执行后即变更了相应的 author 和 email
git rebase --continue
################################################################

git rebase 模式需要理解 git 的操作原理,步骤也比较多,可以直接使用 git filter-branch快速方便

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# git filter-branch 模式 https://help.github.com/articles/changing-author-info/
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

效果如下图:

xirong wechat
我在公众号与你分享更多内容