- Clone the repo.
- Use
git rebase -i --root
- vim will open. Select the commits you want to modify by changing
pick
to edit
. If you would like to change all the commits, perform the following replace: :%s/^pick/edit/g
. This command changes all instances of "pick" at the start of lines to "edit".
- You will now be shown all the selected commits one by one. Each commit message will be displayed. You have two options:
- If you would like to keep the commit author details the same, do a
git rebase --continue
.
- If you would like to change it to a different name/email, do
git commit --amend --reset-author
. If --reset-author
is specified, it will use the details from your git config. (If you need to specify an alternate name/email, you can do so with --author="John Doe <john@example.com>"
. If you would like to change the time to a previous date, you can do so with --date "2 days ago"
.)
- Do the same for all the commits and finish the rebase.
- Perform
git push -f origin master
to force push all the changes to upstream, and verify everything is correct.
- Now the commit history would say "X authored, Y commited" for all the commits you did not modify. To fix this, run the following git-filter command:
git filter-branch --env-filter '
OLD_EMAIL="old@email.com"
OLD_NAME="oldusername"
NEW_EMAIL="newemail@example.com"
# If the committer is updated but author isn't, set them both to author's name/email
if [ "$GIT_COMMITTER_EMAIL" = "$CORRECT_EMAIL" ] && [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_COMMITTER_NAME="$OLD_NAME"
export GIT_COMMITTER_EMAIL="$OLD_EMAIL"
export GIT_AUTHOR_NAME="$OLD_NAME"
export GIT_AUTHOR_EMAIL="$OLD_EMAIL"
fi
- Now the
"X authored, Y commited"
problem will be fixed. However, this will also update the dates again. To fix that, run the following:
git filter-branch --env-filter 'export GIT_COMMITTER_DATE="$GIT_AUTHOR_DATE"' -f
- Finally, force-push again:
git push -f origin master
🎉
Very useful!
Keep up the good work!