Several months ago I committed some code in my GitHub repository, but I did it from a temporary system. If I registered my authentication keys correctly to commit stuff, I forgot to create a minimal
~/.gitconfig
file with the right stuff in it.
The result was not good looking, as my usual name and mail address were not attached to the commit:
Let’s fix this!
First, get a local copy of the remote Git repository:
$ git clone [email protected]:kdeldycke/kev-code.git
What was missing in my
~/.gitconfig
file were the following options:
[user]
name = Kevin Deldycke
email = [email protected]
These values can be set with Git command line with the following syntax:
--author 'user.name <user.email>'
The commit I want to change is the latest in history, so I’ll use the
--amend
directive to make my changes. Putting all things together, our final command becomes:
$ git commit --amend --author 'Kevin Deldycke <[email protected]>'
After this, here is how the local branches looks like in gitg :
Using the
git
log
-n1
command, we can compare the old commit:
commit 81a26f03901918ed4a954d964b2659187f1cc988
Author: kevin <kevin@laptop-kev.(none)>
Date: Mon Mar 8 22:49:43 2010 +0100
Update old shop logo with the brand new one
with the new one:
commit adf4620f3d8a89746dd643dcefc3f900f0f69878
Author: Kevin Deldycke <[email protected]>
Date: Mon Mar 8 22:49:43 2010 +0100
Update old shop logo with the brand new one
Notice the fixed authorship. The commit ID was also updated as it’s just a hash depending on commit metadata.
Now we can push our changes back to the remote repository:
$ git push origin
But this doesn’t work and throw the following error:
To [email protected]:kdeldycke/kev-code.git
! [rejected] master -> master (non-fast forward)
error: failed to push some refs to '[email protected]:kdeldycke/kev-code.git'
This is Git protection mechanism in action. Modifying already-published commits like this is a bad idea . It can break updates of other developers’ repository (if they already have pulled the commit we’re trying to change).
In our case we will force the remote repository to take our changes:
$ git push origin +master:master
As I told you before this is bad, but nobody really cares: I’m the only person working on this repository! ;)
Finally, you can contemplate the result on GitHub, a clean and tidy commit history: