Where’s my commit after I did
git commit --amend?
git commit --amend comes handy if one wants changes in a previous
commit or simply want to change a commit message but this results into
push errors and an extra over-head of a merge-commit. In this post,
lets go through the process.
Say I have three commit in my master branch but I’m not satisfied with the last commit message.
I changed the commit message using the command.
git commit --amend -m 'Attack plan-2'
and tried to push the changes. Soon I’ll encountered an error(see image below). Something is not right. The remote server is not accepting my changes. It says my local commits are not in-sync with the remote commits. But what did I do? I just changed a commit message.
If I check the commit logs(see image below), I see my updated message. This was expected. But what exactly went wrong?
If I closely examine the commit hash of HEAD before and after the amendment, I can see it has changed.
- Before amend:
- After amend :
Which clearly means that amend changed the hash and now my local and remote differs. My remote still has that old hash(with old commit message) but HEAD’s commit hash has changed.
This also means that I lost my old hash and that is now over-written by a brand-new commit.
Below commands can be really handy:
Check local commit
Check remote commit
git log origin
View both local and remote(origin) logs all-together
git log origin master
With the last command, I can see local commits plus the lost commit(which still exits on the remote). Below figure can explain the scenario in a better way.
In order to push, I first need to pull that lost commit from remote. A simple
git pull origin master
should do the trick(image below).
If I check the commit logs, I see my lost commit is in place just below the changed message commit.
But there’s one extra commit, a merge-commit as HEAD(see figure below)
Now I can safely push to the remote as the lost commit exist in my local commit log.
Which should sync local & remote repos(figure below)
PS: If you want to avoid a merge-commit, Git provides an excellent
way to achieve it via git-rebase. What it typically does is it
rolls-up all the latest commits on the top of all the previous
commits. Behind the curtains
git-rebase completely re-writes the
history. As the matter of fact one should never rebase commits that
have been pushed to a public.