version control - How to change the author and committer name and e-mail of multiple commits in Git?

ID : 250

viewed : 57

Tags : gitversion-controlgit-filter-branchgit-rewrite-historygit

Top 5 Answer for version control - How to change the author and committer name and e-mail of multiple commits in Git?

vote vote

93

NOTE: This answer changes SHA1s, so take care when using it on a branch that has already been pushed. If you only want to fix the spelling of a name or update an old email, git lets you do this without rewriting history using .mailmap. See my other answer.

Using Interactive Rebase

You could do

git rebase -i -p <some HEAD before all of your bad commits> 

Then mark all of your bad commits as "edit" in the rebase file. If you also want to change your first commit, you have to manually add it as the first line in the rebase file (follow the format of the other lines). Then, when git asks you to amend each commit, do

 git commit --amend --author "New Author Name <email@address.com>"  

edit or just close the editor that opens, and then do

git rebase --continue 

to continue the rebase.

You could skip opening the editor altogether here by appending --no-edit so that the command will be:

git commit --amend --author "New Author Name <email@address.com>" --no-edit && \ git rebase --continue 

Single Commit

As some of the commenters have noted, if you just want to change the most recent commit, the rebase command is not necessary. Just do

 git commit --amend --author "New Author Name <email@address.com>" 

This will change the author to the name specified, but the committer will be set to your configured user in git config user.name and git config user.email. If you want to set the committer to something you specify, this will set both the author and the committer:

 git -c user.name="New Author Name" -c user.email=email@address.com commit --amend --reset-author 

Note on Merge Commits

There was a slight flaw in my original response. If there are any merge commits between the current HEAD and your <some HEAD before all your bad commits>, then git rebase will flatten them (and by the way, if you use GitHub pull requests, there are going to be a ton of merge commits in your history). This can very often lead to a very different history (as duplicate changes may be "rebased out"), and in the worst case, it can lead to git rebase asking you to resolve difficult merge conflicts (which were likely already resolved in the merge commits). The solution is to use the -p flag to git rebase, which will preserve the merge structure of your history. The manpage for git rebase warns that using -p and -i can lead to issues, but in the BUGS section it says "Editing commits and rewording their commit messages should work fine."

I've added -p to the above command. For the case where you're just changing the most recent commit, this is not an issue.

Update for modern git clients (July 2020)

Use --rebase-merges instead of -p (-p is deprecated and has serious issues).

vote vote

85

This answer uses git-filter-branch, for which the docs now give this warning:

git filter-branch has a plethora of pitfalls that can produce non-obvious manglings of the intended history rewrite (and can leave you with little time to investigate such problems since it has such abysmal performance). These safety and performance issues cannot be backward compatibly fixed and as such, its use is not recommended. Please use an alternative history filtering tool such as git filter-repo. If you still need to use git filter-branch, please carefully read SAFETY (and PERFORMANCE) to learn about the land mines of filter-branch, and then vigilantly avoid as many of the hazards listed there as reasonably possible.

Changing the author (or committer) would require re-writing all of the history. If you're okay with that and think it's worth it then you should check out git filter-branch. The man page includes several examples to get you started. Also note that you can use environment variables to change the name of the author, committer, dates, etc. -- see the "Environment Variables" section of the git man page.

Specifically, you can fix all the wrong author names and emails for all branches and tags with this command (source: GitHub help):

#!/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 

For using alternative history filtering tool git filter-repo, you can first install it and construct a git-mailmap according to the format of gitmailmap.

Proper Name <proper@email.xx> Commit Name <commit@email.xx> 

And then run filter-repo with the created mailmap:

git filter-repo --mailmap git-mailmap 
vote vote

70

One liner, but be careful if you have a multi-user repository - this will change all commits to have the same (new) author and committer.

git filter-branch -f --env-filter "GIT_AUTHOR_NAME='Newname'; GIT_AUTHOR_EMAIL='new@email'; GIT_COMMITTER_NAME='Newname'; GIT_COMMITTER_EMAIL='new@email';" HEAD 

With linebreaks in the string (which is possible in bash):

git filter-branch -f --env-filter "     GIT_AUTHOR_NAME='Newname'     GIT_AUTHOR_EMAIL='new@email'     GIT_COMMITTER_NAME='Newname'     GIT_COMMITTER_EMAIL='new@email'   " HEAD 
vote vote

64

You can also do:

git filter-branch --commit-filter '         if [ "$GIT_COMMITTER_NAME" = "<Old Name>" ];         then                 GIT_COMMITTER_NAME="<New Name>";                 GIT_AUTHOR_NAME="<New Name>";                 GIT_COMMITTER_EMAIL="<New Email>";                 GIT_AUTHOR_EMAIL="<New Email>";                 git commit-tree "$@";         else                 git commit-tree "$@";         fi' HEAD 

Note, if you are using this command in the Windows command prompt, then you need to use " instead of ':

git filter-branch --commit-filter "         if [ "$GIT_COMMITTER_NAME" = "<Old Name>" ];         then                 GIT_COMMITTER_NAME="<New Name>";                 GIT_AUTHOR_NAME="<New Name>";                 GIT_COMMITTER_EMAIL="<New Email>";                 GIT_AUTHOR_EMAIL="<New Email>";                 git commit-tree "$@";         else                 git commit-tree "$@";         fi" HEAD 
vote vote

60

It happens when you do not have a $HOME/.gitconfig initialized. You may fix this as:

git config --global user.name "you name" git config --global user.email you@domain.com git commit --amend --reset-author 

Tested with git version 1.7.5.4.

Note that this fixes only the last commit.

Top 3 video Explaining version control - How to change the author and committer name and e-mail of multiple commits in Git?

Related QUESTION?