gitgit-filter

Remove all commits by author


How do I remove all commits by certain author (committed by mistake - such an author should not be visible in the commits history).

I have found some code to rename -

git filter-branch --env-filter '
OLD_EMAIL="old@gmail.com"
CORRECT_NAME="name"
CORRECT_EMAIL="new@gmail.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


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

Is there some filter not to rename but remove such commits?


Solution

  • You can do it like this:

    1. Create a new branch based on the commit you want to start with:

      git checkout -b <branch-name> <base-commit>
      
    2. Cherry-pick all commits that don’t have the matching author:

      git log --author "<name>" --invert-grep --reverse --format="format:%H" HEAD..master | xargs git cherry-pick
      

    The log filters out all commits made by the author and then cherry-picks them one after one.

    Explanation for the parameters (partly quoted from git log manpage):