Table of Contents
Force Rewrite Commit Authorship History Using Git Command Line
Have you ever been working in a git repo and pushed your changes, only to realize later on that you were committing as the wrong author, possibly because you sometimes use multiple user names in your GitHub app? In this post, we’re going to look at how to forcibly rewrite the commit authorship history in a git repo using git from the command line.
Finding The Commit In History After Which You’d Like To Change Authorship
The first thing we’re going to do is go to our repository on GitHub.com so we can browse the commit history.
As we can see in the commit history, the top four commits (inside the red box) have the incorrect commit author listed. Let’s copy the SHA of the commit JUST BEFORE (one below) the first commit with the incorrect author by clicking on the copy button next to the SHA.
Using PowerShell To Interact With The Git Repo
In this example, we’re going to use PowerShell, but any other terminal will work just as well. In Windows Explorer, navigate to the local git repo on your computer. Once in the repo root directory, hold Shift and then right click on any white area in the Window. Choose PowerShell from the context menu. This will open up PowerShell in the repo root directory. The first thing we want to do here is change the global user.name and user.email to the correct author we want to use to rewrite the commit authorship history. This is achieved using the following commands:
$ git config --global user.name "Daniel Koman" $ git config --global user.email "dankoman30@gmail.com"
Next, we’ll use another command to reset the author of all commits after a specific commit in history. Using the commit SHA you copied to your clipboard previously, enter the following command (replacing my commit SHA with the one you copied):
$ git rebase -i d62e3b221b69d110a0df54849e7b9132ac80aed7 -x "git commit --amend --reset-author -CHEAD"
The Rebase Review Screen
After pressing Enter to execute the previous command, we’re presented the following screen:
It might look a little intimidating, but this is simply a screen to review the changes about to be made via rebase. As we can see from the screenshot, the final 4 commits in history are being rebased. This is exactly what we want, so let’s proceed.
Next, we’re going to press Ctrl + C on the keyboard. This will give us the ability to input command text into the bottom line of the review screen, as seen below:
Let’s type :wq here (which is an abbreviation for Write and Quit, in case you were wondering), then press Enter to confirm all of the changes in the review screen. After successfully rebasing the commit history, we’re brought back to the main terminal, where we can see the changes that have been made in the local repo:
Now our local repository is exactly as we want it, with the global user.name and user.email set as the commit author for the commits in question. We’re not done yet, though, as we still need to push our changes to the remote repository on GitHub.
Force Pushing The Local Repo To Overwrite The Commit History On The Remote Repo
To force push our changes and rewrite the remote repo, let’s enter the following command in the terminal:
$ git push --force
The –force argument is key here, as this command will forcibly overwrite the commit history in the remote repo with the commit history from our local repo. Force pushing is dangerous, as it will literally overwrite our commit history in the remote repo on GitHub, so be sure you actually want to do this before proceeding! Backing up your remote repo first may be pertinent if you’re worried about this.
After entering this command, we can see our changes being successfully written to the remote:
That’s it! We’ve successfully changed the commit author for all of the commits in question, as evidenced by navigating back to our repo on GitHub and examining the commit history:
The rewritten commits all have new SHAs, and our commit history now was the correct authorship!