How to amend several commits in Git to change author

前端 未结 6 985
逝去的感伤
逝去的感伤 2020-11-28 17:14

I have made a series of commits in Git and I realise now that I forgot to set my user name and user email properties correctly (new machine). I have not yet pushed these co

相关标签:
6条回答
  • 2020-11-28 17:41

    This method was documented by GitHub for this very purpose (though GitHub has since removed it). The steps are:

    1. Open the terminal and make a bare clone of your repo
    git clone --bare https://github.com/user/repo.git
    cd repo
    
    1. Edit the following script (replacing OLD_EMAIL, CORRECT_EMAIL, and CORRECT_NAME)
    #!/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
    
    1. Copy/paste the script into your terminal and press enter to run it.
    2. Push your changes with git push --force --tags origin 'refs/heads/*' and you're done!
    0 讨论(0)
  • 2020-11-28 17:46

    Rebase/amend seems inefficient, when you have the power of filter-branch at your fingertips:

    git filter-branch --env-filter 'if [ "$GIT_AUTHOR_EMAIL" = "incorrect@email" ]; then
         GIT_AUTHOR_EMAIL=correct@email;
         GIT_AUTHOR_NAME="Correct Name";
         GIT_COMMITTER_EMAIL=$GIT_AUTHOR_EMAIL;
         GIT_COMMITTER_NAME="$GIT_AUTHOR_NAME"; fi' -- --all
    

    (split across lines for clarity, but not necessary)

    Be sure to inspect the result when you're done, to make sure that you didn't change anything you didn't mean to!

    0 讨论(0)
  • 2020-11-28 17:50

    To change the author only for the last commit:

    git commit --amend --author 'Author Name <author.name@mail.com>' --no-edit
    

    Suppose you only want to change the author for the last N commits:

    git rebase -i HEAD~4 -x "git commit --amend --author 'Author Name <author.name@mail.com>' --no-edit"
    

    NOTES

    • the --no-edit flag makes sure the git commit --amend doesn't ask an extra confirmation
    • when you use git rebase -i, you can manually select the commits where to change the author,

    the file you edit will look like this:

    pick 897fe9e simplify code a little
    pick abb60f9 add new feature
    exec git commit --amend --author 'Author Name <author.name@mail.com>' --no-edit
    pick dc18f70 bugfix
    
    0 讨论(0)
  • 2020-11-28 17:54

    If you're feeling unsafe about debasing and amending you could do it this way. At the same time you'd also be setting the global config which you probably meant to do anyway.

    git reset HEAD~ (undo last commit)

    git config --global user.name "Your Name"

    git config --global user.email you@example.com

    git commit -m "message"

    0 讨论(0)
  • 2020-11-28 17:59

    I believe what you are looking for is git rebase --interactive

    It allows you to go reset to an specific commit and then go throw the history changing adding or grouping commits

    Here you have an explanation https://web.archive.org/web/20100213104931/http://blog.madism.org/index.php/2007/09/09/138-git-awsome-ness-git-rebase-interactive

    0 讨论(0)
  • 2020-11-28 18:04

    The interactive rebase approach is pretty nice when used in conjunction with exec. You can run any shell command against a specific commit or all commits in the rebase.

    First set your git author settings

    git config --global user.name "John Doe"
    git config --global user.email johndoe@example.com
    

    Then to reset the author for all commits after the given SHA

    git rebase -i YOUR_SHA -x "git commit --amend --reset-author -CHEAD"
    

    This will pop up your editor to confirm the changes. All you need to do here is save and quit and it will go through each commit and run the command specified in the -x flag.

    Per @Dave's comment below, you can also change the author while maintaining the original timestamps with:

    git rebase -i YOUR_SHA -x "git commit --amend --author 'New Name <new_address@example.com>' -CHEAD"
    
    0 讨论(0)
提交回复
热议问题