Remove all commits by author

天大地大妈咪最大 提交于 2019-12-06 02:37:13

问题


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?


回答1:


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):

  • --author "name"
    Limit the commits output to ones with author/committer header lines that match the specified pattern (regular expression). With more than one --author=, commits whose author matches any of the given patterns are chosen (similarly for multiple --committer=).
  • --invert-grep
    Limit the commits output to ones with log message that do not match the pattern specified with --grep=
  • --reverse Output the commits in reverse order. […]
  • --format="format:%H" Use a custom format, in this case only the commit hash



回答2:


You can do it directly with a filter-branch. What you can do is to create a new branch with the desired start point and then using filter branch do a cherry-pick to the desired commit leaving out the unwanted ones.

Then in your new branch you will have all the commits without the ones made by a given author.

git cherry-pick support a range so you can save the last "good" commit and than add a range of commits instead of a single one.

Another way is to do a git revert but revert will leave the original commits in place and will just undo the changes made under the original commit.



来源:https://stackoverflow.com/questions/39232800/remove-all-commits-by-author

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!